-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
다음과 같은 클래스 설계는 지양하라
class Point {
public double x;
public double y;
}
위 클래스는 데이터 필드에 직접 접근이 가능해 캡슐화의 이점을 제공하지 못한다. 당연히 불변도 보장할 수 없다. (나중에 어디서 변화가 있는 지 찾을 수 없어 엄청난 사이드 이펙트 발생의 우려가 있다.) 따라서 필드를 모두 private로 바꾸고 public 접근자 getter를 추가해라.
// 접근자와 변경자(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 double setX(double x) {this.x = x;}
public double setY(double y) {this.y = y;}
}
패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.
자바 플랫폼 라이브러리에도 public 클래스의 필드를 직접 노출하지 말라는 규칙을 어기는 사례가 종종 있다. 대표적인 예가 java.awt.package 의 Point와 Dimension 클래스다. 이 클래스들을 흉내 내지 말 것.
public 클래스의 필드가 불변이라면 직접 노출시 단점이 조금 줄어들지만 결코 좋은 코드는 아니다
API를 변경하지 않고는 표현 방식을 바꿀 수 없고, 필드를 읽을 때 부수 작업을 수행할 수 없다는 단점은 여전하다.
핵심
public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다.