Item17 - 변경 가능성을 최소화 하라(1)

2023. 11. 29. 20:26java/이펙티브 자바

 

불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스다.

불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다.

클래스를 불변으로 만드려면 다음 다섯 가지 규칙을 따르면 된다.

 

 1. 객체의 상태를 변경하는 메서드를 제공하지 않는다.

 

 2. 클래스를 확장할 수 없도록 한다.

 

 => 하위 클래스에서 불변 클래스를 상속 받아 객체의 상태를 변경하는 메서드를 제공한다면 상속 받은 클래스도 부모  타입으로 타입 캐스팅해 쓸 수 있기 때문에 불변이 깨지게 된다. 그러니 불변 클래스를 final로 선언하거나 생성자를 private으로 만들면 된다.

 

 3. 모든 필드를 final로 선언한다.(쓸 수 있으면 최대한 써라!)

     => 이러면 객체의 상태를 변경하는 메서드를 사용할 시 컴파일 에러가 난다. 또한 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는 데도 필요하다. (final 필드는 멀티 스레드 환경에서 Lock 걱정 없이 호출될 수 있고, 컴파일러는 메모리를 로드하지 않고 레지스터에 캐싱된 값을 사용한다.)

 (https://docs.oracle.com/javase/specs/jls/se17/html/jls-17.html#jls-17.5)

 

 4. 모든 필드를 private으로 선언한다.

=> 내부 표현을 마음대로 바꿀 수 없기 때문에

 

 5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

=> 클라이언트에서 내부에 있는 가변 컴포넌트의 참조를 얻어 해당 클래스의 필드의 값을 바꿀 수 있기 때문이다. 그러      니 getter로 제공해주지 않거나 방어적인 복사를 사용하는게 좋다.