이장은 간단히 하고 넘어가겠다!
[책 규칙]
노란색 - 자세히 알아보고싶은 부분
초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)
빨간색 - 무슨말인지 모르겠는 부분
[아이템 13] clone 재정의는 주의해서 진행하라
실무에서 Cloneable을 구현한 클래스는 clone 메서드를 public으로 제공하며, 사용자는 당연히 복제가 제대로 이뤄지리라 기대한다.
이 기대를 만족시키려면 그 클래스와 모든 상위 클래스는 복잡하고, 강제할 수 없고, 허술하게 프로토콜을 지켜야만 하는데, 그 결과로 깨지기 쉽고, 위험하고, 모순적인 메커니즘이 탄생한다. 생성자를 호출하지 않고도 객체를 생성할 수 있게 되는 것이다.
Clone 메서드는 사실상 생성자와 같은 효과를 낸다. 즉, clone은 원본 객체에 아무런 해를 끼치지 않는 동시에 복제된 객체의 불변식을 보장해야 한다.
핵심정리
Cloneable이 몰고 온 모든 문제를 되짚어봤을 때, 새로운 인터페이스를 만들 때는 절대 Cloneable을 확장해서는 안 되며, 새로운 클래스도 이를 구현해서는 안 된다. final 클래스라면 Cloneable을 구현해도 위험이 크지 않지만, 성능 최적화 관점에서 검토한 후 변다른 문제가 없을 때만 드물게 허용해야 한다. 기본 원칙은 '복제 기능은 생성자와 팩터리를 이용하는 게 최고' 라는 것이다. 단, 배열만은 clone 메서드 방식이 가장 깔끔한, 이 규칙의 합당한 예외라 할 수 있다.
1. 아이템 개념
- clone() 메소드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다. 기존의 인스턴스의 값은 보존 하고 새로운 인스턴스를 만들어서 사용할 수 있다.
- 정리하자면
- 원본 객체의 필드 값과 동일한 값을 갖는 새로운 객체 생성
- 원본 객체를 안전하게 보호하기 위해 사용
- 깊은 복사를 위해서는 Cloneable인터페이스를 implement 하여 clone() 메소드 재정의
2. 필요한 이유
- 원본 객체를 안전하게 보호하기 위해서 이다.
3. 아이템 개념의 반대 개념이나 관련 개념
4. 실무에서는 어떤식으로 사용되는가 (실제 코드 사용예시)
// 가변 상태를 참조하지 않는 클래스용 clone 메서드
@Override
public PhoneNumber clone() {
try {
return (PhoneNumber) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); //일어날 수 없는 일이다.
}
}
// 가변 상태를 참조하는 클래스용 clone 메서드
@Override
public PhoneNumber clone() {
try {
Stack result = (Stack) super.clone();
result.elements = elements.clone();
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError(); //일어날 수 없는 일이다.
}
}
5. 장점
- 원본 객체를 보존할 수 있다.
6. 단점
- Cloneable 인터페이스를 구현하지 않으면 clone() 메소드를 호출할 때 CloneNotSupportedException 예외가 발생하므로 Cloneable 인터페이스가 구현된 클래스에서만 사용이 가능하다.
- 예외를 잡기 위해서는 try-catch 구문이 필요하다.
Java - 자바 Object 클래스의 clone 메서드와 Cloneable 인터페이스에 대하여
오늘은 Object 클래스 내에 있는 clone 메서드에 대하여 공부해보았습니다. 실제로 자주 사용하진 않는다고 들었지만 그 기능에 대하여 알아두는 것이 좋을 것 같아 간단한 예시 코드들을 통해 공
kobalja2020.tistory.com
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Book' 카테고리의 다른 글
[Effective Java] 아이템 17 (0) | 2023.01.18 |
---|---|
[Effective Java] 아이템 15 (0) | 2023.01.18 |
[Effective Java] 아이템 10 ~ 아이템 11 (0) | 2023.01.10 |
[Effective Java] 아이템 3 (0) | 2023.01.03 |
[Effective Java] 아이템 2 (0) | 2023.01.03 |
댓글