본문 바로가기
public void static main()/Book

[Effective Java] 아이템 13

by 햄리뮤 2023. 1. 10.
반응형

이장은 간단히 하고 넘어가겠다!

 

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

[아이템 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 구문이 필요하다.

 

 

 

 

 

 

https://kobalja2020.tistory.com/entry/Java-%EC%9E%90%EB%B0%94-Object-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-clone-%EB%A9%94%EC%84%9C%EB%93%9C%EC%99%80-Cloneable-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC#:~:text=1.%20clone()%20%EB%A9%94%EC%84%9C%EB%93%9C&text=%EC%A6%89%20%ED%95%9C%EB%A7%88%EB%94%94%EB%A1%9C%20%EB%A7%90%ED%95%98%EB%A9%B4%20%EB%B3%B5%EC%A0%9C,%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C%20%EB%B3%B4%ED%98%B8%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%EC%84%9C%EC%9E%85%EB%8B%88%EB%8B%A4. 

 

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

댓글