[아이템13] 이 거추장스러운 코드는 CloneNotSupportedException이 사실은 비검사 예외(unchecked exception)였어야 했다는 신호다.

2024. 7. 1. 19:00BOOKS/이펙티브 자바

@0verride 
public PhoneNumber clone() {
    try {
        return (PhoneNumber) super.clone();
    } catch (CloneNotSupportedException e) {
        throw new AssertionError(); // 일어날 수 없는 일이다.
    }
}
  1. Object의 clone() 메서드와 CloneNotSupportedException: 자바의 모든 객체는 Object 클래스를 상속하며, Object 클래스에는 clone() 메서드가 정의되어 있습니다. clone() 메서드를 호출하면 해당 객체를 복제하는 시도를 합니다. 그러나 clone() 메서드가 복제를 지원하지 않는 경우, 즉 해당 클래스가 Cloneable 인터페이스를 구현하지 않거나 clone() 메서드를 재정의하지 않는 경우, CloneNotSupportedException 예외가 발생합니다.
  2. Cloneable 인터페이스와 검사 예외 (Checked Exception): Cloneable 인터페이스는 복제를 지원하는 클래스에서 구현해야 하는 마커 인터페이스입니다. 그러나 이 인터페이스는 실제로 메서드를 선언하지 않으며, 단순히 클래스가 복제를 지원한다는 표시 역할을 합니다. 이 때문에 Cloneable을 구현한 클래스에서 clone() 메서드를 호출하더라도 CloneNotSupportedException 예외가 발생할 수 있습니다.
  3. "비 검사 예외 (Unchecked Exception) 였어야 했다"의 의미: 위의 코드에서 try-catch 블록을 사용하여 CloneNotSupportedException을 처리하고 있지만, 이 코드에서는 PhoneNumber 클래스가 Cloneable을 구현하고 있으므로 super.clone() 호출이 항상 성공할 것이라는 것을 알고 있습니다. 따라서 CloneNotSupportedException은 발생하지 않을 것이며, 이를 처리하는 코드는 불필요합니다.
  4. 따라서 "비 검사 예외 (Unchecked Exception) 였어야 했다"는 것은 CloneNotSupportedException은 사실은 예외 처리가 강제되지 않는 (검사되지 않는) 예외로 간주될 수 있다는 의미입니다. 즉, 예외 처리 코드를 작성하지 않아도 되는 예외로 간주할 수 있다는 것을 나타냅니다.

결론적으로, Cloneable을 구현한 클래스에서 clone() 메서드를 호출할 때 CloneNotSupportedException을 처리하는 것은 불필요한 예외 처리 부담을 줄이고 코드를 더 간결하게 만들 수 있습니다.