맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

안도일 2023. 3. 21. 19:19

 

인스턴스 필드들을 모아놓을 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있는데, 대표적으로 x, y의 좌표를 표현하는 Point 클래스가 있다.

 

 

이런 클래스는 데이터 필드에 직접 접근할 수 있으므로 캡슐화의 이점을 제공하지 못한다. 따라서 필드를 모두 private으로 바꾸고 접근자(getter)를 추가하자.

 

 

패키지 바깥에서 접근할 수 있는 클래스라면 getter를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.

 

 

단, package-private 클래스 혹은 private 중첩 클래스라면 데이터를 노출한다해도 문제가 없다.

-> 오히려 접근자 방식보다 훨씬 깔끔하다.

 

 

 

불변식 보장

 

public 클래스의 필드가 불변(public final)이라면 직접 노출할 때의 단점이 조금 줄어들지만 좋은 생각은 아니다.

 

API를 변경하지 않고는 표현방식을 변경할 수 없고, 필드를 읽을 때 부수 작업을 수행할 수 없다는 단점은 여전하다.

 

하지만 불변식은 보장할 수 있게 되는데 다음이 그 예다

 

 

위 클래스는 각 인스턴스가 유효한 시간임을 보장한다.