들어가며
public 클래스에서는 public 필드가 아닌 접근자 메소드를 통해 접근하여야 한다. 이를 어긴다면 다양한 단점이 수반된다.
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다.
- 불변식을 보장할 수 없다.
- 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.
하지만 package-private 클래스 혹은 private 중첩 클래스라면 데이터 필드를 노출한다 해도 문제가 없다. 클라이언트 코드가 이 클래스 내부 표현에 묶이기는 하나 클라이언트도 어짜피 이 클래스를 포함하는 패키지 안에서만 동작하는 코드이기 때문이다.
public 클래스의 필드가 불변(const, final)이라면 직접 노출할 때의 단점이 조금을 줄어들지만 좋은 생각은 아니다. API를 수정하지 않고 내부 표현을 바꿀 수 없다는 점과 필드에 접근할 때 부수 작업을 수행할 수 없다는 점은 여전하다. 단, 불변식은 보장이 가능하다.
1 | public final class Time { |