[아이템13] 이 거추장스러운 코드는 CloneNotSupportedException이 사실은 비검사 예외(unchecked exception)였어야 했다는 신호다.
2024. 7. 1. 19:00ㆍBOOKS/이펙티브 자바
@0verride
public PhoneNumber clone() {
try {
return (PhoneNumber) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // 일어날 수 없는 일이다.
}
}
- Object의 clone() 메서드와 CloneNotSupportedException: 자바의 모든 객체는 Object 클래스를 상속하며, Object 클래스에는 clone() 메서드가 정의되어 있습니다. clone() 메서드를 호출하면 해당 객체를 복제하는 시도를 합니다. 그러나 clone() 메서드가 복제를 지원하지 않는 경우, 즉 해당 클래스가 Cloneable 인터페이스를 구현하지 않거나 clone() 메서드를 재정의하지 않는 경우, CloneNotSupportedException 예외가 발생합니다.
- Cloneable 인터페이스와 검사 예외 (Checked Exception): Cloneable 인터페이스는 복제를 지원하는 클래스에서 구현해야 하는 마커 인터페이스입니다. 그러나 이 인터페이스는 실제로 메서드를 선언하지 않으며, 단순히 클래스가 복제를 지원한다는 표시 역할을 합니다. 이 때문에 Cloneable을 구현한 클래스에서 clone() 메서드를 호출하더라도 CloneNotSupportedException 예외가 발생할 수 있습니다.
- "비 검사 예외 (Unchecked Exception) 였어야 했다"의 의미: 위의 코드에서 try-catch 블록을 사용하여 CloneNotSupportedException을 처리하고 있지만, 이 코드에서는 PhoneNumber 클래스가 Cloneable을 구현하고 있으므로 super.clone() 호출이 항상 성공할 것이라는 것을 알고 있습니다. 따라서 CloneNotSupportedException은 발생하지 않을 것이며, 이를 처리하는 코드는 불필요합니다.
- 따라서 "비 검사 예외 (Unchecked Exception) 였어야 했다"는 것은 CloneNotSupportedException은 사실은 예외 처리가 강제되지 않는 (검사되지 않는) 예외로 간주될 수 있다는 의미입니다. 즉, 예외 처리 코드를 작성하지 않아도 되는 예외로 간주할 수 있다는 것을 나타냅니다.
결론적으로, Cloneable을 구현한 클래스에서 clone() 메서드를 호출할 때 CloneNotSupportedException을 처리하는 것은 불필요한 예외 처리 부담을 줄이고 코드를 더 간결하게 만들 수 있습니다.
'BOOKS > 이펙티브 자바' 카테고리의 다른 글
[아이템12] 하위 클래스들이 공유해야 할 문자열 표현이 있는 추상 클래스라면 toString을 재정의해줘야 한다. (0) | 2024.07.01 |
---|---|
[아이템12] 정적 유틸리티 클래스는 toString을 제공할 이유가 없다. (0) | 2024.07.01 |
[아이템8] finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다. (0) | 2024.07.01 |
[아이템3] 직렬화된 인스턴스를 역직렬화할 때마다 새로운 인스턴스가 만들어진다. (0) | 2024.07.01 |
[아이템1] 자바 8부터는 인터페이스가 정적 메서드를 가질 수 없다는 제한이 풀렸기 때문에 인스턴스화 불가 동반 클래스를 둘 이유가 별로 없다. (0) | 2024.07.01 |