-
Item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라백수의 개발/이펙티브 자바 2019. 10. 1. 12:31
class Point{ public double x; public double y; }
위와 같은 클래스는 데이터 필드에 직접 접근할수 있으니 캡슐화의 이점을 제공하지 못한다.(퇴보한 클래스)
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다.
- 불변식을 보장할 수 없다.
- 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.
따라서, 필드들을 모두 private로 바꾸고 public 접근자(getter)를 추가한다.
접근자와 설정자 제공
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 중첩 클래스라면 데이터 필드를 노출한다해도 문제가 없다.
마무리
public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다.
불변 필드라면 노출해도 덜 위험하지만 완전히 안심할 수는 없다. 하지만 package-private 클래스나 private 중첩 클래스에서는 종종(불변이든 가변이든) 필드를 노출하는 편이 나을 때도 있다.
'백수의 개발 > 이펙티브 자바' 카테고리의 다른 글
Item 18. 상속보다는 컴포지션을 사용하라 (0) 2019.10.04 Item 17. 변경 가능성을 최소화하라 (0) 2019.10.02 Item 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) 2019.09.30 Item 14. Comparable을 구현할지 고려하라 (0) 2019.09.29 Item 13. clone 재정의는 주의해서 진행하라 (0) 2019.08.27