• Home
  • About
    • ming photo

      ming

      studying

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Archive
    • All Posts
    • All Tags
    • All categories
  • categories
    • HTML+CSS+JavaScript
    • JAVA
    • Algorithm
    • DB
    • JSP
    • 정보처리기사
    • Spring
    • Thymeleaf
    • 기술면접
  • Projects

JAVA-예외처리,java.lang패키지-object/string

18 Feb 2021

🔷 예외 처리

🔸 예외 (Exception) : 사용자의 잘못된 조작 OR 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류

- 일반예외 : 컴파일러 체크 예외, 자바 소스컴파일 과정에서 해당 예외 처리 코드가 있는지 검사하게 된다
- 실행예외 : 개발자의 경험에 의해 예외처리,실행시 예츨할 수 없이 갑자기 발생하기에 컴파일 과정에서 예외처리 코드를 검사하지 않는다 🔸 예외처리 : 예상되는 오류에 대한 방어 코드를 작성하는 것
  • 코드
      package com.javateam.jse;
    
      public class ExceptionEx1 {
    
          public static void main(String[] args) {
                
              // java.lang.ArithmeticException: / by zero : 예외처리 메세지 => 0으로 나누어서 생겼다
              // JRE(JVM) 자체적인 예외처리 운영
                
              int result = 0;
              int num1 = 2;
              int num2 = 0;
    
              Object obj = null; //객체 제대로 생성안됨 => 값이 null
                
              // try - catch 으로 예외처리 
              try {
                  // NullPointerException 발생 => 아래에서 이중으로 처리
                  System.out.println("name : " + obj.getClass().getName()); // 객체가 제대로 생성되지 않은 상태에서 멤버 호출
    
                  result = num1 / num2; // 예외 발생 영역
              } catch(ArithmeticException e) { // 조치 , e => 주로 많이쓴다.(Exception)
                  // "e" 라는 예외처리 객체가 자동생성 된다
                    
                  ////// 에러 메시징(messaging) /////
                  e.printStackTrace(); 
                   // 가장 자세한 에러로그(error log) 출력된다
                    
                  System.out.println("e : " + e);
                  System.out.println("e : " + e.toString());
                  // e : java.lang.ArithmeticException: / by zero 출력된다
                            
                  System.out.println("e.getMessage() : " + e.getMessage());
                  //e.getMessage() : / by zero 출력 => 에러 메세지만 출력
                    
                  System.err.println("e : " + e.toString());
                  // 적색(red)으로 로그(log) 출력          
                    
                  // 사용자 에러 메세징
                  System.out.println("0나누셨습니다. 나누는수를 1로 설정하였습니다.");
                    
                  // 대응 구문 작성
                  num2 = 1; // 문제가 되는 num2의 값을 1로 주어서
                  result = num1 / num2; // 다시 계산
                    
                  // 출력
                  // e : java.lang.ArithmeticException: / by zero
                  // 0나누셨습니다. 나누는수를 1로 설정하였습니다.
                  // result : 2 
    
                  // catch 이중 처리 : ArithmeticException 가 처리못한걸 처리해준다
                  //} catch(Exception e) { // NullPointerException 처리 
                  } catch(NullPointerException e) { // NullPointerException 처리 => 명확하게 설정
    
                      System.out.println("에러 : " + e);
                        
                      //대응 구문
                      obj = new Object();
                      System.out.println("name : " + obj.getClass().getName());
                    			
                  // 예외처리 마무리
                  } finally {
                      // 예외 발생과 무관하게 실행된다 : ex) 마무리 처리 부분, 자원반납(resource closing)
                      System.out.println("예외처리 마무리");	
                  }            
                      System.out.println("result : " + result);
              }
    
          }
    
  • try catch 이중 작성 다른예
      package com.javateam.jse;
    
      public class ExceptionEx2 {
    
          public static void main(String[] args) {
                
              // java.lang.ArithmeticException: / by zero : 예외처리 메세지 => 0으로 나누어서 생겼다
              // JRE(JVM) 자체적인 예외처리 운영
                
              int result = 0;
              int num1 = 2;
              int num2 = 0;
                
              Object obj = null; //객체 제대로 생성안됨 => 값이 null
            
              // try - catch 으로 예외처리 
              try {
                    
                  // NullPointerException 발생
                  // 이중 작성
                  try {System.out.println("name : " + obj.getClass().getName()); // 객체가 제대로 생성되지 않은 상태에서 멤버 호출
                    
                  }catch(NullPointerException e) { // NullPointerException 처리 => 명확하게 설정
    
                          System.out.println("에러 : " + e);
                            
                          //대응 구문
                          obj = new Object();
                          System.out.println("name : " + obj.getClass().getName());
                  }
                    
                  result = num1 / num2; // 예외 발생 영역          
                    
              } catch(ArithmeticException e) { // 조치 , e => 주로 많이쓴다.(Exception)
                  // "e" 라는 예외처리 객체가 자동생성 된다
                    
                  // 사용자 에러 메세징
                  System.out.println("0나누셨습니다. 나누는수를 1로 설정하였습니다.");
                    
                  // 대응 구문 작성
                  num2 = 1; // 문제가 되는 num2의 값을 1로 주어서
                  result = num1 / num2; // 다시 계산
                    
                            
                  // 예외처리 마무리
                  } finally {
                      // 예외 발생과 무관하게 실행된다 : ex) 마무리 처리 부분, 자원반납(resource closing)
                      System.out.println("예외처리 마무리");						
              }
                      System.out.println("result : " + result);
          }
    
      }
    
  • throws사용 예외처리
      package com.javateam.jse;
    
      public class ExceptionEx5 {
    
          public static void main(String[] args) throws NullPointerException,ArithmeticException{
                
              // throws : 메서드 단위로 예외처리 		
              int result = 0;
              int num1 = 2;
              int num2 = 0;
                
              Object obj = null; //객체 제대로 생성안됨 => 값이 null
                        
                  if( obj == null) {
                      throw new NullPointerException("인스턴스가 생성되지 않았습니다");
                  }
                  System.out.println("name : " + obj.getClass().getName()); // 객체가 제대로 생성되지 않은 상태에서 멤버 호출
                    
                  if(num2 ==0) {
                      throw new ArithmeticException("0나누셨습니다. 나누는수를 1로 설정하였습니다.");
                  }
                                       
                  // 대응 구문 작성
                  result = num1 / num2; // 다시 계산
                    
                            
          }
    
      }
    

