brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jul 23. 2018

Effective Java - 메서드(method)

#39 필요하면 방어 복사본을 만들자

Effective Java - 메서드(method)


#39 필요하면 방어 복사본을 만들자


클래스의 클라이언트가 불변 규칙을 파괴하기 위해 최선을 다할 거라는 가정하에 방어적으로 프로그래밍을 해야 합니다.


방어 복사본(defensive copy)을 만드는 방법에 대해 알아보겠습니다.




Period 클래스는 불변 클래스(final class)이면서 시작일이 종료일보다 늦지 않는다는 불변 규칙을 지키도록 되어 있습니다.

#01 Period 불변 클래스


#01 생성자 방어 복사본


하지만 Date는 가변 객체이기 때문에 이 불변 규칙을 아래와 같이 깰 수 있습니다.

#02 불변 규칙 깨기


이를 방어하기 위해 가변 객체인 매개 변수(start, end) 각각의 방어 복사본(defensive copy)을 만들어야 합니다.


코드를 보면 매개 변수의 유효성 검사를 방어 복사본 생성 이후에 하고 있습니다.

방어 복사본을 생성하는 과정에서 가변 객체에 대한 공격? 이 일어날 수 있기 때문입니다.


그리고 clone이 아닌 new 연산자를 통해 방어 복사본을 생성하고 있습니다.

Date는 가변 객체이기 때문에 clone 메서드를 통해 신뢰할 수 있는 복제본을 만든다는 보장이 없기 때문입니다.

#03 방어 복사본 생성 - 생성자




#02 메서드 방어 복사본


start()나 end() 메서드를 통해 Period 내부의 가변 필드(Date start, end)에 접근을 제공하고 있기 때문에 아래와 같이 불변 규칙이 깨질 수 있습니다.

#04 불변 규칙 깨기


이를 방어하기 위해 가변 필드(start, end) 각각의 방어 복사본(defensive copy)을 반환하도록 합니다.


여기서는 clone을 통해 방어 복사본을 생성할 수 있습니다.

Date는 가변 객체이긴 하지만 생성자를 통해 신뢰할 수 있는 객체임을 보장받았기 때문입니다.

#05 방어 복사본 생성 - 메서드




이처럼 불변 객체가 아닌 가변 객체는 방어 복사본을 만드는 게 안전합니다.

하지만 방어 복사본 생성은 성능에 안 좋은 영향을 끼치기 때문에, 가변 객체이더라도 신뢰할 수 있다면 방어 복사본을 생성하지 않아도 괜찮습니다.

그리고 이를 문서로 명시화해야 합니다.

매거진의 이전글 Effective Java - 메서드(method)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari