728x90
다음과 같이 인스턴스 필드를 모아놓는 일 이외에는 아무 목적도 없는 클래스가 있다.
public class item16 {
// instance field 선언 이외 하는 일 없음.
public int x;
public int y;
}
다음과 같이 public 필드를 노출시킨다면 여러 가지 단점이 있다.
-> ex) java.awt.package 의 Point, Dimension class
//java.awt.Point
package java.awt;
public class Point extends Point2D implements java.io.Serializable {
public int x;
public int y;
public void move(int x, int y) {
this.x = x;
this.y = y;
}
}
- 데이터 필드에만 직접 접근할 수 있을 뿐, 캡슐화의 이점을 제공하지 않는다.
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다.
- 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.
이러한 단점을 해결하는 방법은, 접근자 'getter'을 추가하면 된다.
public class item16 {
// instance field 선언 이외 하는 일 없음.
// -> 접근자 method 만들어줌
private int x;
private int y;
public int getX() { return x; }
public int getY() { return y;}
}
- API를 수정하지 않아도 클래스 내부 표현식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.
[ 예외 ]
package-private(default), private 중첩 클래스의 경우에는 data field를 public으로 노출해도 딱히 문제가 되지 않는다.
(클래스가 표현하는 추상 개념만 올바르게 표현 해 준다면)
- 이러한 경우 public으로 노출하는 방식이 getter을 사용하는 방식보다 깔끔하다.
- 또한 클라이언트 코드도 어짜피 위 클래스를 포함하는 패키지 안에서만 동작하는 코드이므로, 데이터 표현식 또한 바꿀 수 있다.
+ public class 필드가 불변이라면?
- 직접 노출할 때의 단점이 조금 줄어들긴 하지만, "API를 수정하지 않고는 내부 표현을 바꿀 수 없다." , "외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다." 는 단점은 여전하다.
[ 정리 ]
public class는 절대 가변 필드를 노출해서는 안된다.
package-private, private 중첩 클래스의 경우에는 필드를 노출하는 편이 나을 때도 존재한다.
728x90
'JAVA > Effective Java' 카테고리의 다른 글
item 18. 상속보다는 컴포지션을 사용해라 (0) | 2022.04.26 |
---|---|
item 17. 변경 가능성을 최소화하라 (0) | 2022.04.25 |
item 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.04.23 |
item 14. Comparable을 구현할지 고려하라 (0) | 2022.04.23 |
item 13. clone 재정의는 주의해서 진행하라 (0) | 2022.04.23 |
댓글