🔷 java.lang 패키지

❗ java.lang 패키지는 자바 프로그램의 기본적인 클래스를 담은 패키지 이다 => 클래스와 인터페이스는 import없이 사용할 수 없다 java lang

  • API : 라이브러리, 프로그램 개발에 자주 사용되는 클래스 및 인터페이스 모음 => API 도큐먼트로 원하는 API 쉽게 찾아 이용할 수 있다

✔ Object 클래스

* 객체 비교 : equals()
    - equals() 메소드의 매개 타입은 Object로, 모든 객체가 매개값으로 대입될 수 있다
    - 메소드는 비교 연산자인 ==와 동일 결과 리턴
    - 두 객체가 논리적으로 동등하면 true를, 그렇지 않으면 false 리턴
    - 매개값이 기준 객체와 동일 타입 객체인지 먼저 확인 필요

* 객체 해시코드 : hashCode() 
    - 객체를 식별하는 하나의 정수값
    - 객체 메모리 번지 이용하여 해시코드 만들어 리턴 객체마다 다른 값 가짐
    - 두 객체가 동등한지 비교 필요

* 객체 문자 정보 : toString()
    - 객체의 문자 정보 리턴
    - Object의 하위 클래스는 toString() 메소드 재정의하여 간결하고 유익한 정보 리턴

* 프로그램 종료 : exit()
    - exit() 메소드 호출하여 JVM을 강제 종료
    - exit() 메소드가 지정하는 int 매개값을 종료 상태값이라 한다

* 현재 시각 읽기 : currentTimeMillis(), nanoTime()
    - System 클래스의 currentTimeMillis() 및 nanoTime() 메소드로 각기 1/1000초 및 10/10^9 단위 long 값 리턴

🔹 toString 오버라이딩

