이펙티브 자바, 쉽게 정리하기 - item 16.
public
클래스에서는public
필드가 아닌 접근자 메서드를 사용하라
접근자와 변경자 활용의 이점
접근자와 변경자는 자바 소스에서 흔히 보이는 getter
와 setter
이다. 외부에서 필드에 직접 접근하는 것이 아니라 메서드를 통해 값을 얻거나 변경할 수 있도록 만드는 것이다.
- 단순히
public
필드를 외부에 공개하면, 추후에 클라이언트에 의해 이 클래스가 사용될 때public
필드를 직접 이용하는 경우가 생기고, 이 경우 내부 표현 방식을 마음대로 바꿀 수 없게 된다. - 단,
package-private
클래스 혹은private
중첩 클래스와 같은 경우는public
으로 필드 값을 노출해도 아무런 문제가 없다.- 이 경우 클라이언트가 이 클래스를 포함하는 패키지 안에서만 동작한다는 보장이 있기 때문이다. 그래서
public
으로 공개해도 이 클래스를 사용하는 다른 클래스가 없기 때문에 상관없다.
- 이 경우 클라이언트가 이 클래스를 포함하는 패키지 안에서만 동작한다는 보장이 있기 때문이다. 그래서
getter
와setter
를 사용하면 값을 읽거나 변경할 때 부수적인 로직 구성이 쉽다. 마치proxy
같이 활용할 수도 있다.
접근자와 변경자를 활용하지 않았을 때의 단점
public
으로 공개된 멤버가 언제든 변경될 수 있다.- 특히 가변 객체인 경우에는
final
로 불변으로 만든다 해도 객체 내용 변경이 가능하므로 주의해야 한다. public
으로 공개된 멤버가 언제든 변경될 수 있으므로 보통 방어적 복사가 이용되고 이는 성능 문제를 일으킨다.
public Dimension getSize(Dimension rv) {
if (rv == null) {
return new Dimension(getWidth(), getHeight());
}
else {
rv.setSize(getWidth(), getHeight());
return rv;
}
}
Component
클래스가 반환하는Dimension
클래스의 예이다. 방어적 복사를 위해 매번 새로운 객체를 만들어내서 많은 성능 비효율이 있다.
핵심 정리
public
클래스라면 절대 가변 필드를 직접 노출하지 말자.- 불변 필드도 접근자 변경자의 장점을 잃어버리니 웬만하면 노출하지 말자.
package-private
혹은private
클래스인 경우는 노출하는 편이 나을 때도 있다.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 18. 상속보다는 컴포지션을 사용하라 (2) | 2022.01.04 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라 (0) | 2022.01.03 |
이펙티브 자바, 쉽게 정리하기 - item 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.01.01 |
이펙티브 자바, 쉽게 정리하기 - item 14. Comparable을 구현할지 고려하라 (0) | 2022.01.01 |
이펙티브 자바, 쉽게 정리하기 - item 13. clone 재정의는 주의해서 진행하라 (0) | 2021.12.30 |