반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
public 클래스의 경우 내부 데이터 필드에 접근 제한자를 private으로 정의하고, public 접근자를 추가하는 것이 좋다.
public class Point {
private double x;
private double y;
public Point(final double x, final double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(final double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(final double y) {
this.y = y;
}
}
- 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써, 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 제공
- pacakage-private 클래스 혹은 private 중첩 클래스라면 데이터 필드를 노출한다 해도 하등의 문제가 없음
그 클래스가 표현하려는 추상 개념만 올바르게 표현해주면 된다. - 자바 플랫폼 라이브러리에도 public 클래스의 필드를 직접 노출한 사례가 있다.
ex) java.awt.package의 Point, Dimension 클래스
public 클래스의 필드가 불변이라도 직접 노출은 좋지 않다.
public class Time {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
public final int hour;
public final int minute;
public Time(final int hour, final int minute) {
this.hour = hour;
this.minute = minute;
}
...
}
정리
- public 클래스는 절대 가변 필드를 직접 노출하지 말자
- 불변 필드라면 노출해도 덜 위험하지만 안심할 수 없다.
- package-private 클래스나 private 중첩 클래스에서는 종종 (가변/불변 상관없이) 필드를 노출하는 경우가 나을 때가 있다.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 18. 상속보다는 컴포지션을 사용하라 (1) | 2022.09.22 |
---|---|
[Effective Java] 아이템 17. 변경 가능성을 최소화하라 (1) | 2022.09.20 |
[Effective Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.09.16 |
[Effective Java] 아이템 14. Comparable을 구현할지 고려하라 (0) | 2022.09.15 |
[Effective Java] 아이템 13. clone 재정의는 주의해서 진행하라 (0) | 2022.09.14 |