- 이유: 잘 설계된 컴포넌트란 내부 데이터와 구현을 외부로부터 잘 숨긴(캡슐화) 컴포넌트이다. 접근 권한을 최소화함으로써 외부로부터 내부를 더 잘 숨길 수 있다.
정보 은닉(캡슐화)의 장점은 아래와 같다
- 병렬 개발을 할 수 있다 → 개발 속도 up
- 성능 최적화에 도움을 준다 → 캡슐화 자체가 성능에 도움을 주지는 않지만 개별 컴포넌트를 더욱 쉽게 수정할 수 있기 때문에 최적화에도 능하다
- 재사용성을 높인다
몇가지 유용한 지침
-
패키지 외부에서 쓸 이유가 없다면 package-private(default)를 사용하자
-
public 클래스의 멤버는 상수(
public static final
)가 아닌 이상 private으로 선언한다 -
한 클래스에서만 사용하는 package-private 톱레벨 클래스라면 이를 사용하는 클래스 안에 private static으로 중첩시켜 사용하자
-
접근 제한자를 넓히기는 쉽지만 좁히기는 굉장히 어렵다는 것을 명심하자
보안 허점에 주의
참조 타입의 경우 final로 선언해도 불변을 보장할 수 없다.
public static final Thing[] VALUES = {...};
이 경우 두 가지 해결책이 있다.
- public 불변 리스트를 추가하는 방법
private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES);
- 방어적복사
private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}