[Effective Java] 4 - item 16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
item 16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
- 데이터 필드에 직접 접근해 수정이 가능한 클래스는 캡슐화의 이점을 제공하지 못한다.
class Point {
public double x;
public double y;
}
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다.
- 불변식을 보장할 수 없다.
- 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.
이 경우 필드 변수 접근 제한자를 모두 private
하게 변경하고, 접근자 getter를 추가하는 작업이 필요하다.
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; }
}
- 패키지 밖에서 접근 가능한 클래스라면, 내부 표현 방식을 언제든지 바꿀 수 있는 유연성을 제공해야 한다.
package-private
클래스 혹은private
중첩 클래스라면 데이터 필드를 노출해도 문제가 없다.- 같은 패키지 내에서 사용할 것이기 때문이다.
핵심 정리
- public 클래스는 절대 가변 필드를 직접 노출해서는 안되며, 불변 필드라면 노출해도 덜 위험하나 완전히 안심할 수는 없다.
- package-private 클래스나 private 중첩 클래스에스는 필드를 노출하는 편이 나을 수도 있다.
Leave a comment