* toString 오버라이딩 의 목적
    1) 객체 호출 -> 객체.toString 동일한 의미 : 코드가 간결해진다
    2) Object.toString 오버라이딩 -> 
        - 용도 : 객체 고유값 확인 < 객체 "내용(멤버 필드들)"을 확인 변경
    3) toString : 메서드의 이름의 의미 
        - 문자열(객체의 멤버 필드들의 내용을)로 변경(출력)하다 
  • 코드 (오버라이딩)
      package com.javateam.jse;
    
      public class MemberVO {
            
          // 필드 생성
          private String id;
          private String pw;
          private String name;
          private String address;
            
            
          // 기본생성자 생성
          public MemberVO() {
                
          }
            
          // 오버로딩 생성사 생성
          public MemberVO(String id, String pw, String name, String address) {
              // super();
              this.id = id;
              this.pw = pw;
              this.name = name;
              this.address = address;
          }
    
          // getter,setter생성 => 메소드 생성
          public String getId() {
              return id;
          }
          public void setId(String id) {
              this.id = id;
          }
          public String getPw() {
              return pw;
          }
          public void setPw(String pw) {
              this.pw = pw;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public String getAddress() {
              return address;
          }
          public void setAddress(String address) {
              this.address = address;
          }
    
          // ** toString 오버라이딩은 한번밖에 안됨! 아래 코드들은 출력할 수 있는 오버라이딩 종류 전부다 try한것
    
          // toString 오버라이딩 (Custom)
          @Override
          public String toString() {
              return String.format("id=%s, pw=%s, name=%s, address=%s", id, pw, name, address);
          }
                
          // toString 오버라이딩 (format)
      	@Override
      	public String toString() {
      		return String.format("MemberVO [id=%s, pw=%s, name=%s, address=%s]", id, pw, name, address);
      	}
    
            
            
          // toString 오버라이딩 (builder chained) 
      	@Override
      	public String toString() {
      		StringBuilder builder = new StringBuilder();
      		builder.append("MemberVO [id=").append(id).append(", pw=").append(pw).append(", name=").append(name)
      				.append(", address=").append(address).append("]");
      		return builder.toString();
      	}
    
          // toString 오버라이딩 (builder)
      	@Override
      	public String toString() {
      		StringBuilder builder = new StringBuilder();
      		builder.append("MemberVO [id=");
      		builder.append(id);
      		builder.append(", pw=");
      		builder.append(pw);
      		builder.append(", name=");
      		builder.append(name);
      		builder.append(", address=");
      		builder.append(address);
      		builder.append("]");
      		return builder.toString();
      	}
    
          // toString 오버라이딩(concatenation)=> getter를 여러번 쓰는것과 같은 효과
      	@Override
      	public String toString() {
      		return "MemberVO [id=" + id + ", pw=" + pw + ", name=" + name + ", address=" + address + "]";
      	}
      }
    
  • 코드(테스트)
      package com.javateam.jse.test;
    
      import com.javateam.jse.MemberVO;
    
      public class VOTest {
            
          public static void main(String[] args) {
                
      //		MemberVO member = new MemberVO(); // 객체생성 
                
              // VO 입력
      //		member.setId("java");
      //		member.setPw("1234");
      //		member.setName("자바");
      //		member.setAddress("가산");
                
              MemberVO member = new MemberVO("java","1234","자바","가산"); // 위와 동일 (사용 잘 안한다)
                
              // VO 출력
              // System.out.println("id : " +member.getId());
                
              // VO 일괄 출력
              // toString 오버라이딩 의 목적
              // 1) 객체 호출 -> 객체.toString 동일한 의미 : 코드가 간결해진다
              // 2) Object.toString 오버라이딩 -> 
              //	- 용도 : 객체 고유값 확인 < 객체 "내용(멤버 필드들)"을 확인 변경
              // 3) toString : 메서드의 이름의 의미 
              // 	- 문자열(객체의 멤버 필드들의 내용을)로 변경(출력)하다 
              System.out.println(member);
              // System.out.println(member.toString()); // 위와 동일한 의미
    
          }
    
      }
    

▶ 출력 결과창(Console) toString

🔹 hashCode,equals 오버라이딩

  • 목적은 toString과 같다

  • 코드 (오버라이딩)
      package com.javateam.jse;
    
      import java.util.Objects;
    
      public class MemberVO {
            
          // 필드 생성
          private String id;
          private String pw;
          private String name;
          private String address;
            
            
          // 기본생성자 생성
          public MemberVO() {
                
          }
            
          // 오버로딩 생성사 생성
          public MemberVO(String id, String pw, String name, String address) {
              // super();
              this.id = id;
              this.pw = pw;
              this.name = name;
              this.address = address;
          }
    
          // getter,setter생성 => 메소드 생성
          public String getId() {
              return id;
          }
          public void setId(String id) {
              this.id = id;
          }
          public String getPw() {
              return pw;
          }
          public void setPw(String pw) {
              this.pw = pw;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public String getAddress() {
              return address;
          }
          public void setAddress(String address) {
              this.address = address;
          }
    
          // hashCode() 오버라이딩1)  => 멤버 필드 비교
          @Override
          public int hashCode() {
              return Objects.hash(address, id, name, pw);
          }
          // hashCode() 오버라이딩1)  => 멤버 필드 비교
          @Override
          public boolean equals(Object obj) {
              if (this == obj)
                  return true;
              if (obj == null)
                  return false;
              if (getClass() != obj.getClass())
                  return false;
              MemberVO other = (MemberVO) obj;
              return Objects.equals(address, other.address) && Objects.equals(id, other.id)
                      && Objects.equals(name, other.name) && Objects.equals(pw, other.pw);
          }
    
            
          // hashCode() 오버라이딩2)  => 멤버 필드 비교
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + ((address == null) ? 0 : address.hashCode());
              result = prime * result + ((id == null) ? 0 : id.hashCode());
              result = prime * result + ((name == null) ? 0 : name.hashCode());
              result = prime * result + ((pw == null) ? 0 : pw.hashCode());
              return result;
          }
    
          // hashCode() 오버라이딩2) => 멤버 필드 비교
          @Override
          public boolean equals(Object obj) {
              if (this == obj) {
                  return true;
              }
              if (!(obj instanceof MemberVO)) {
                  return false;
              }
              MemberVO other = (MemberVO) obj;
              if (address == null) {
                  if (other.address != null) {
                      return false;
                  }
              } else if (!address.equals(other.address)) {
                  return false;
              }
              if (id == null) {
                  if (other.id != null) {
                      return false;
                  }
              } else if (!id.equals(other.id)) {
                  return false;
              }
              if (name == null) {
                  if (other.name != null) {
                      return false;
                  }
              } else if (!name.equals(other.name)) {
                  return false;
              }
              if (pw == null) {
                  if (other.pw != null) {
                      return false;
                  }
              } else if (!pw.equals(other.pw)) {
                  return false;
              }
              return true;
          }
    
      }
    
  • 코드(테스트)
      package com.javateam.jse.test;
    
      import com.javateam.jse.MemberVO;
    
      public class VOTest2 {
    
          public static void main(String[] args) {
                
              MemberVO member1 = new MemberVO("java","1234","자바","가산");
              MemberVO member2 = new MemberVO("java","1234","자바","가산");
                
              // 두 객제들 간의 (모든) 멤버 필드들의 값 비교
              // ex) 두 객체의 기존값과 신규값의 비교 
              // 회원 정보 수정시 : 수정 정보 == 기존 정보 => DB 수정 여부 결정(수정 불필요)
              // => 효과 ) DB 사용량(돈) 절약된다
                
              // equals 비교
              System.out.println(member1.equals(member2));
                
              // hashCode 비교
              System.out.println(member1.hashCode());
              System.out.println(member2.hashCode());
          }
    
      }
    

    ▶ 출력 결과창(Console) hash,equls

✔ String 클래스

  • String 처리 종합예제

      package com.javateam.jse;
    
      /*
      * 문자열(String) 처리 종합 예제
      */
      public class JavaString {
    
          public static void main(String[] args) {
              String str1 = "Java 자바 "; // 마지막에 공백문자 있음에 주의할 것!
              String str2 = "Java 개발자"; // String str2 = new String("Java 개발자"); 와 동일한 구문
              String str3;
              /* 문자열 비교(1) 
              * 주의사항) 영문일 경우는 대소문자 구분함
              * equals
              */
              System.out.println("문자열 비교(1) : " + (str1.equals(str2)));
              System.out.println("문자열 비교(1) : " + ("Hello".equals("hello")));
              /* 문자열 비교(2) 
              * 주의사항) 영문일 경우는 대소문자 구분함
              * == 연산자
              */
              System.out.println("문자열 비교(2) : " + (str1 == str2));
              System.out.println("문자열 비교(2) : " + ("Hello" == "hello") );
              /* 문자열 비교(영문자 대소 구분하지 않음)
              * equalsIgnoreCase
              */
              System.out.println("영문 문자열 대소문자 구분없이 비교 : "+ "Hello".equalsIgnoreCase("hello"));
              // 참고로 == 연산자는 변수가 참조하는 "메모리 주소"로 비교하고
              // equals는 선언된 변수"값"으로 구분한다.
              /* 문자열을 constant pool에 등록한다.
              * 이미 상수풀(constant pool)에 같은 내용의 문자열이 있을 경우
              * 그 문자열의 메모리 주소값을 반환. 
              * intern()
              */
              String s1 = new String("abcd");
              String s2 = new String("abcd");
              System.out.println(" == 연산자 : " + (s1==s2)); // 값이 아닌 "주소값"으로 비교한다.
              System.out.println(" equals 메소드 : "+ s1.equals(s2)); // "값"으로 비교한다.
              System.out.println(" intern 메소드 : "+ (s1.intern() == s2.intern())); // 이 코드에서는 "메모리 주소값"끼리 비교한다.
                
              // 문자열 병합(1)
              str3 = str1+str2;
              System.out.println(str3);
              /* 문자열 병합(2)
              * concat
              */
              str3=str1.concat(str2);
              System.out.println(str3);
              /* 문자열의 길이를 반환한다.
              * 주의사항) 공백(" ")도 문자열의 길이에 포함됨.
              * length
              */
              System.out.println("문자열의 길이 : " + str3.length());
              // ** lenght => 배열의 길이 , lenght() => 문자열의 길이
              /* 지정된 문자열로 끝나는지 여부 반환
              * endsWith
              */
              System.out.println("개발자로 끝나는지 여부 : " + str3.endsWith("개발자"));
              /* 특정 위치에 있는 문자 반환
              * 주의사항) 순서(index)는 배열처럼 0부터 시작함
              * charAt
              */
              System.out.println("3번째 있는 문자 : " + str3.charAt(3));
              /* 특정 문자열 모두 교체(변경)
              * 위에서 병합된 str3에서 공백(" ")을 ","로 변경
              * replaceAll 
              */
              str3 = str3.replaceAll(" ", ", ");
              System.out.println(str3);
              /* 문자열을 ","를 기준으로 각각 분리하여 배열에 할당(입력) 
              * split
              */
              String[] arr = str3.split(",");
              for (int i=0; i<arr.length;i++) {
              System.out.println("분리된 문자열: " + arr[i]);
              }
              /* 특정 문자열로 시작하는 지 검색
              * startWith
              */
              boolean b = str3.startsWith("임");
              System.out.println(b);
              /* 특정 위치에 있는 문자열 추출(subtract) 
              * 주의사항) 순서(index)는 배열처럼 0부터 시작한다.
              * 그리고 end(끝) 성분은 포함하지 않는다.
              * substring
              */
              System.out.println("3~9번째 까지의 문자열 : " + str3.substring(3,10));
              /* 특정 문자/문자열 검색 
              * 찾지 못하면 -1 결과값 반환
              * indexOf
              */
              System.out.println("찾을 문자열 : 개발자 : " 
              + ((str3.lastIndexOf("개발자") == -1) ? "못찾았음" : "찾았음"));
              System.out.println("찾을 문자열 : 래 : " 
              + ((str3.lastIndexOf("래") == -1) ? "못찾았음" : "찾았음"));
              /* 좌우 공백 제거
              * 주의사항) 중간 공백은 없앨 수 없다. 다만 문자열 처음과 끝의 공백을 없앤다.
              * trim
              */
              str3 = " 자바 개발자 ";
              System.out.println("좌우 공백을 없앤 문자열 : "+str3.trim());
              /* 대소문자 상호 변환
              * toLowerCase / toUpperCase
              */
              s1 ="abcde";
              s2 = "ABCDE";
              System.out.println("소문자를 대문자로 변환 : " + s1.toUpperCase());
              System.out.println("대문자를 소문자로 변환 : " + s2.toLowerCase());
          }
      } // end of class
    
    


Share Tweet +1