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