예시 코드를 하나 보도록 하겠습니다.
class Point {
public double x;
public double y;
}
위와 같은 class는 public이기 때문에 데이터 필드에 직접 접근할 수 있기 때문에 캡슐화의 이점을 제대로 살리지 못한다.
위와 같은 class는 불변성을 보장할 수 없고, 외부에서 접근할 때 부수 작업을 수행할 수도 없습니다. (변경후 데이터 처리를 부수작업이라고 보시는게 편합니다.)
위와 같은 문제를 해결하기 위해 Setter/Getter를 통해 내부 필드에 접근할때 접근자 메서드를 사용하여 접근하도록 하는방법입니다. 위의 코드를 접근자 메서드를 활용하여 작성하면 다음과 같습니다.
class Point {
private double x; // publid 을 private로 변경
private double y; // publid 을 private로 변경
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(protected) class 또는 private 중첩 class 라면 public을 통해 필드를 노출한다 해여도 문제는 없다.
결과적으로는 public 으로는 절대 필드를 노출시키지 말고, 불변 필드라고 하여도 완전히 안심할수는 없다. 하지만 package-private(protected) class나 private 중첩 클래스에서는 필드를 노출하는 편이 나을수도 있다.