핵심 요약
public 클래스는 절대 가변 필드를 직접 노출하면 안된다. 불변 필드라면 덜 위험하지만 안전한 것은 아니다.
package-private 클래스나 private 중첩 클래스에서는 불변, 가변 상관없이 필드를 노출하는 게 좋은 경우도 있다.
class Point {
public double x;
public double y;
}
어딜봐도 문제가 많아 보이는 위 클래스의 문제점이 무엇인가?
1. 데이터 필드에 직접 접근이 가능하여 캡슐화 원칙을 위배한다.
2. 내부 표현을 바꾸려면 API를 수정해야 한다.
예를 들어, double 대신 다른 타입으로 저장하려고 하면, API를 수정해야만 한다. 즉, 클래스 내부 구현 방식이 외부에 노출되어 있으므로, 클래스 내부 구현 방식 변경이 API까지 영향을 미친다.
3. 불변식을 보장할 수 없다.
외부에서 임의적으로 값을 변경할 수 있다.
4. 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.
캡슐화 원칙을 지키면서 부수 작업을 진행할 수 없다는 뜻 같다.
public class
대부분의 객체 지향 프로그래머는 아래 코드처럼 구현한다.
public 클래스는 데이터 필드를 직접 노출하는 것은 캡슐화 원칙 위배이기에, public 클래스라면 이 방식이 맞다.
패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.
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 클래스의 필드가 불변이더라도 필드를 노출해서는 안 된다.
package-private 클래스 / private 중첩 클래스
package-private 클래스 혹은 private 중첩 클래스는 해당 클래스가 선언된 패키지 내에서만 접근이 가능하다. 즉, 외부에서 클래스에 대한 접근 권한이 없으므로, 클래스의 데이터 필드를 직접 노출해도 외부에서 접근할 수 없어서 캡슐화 원칙 위배의 문제가 발생하지 않는다.
'Language > Java' 카테고리의 다른 글
[effective java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라. (0) | 2023.05.09 |
---|---|
[effective java] 아이템 17. 변경 가능성을 최소화하라. (0) | 2023.03.25 |
[effective java] 아이템 15. 클래스 멤버의 접근 권한을 최소화하라. (0) | 2023.03.25 |
[effective java] 아이템 14. Comparable을 구현할지 고려하라. (0) | 2023.03.25 |
[effective java] 아이템 13. clone 재정의는 주의해서 진행하라. (0) | 2023.03.22 |