자바의 클래스는 변경가능한 클래스와 변경 불가능한 클래스로 나눌 수 있습니다.
final 선언자가 큰 역할을 하죠.
EFJ15에서는 이 변경 불가능한(immutable) 클래스의 이점에 대해 설명하면서,
특별한 이유가 없을 때에는 되도록 변경이 불가능 하도록 설정하라고 권하고 있습니다.
먼저 변경 불가능한 클래스를 만들 때 지켜야할 5규칙입니다.
1. 객체 상태를 변경하는 메소드(Setter 등)를 제공하지 않는다.
2. 계승할 수 없도록 한다.(상속 불가)
하위 클래스로 인해 변경될 가능성을 차단합니다.
3. 모든 필드를 final로 선언한다.
시스템상으로 강제해 의도를 분명히 합니다.
4. 모든 필드를 private로 선언한다.
클라이언트가 객체를 직접 수정하는 일을 막습니다.
5. 변경 컴포넌트에 대한 독점적 접근권을 보장한다.
클라이언트는 클래스에 포함된 변경 가능 객체에 대한 참조를 획득할 수 없어야합니다.
다음으로 변경 불가능한 클래스의 장점입니다.
1. 변경 불가능 객체는 단순합니다.
생성될 때에 한가지 값만 가지기 때문입니다. 반면 변경 가능한 객체의 상태는
세세한 명세나 기술이 없으면 안정적으로 사용되기 힘듭니다.
2. 변경 불가능한 객체는 어떠한 동기화도 필요없고, 스레드에 안전합니다.
스레드 처리중인 객체의 내부값이 돌발적으로 변화하거나, 의도하지 않았더라도 수정되는 시도가 생기면
스레드 자체가 붕괴할 위험이 있습니다. 변경 불가능이라는 특성이 이러한 점을 예방해줍니다.
3. 변경 불가능한 객체는 자유롭게 공유가 가능합니다.
private로 설정해 숨기려는 이유는 변경을 불가능하게 함입니다. 안정성을 위해 개방으로 인한 활용성을 희생하는 것이죠.
하지만 변경이 불가능하다는 확인이 있다면 public static final 처럼 선언하여 자유롭게 공유하여, 활용할 수 있습니다.
4. 방어적 복사본을 만들 필요가 없습니다.
5. 변경 불가능한 객체는 그 내부도 공유할 수 있습니다.
6. 변경 불가능한 객체는 다른 객체의 구성요소로도 좋습니다.
대표적으로 map과 set이 있습니다. key값을 매번 변화하는 값으로 지정할 수는 없겠지요.
유일한 단점은 값마다 별도의 객체를 생성해야 해서
자원소모가 있다는 점입니다.
작은 객체라면 상관없지만, BigInteger 처럼 큰 값을 다루는 객체라면
한비트의 변화많으로도 객체를 새로 생성해야해서 많은 자원이 소모됩니다.
왠지 이번 주제는 알 것 같으면서도, 모르는 내용이 많아서 설명을 못한 부분이 많네요..
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 16 - 계승하는 대신 구성하라 (0) | 2018.02.14 |
---|---|
디자인 패턴 - 프록시 패턴(Proxy pattern) (0) | 2018.02.12 |
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2018.02.12 |