class Point {
public double x;
public double y;
}
위 예제 처럼 필드를 public
으로 노출하면 어떤 문제가 있을까?
Point point = new Point(1, 1);
point.x = 2;
Point 객체를 만들고, x 값을 변경하려는 코드가 있다고 하자.
이때 x를 xCoordinate라는 필드명으로 바꾼다면 위 코드도 수정해야 한다.
private int updateX(int x) {
this.xCoordinate_ = x;
}
public static void main(String[] args) {
Point point = new Point(1, 1);
point.updateX(2);
}
메서드로 필드에 접근하게 하면 필드 이름을 바꿔도 문제가 없다. (내부 표현에 묶이지 않는다.)
public double getX() {
// 부가 작업
return x;
}
클라이언트 코드가 이 클래스 내부 표현에 묶이기는 하나, 클라이언트도 어차피 이 클래스를 포함하는 패키지 안에서만 동작하는 코드일 뿐이다.
이 글이 책에 써있는데
(개인적으로) 굳이 private
이 아닌 public
필드로 해야 하나라는 생각이 든다.
불변를 노출하는 건 가변 필드 노출보다 덜 위험하지만, 내부표현에 묶이고, 부수작업을 수행할 수 없으므로 public
말고 private
을 사용하자.
Button button = new Button("hello button");
button.setBounds(0, 0, 20, 10);
Dimension size = button.getSize();
System.out.println(size.height); // height에 직접 접근
System.out.println(size.width);
button
객체의 getSize()
는 Dimension
객체를 반환하고, 이 객체로 button
의 사이즈를 알 수 있다. 하지만 height
, width
이 public
이라 직접 접근 가능하다.
public
필드이기 때문에,
객체를 안전하게 사용하기 위해서는
객체 자체가 아닌 객체를 복사한 다른 객체가 사용되게 만들어야 한다.
그러면 외부에서 객체를 사용할 때는 항상 새로운 객체를 만들어줘야 하는데, 이는 불편하고 객체 생성 비용이 크다면 성능에도 좋지 않다.