Effective Java 04 - item 15 -
in Programming Language on Java
클래스와 멤버의 접근 권한을 최소화하라
당연한 이야기이다. 객체지향에서 항상 이야기하는 정보은닉은 괜히 하라고 하는 것이 아니다.
클래스 내부를 감추면 감출 수록 클래스는 하나의 역할과 책임을 가질 확률이 높다.
이렇게 정보를 은닉함으로써 다른 객체간의 종속성을 줄여준다.
자바에서 역시 이와 관련된 기능을 접근제한자로 제공해준다.
이 접근 제한자를 제대로 사용하는 원칙은 딱 하나이다.
모든 클래스와 멤버의 접근성을 가능한 좁혀라
이다.
그리고 주의해야할 점이 하나 더 있는데, 클래스에서 public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공하지는 말자.
클라이언트가 해당 배열의 내용을 수정할 수 있게 되니까 말이다.
이를 회피하기 위해 해당 배열의 접근제한자를 priavte로 바꾸고 복사본을 만드는 방식이다.
자바 9에서 모듈 시스템이라는 개념이 도입되면서 조금 더 직관적으로 접근을 제한할 수 있게 되었다.
모듈은 자신이 속하는 패키지 중 공개해야할 것들을 modue-info.java
파일에 선언한다.
해당 패키지를 공개하지 않으면 외부에 공개되지 않는다.
모듈 시스템을 활용하면 클래스를 외부에 공개하지 않으면서 모듈을 이루는 패키지 사이에서는 자유롭게 공유하는 것이 가능하다.
결론적으로 클래스의 접근제한은 빡시게(?) 가져가는 편이 좋다.
클래스 내부의 변경을 최소화하고 메소드를 통해서만 접근할 수 있게 해두자.
이는 DDD에서도 중요한 개념으로 등장한다.
Reference
이펙티브 자바 Effective Java 3/E
조슈아 블로크