응용 프로그램 실행 오류가 발생하는 것을 에러라고 한다.
사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류는 예외라고 한다.
예외는 예외 처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 한다.
자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다. 모든 예외 클래스들은 java.lang.Exception 클래스를 상속 받는다.
예외에는 일반 예외(Exception)과 실행 예외(Runtime Exception)이 있다.
컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문이다. 예외 처리 코드가 없다면 컴파일 오류가 발생한다.
컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다.
자바 컴파일러가 체크 하지 않기 때문에 개발자가 예외 처리 코드를 삽입해야 한다.
실행 예외에 대해 예외 처리 코드가 없을 때 해당 예외가 발생하면 프로그램은 종료된다.
객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체를 사용하면 예외가 발생한다.
배열에서 인덱스 범위를 초과하여 사용할 경우 발생한다.
toString()은 자바의 최상위 클래스인 Object의 메소드이다.
Object 클래스의 toString()은 해시코드로 리턴을 한다. Object 하위 클래스는 toString() 메소드를 재정의(오버라이딩)하여 리턴한다.
- java.util 패키지의 Date 클래스는 toString()을 재정의하여 현재 시스템의 날짜와 시간 정보를 리턴한다.
- String 클래스는 toString()을 재정의해서 저장하고 있는 문자열을 리턴한다
System.out.println() 의 매개값이 기본 타입일 경우, 해당 값을 그대로 출력하지만, 객체일 경우 객체의 toString() 메소드를 호출해서 리턴받아 출력한다.
원본 객체를 안전하게 보호하기위해 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것이다.
필드값을 복사해서 객체를 복제하는 것이다.
원본 객체는 java.lang.Cloneable 인터페이스를 구현하고 있어야 한다.
참조 타입 필드의 얕은 복제는 번지만 복제되기 때문에 원본 객체와 같은 객체를 참조한다.
참조하고 있는 객체도 복제하는 것이 깊은 복제이다.
Object의 clone() 메소드를 재정의해서 참조 객체를 복제하는 코드를 직접 작성해야 한다.
java.util.Objects
객체 비교, 해시코드 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행하는 정적 메소드들로 구성되어있다.
T a, T b, Comparator<T> c)a,b 두 객체를 비교자(Comparator)를 이용해서 비교하여 int 값을 리턴한다.
java.util.Comparator는 제네릭 인터페이스 타입으로 두 객체를 비교하는 compare(T a, T b) 메소드가 정의되어 있다.
public interface Comparator<T> {
int compare(T a, T b);
}
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student a, Student b) {
if (a.sno < b.sno) return -1;
else if (a.sno == b.sno) return 0;
else return 1;
}
}
int result = Objects.compare(s1, s2, new StudentComparator());
두 객체 모두 null 일 경우 true
Objects.deepEquals(Object a, Object b) → a,b 서로 다른 배열일 경우, 항목 값이 모두 같다면 true 리턴
예외(Exception)와 에러(Error)를 같은 것으로 알고 있었는데, 서로 다른 개념이라는 점이 인상 깊었다. 반면, 객체 비교에 대해서는 아직 완전히 이해되지 않아 더 학습이 필요하다고 느꼈다.