[Effective Java 3/e] 아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라


아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

이처럼 퇴보한 클래스는 public이어서는 안 된다!

class Point {
  public double x;
  public double y;
}
  • 데이터 필드에 직접 접근할수 있어서 캡슐화의 이점 제공 못함
  • API를 수정하지 않고서는 내부 표현을 바꿀 수 없음
  • 불변식 보장할 수 없음
  • 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.

접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화한다.

class Point {
  private double x;
  private double y;

  public Point(double x, double y) {
    this.x = x;
    this.y = y;
  }

  public double getX() { return x; }
  public double getY() { return y; }

  public void setX(double x) { this.x = x; }
  public void setY(double y) { this.y = y; }
}
  • 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공
    • 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.

정리

  • public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다.
  • package-private 클래스나 private 중첩 클래스에서는 종종 필드를 노출하는 편이 나을 수 있다.