Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- the public type
- java error
- loopback document
- loopback 설치
- error
- AWS 가입
- 회원가입
- AWS
- Loopback 모델
- Java
- 자바
- Amazon
- loopback
- StrongLoop
- Loopback api
- 아마존
- 루프백
Archives
- Today
- Total
퍄퍄
[아이템13] clone 재정의는 주의해서 진행하라 본문
Cloneable - 믹스인 인터페이스, 복제해도 되는 클래스임을 명시하는 용도
clone() 의 동작 방식을 결정한다.
Cloneable 을 구현한 클래스의 인스턴스에서 clone 을 호출하면 해당 객체의 필드들을 하나하나
복사한 객체를 반환한다.
불변 클래스용 clone 메소드
모든 필드가 기본 타입이거나 불변 객체를 참조한다면,
불변 클래스라면 굳이 clone 메소드를 제공하지 않는게 좋다.
해당 clone() 가 동작하기 위해서는 super 에 해당하는 PhoneNumber 클래스 선언에 Cloneable 을 구현해야 한다.
여기서 미리 (PhoneNumber) 로 형변환한 이유는 다음과 같다.
- 재정의한 메소드의 반환 타입은 상위 클래스의 메소드가 반환하는 타입의 하위타입일 수 있다.
- 클라이언트가 형변환하지 않게 상위 타입으로 반환
가변 상태를 참조하는 클래스용 clone 메소드
위 Stack 클래스를 기존 방식(super.clone()) 대로 반환한다면
elements[] 필드는 원본 객체가 참조하는 메모리값과 동일한 주소를 바라볼 것이다.
그렇게 될 경우, 원본이나 복사본 중 어느 것을 고쳐도 다른 하나가 같이 수정되어버린다.
이 clone 메소드를 제대로 동작하게 구현하려면 다음과 같이 스택 내부 정보를 복사하고
elements 배열의 clone을 재귀적으로 호출해주면 된다.
또한 다음과 같은 해시테이블용 clone 메소드는 각 버킷 배열까지 복사할 수 있도록 깊은 복사(deepCopy)를 지원한다.
- Cloneable 을 구현하는 모든 클래스는 clone 을 재정의 할 것
- 접근 제한자는 public 으로, 반환 타입은 클래스 자신으로 할 것
- 추가적으로, 일련번호나 고유ID, 이외 가변 객체 참조를 갖는 클래스라면 필요한 필드들을 수정한다.
- Cloneable 을 이미 구현한 클래스가 아니라면 복사 생성자, 복사 팩토리 등의 더 나은 복사 객체 방식을 제공하도록 한다.
복사 생성자, 복사 팩토리는 생성자를 쓰지 않고 인스턴스를 생성하는 위험한 객체 생성 메커니즘을 사용하지 않아
기본적으로 권장하지만 배열같은 경우 clone 메소드 방식으로 가장 깔끔하게 해결할 수 있다.