Item16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

다음과 같이 캡슐화되지 않은 class는 필드를 외부에서 직접 접근이 바로 가능하니 작성하지 않는 것이 좋다. (모듈간 독립성이 떨어짐)

1
2
3
4
5
6
public class Point {

public double x;

public double y;
}

외부에서 멤버필드 값을 조회,변경할떄는 getter , setter 방식을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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의 내부 표현 방식을 바꾸기 어려울 것이다.

1
2
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에서는 필드를 노출하는 편이 나을떄도 있다.

Comments