Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다.
class Point {
public double x;
public double y;
}
Point 클래스는 데이터 필드에 직접 접근할 수 있다. 이러한 클래스를 만들면, 객체 지향에서 캡슐화 장점을 사용할 수 없다. 또한, 불변 클래스를 만들 수 없다. Point 클래스의 접근 제한자는 package-private이기 때문에 패키지 내부에서만 사용할 수 있다.
이러한 클래스를 보면 필드를 모두 private을 변경하고, setter 또는 getter 접근자를 추가하고 싶어할 것이다.
Point 클래스에 접근자를 추가하고 필드는 각 접근자 메서드를 통해 접근할 수 있도록 변경한 코드이다.
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 클래스라면 위와 같은 방식을 사용하는 것이 옳다. 하지만 필드를 public으로 공개하는 것이 항상 나쁜 방법은 아니다. package-private(default) 또는 private 중첩 클래스의 경우에는 데이터 필드를 노출해도 문제 없다.
클래스 필드에 직접 접근 가능한 Point와 Dimension 클래스
java.awt.package
패키지에 Point와 Dimension 클래스들은 필드를 외부로 직접 노출하고 있다. 이로 인해서 불변성을 보장할 수 없으며, 여러 문제점을 안고 있다.
아래 이미지는 java.awt.package
패키지의 Point 클래스이다.
요약
public 클래스는 가변 필드를 직접 노출해서는 안된다. 불변 필드라면 노출하더라도 덜 위험하지만 굳이 그렇게 설계하지 말자. 접근자 메서드를 통해서 필드를 접근하도록 설계하자. 그리고 필드의 값을 수정할 수 있는 setter 메서드는 정말 필요한 경우에만 추가하는 것이 좋다. package-private 클래스 또는 private 중첩 클래스에서는 필드를 노출하는 것이 나을 때도 있다.
'Java' 카테고리의 다른 글
Effective Java 아이템 17. 변경 가능성을 최소화하라 (0) | 2019.04.14 |
---|---|
“” 또는 생성자를 사용하여 Java String 문자열 생성 (0) | 2019.04.14 |
Java Map 컬렉션(Collection) 개념 및 종류 (0) | 2019.04.11 |
쓰레드(Thread) 종료 방법 stop 플래그, interrupt() (0) | 2019.04.11 |
List(리스트)를 Array(배열)로 변환 방법 (0) | 2019.04.11 |
댓글