Item16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
2021-12-17 23:33:21
#Java#Effective Java 3/E
다음과 같이 캡슐화되지 않은 class는 필드를 외부에서 직접 접근이 바로 가능하니 작성하지 않는 것이 좋다. (모듈간 독립성이 떨어짐)
public class Point {
public double x;
public double y;
}
외부에서 멤버필드 값을 조회,변경할떄는 getter , setter 방식을 사용한다.
public class Point {
private double x;
private double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
public class라면 클래스 내부 표현 방식을 언제든지 바꿀 수 있는 유연성이 생긴다.
예를 들어 기존에 client가 필드를 직접 참조해서 사용하였을떄는 Point class의 내부 표현 방식을 바꾸기 어려울 것이다.
Point point = new Point();
doSomething(point.x);
private, default class라면 데이터 필드가 노출된다하더라도 문제가 없다. 그 class가 표현하고자 하는 추상 개념만 올바르게 표현해주면 된다. default class 인 경우 client도 같은 패키지에 있겠지만, 어차피 client도 해당 패키지안에서만 동작하는 class임으로 패키지 바깥과는 독립적이다. 따라서 패키지 바깥 쪽의 코드는 수정에는 닫혀있으면서 , 데이터 표현 방식의 변경에는 열려있다.
private 중첩 class의 경우에는 수정 범위가 더 좁아져서 이 class를 포함하는 외부class까지로 제한된다.
정리
public class는 가변 필드를 직접 노출해서는 안되고, 불변이라면 노출해도 덜 위험하지만 완전히 안전하지는 않다. default,private class에서는 필드를 노출하는 편이 나을떄도 있다.
댓글
이 게시글에 대한 의견을 공유해주세요!
