🔷 예외 처리
🔸 예외 (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없이 사용할 수 없다
- 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)
🔹 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)
✔ 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