잘 설계된 모듈과 그렇지 못한 모듈을 구별 짓는 가장 중요한 속성 하나는 모듈 내부의 데이터를 비롯한 구현 세부사항을 다른 모듈에 잘 감추었느냐는 것이다. 정보은닉과 캡슐화가 잘 되어진 모듈은 모듈사이의 의존성을 낮춰서, 각자 개별적으로 개발 및 변경이 가능하다. 또한 다른 모듈에 영향을 끼칠 걱정 없이 디버깅을 진행할 수 있기 때문에 좋은 성능을 낸다고 할 순 없지만, 효과적인 성능튜닝을 할 수 있는 방법이다.
접근제어는 클래스와 인터페이스, 그리고 그 멤버들의 접근 권한을 규정한다. 접근 제어의 적절한 사용은 정보 은닉 원칙을 실현하는 핵심적인 부분이다.
각 클래스와 멤버는 가능한 한 접근 불가능하도록 만들어라
다시말해서 개발 중인 소프트웨어의 정상적인 동작을 보장하는 한도 내에서 가장 낮은 접근 권한을 설정하라는 원칙이다. 최상위 레벨 클래스나 인터페이스는 가능한 package-private(default)로 선언해야 한다. package-private로 선언하면 API의 일부가 아니라 구현 세부사항에 속하게 되므로, 다음번 릴리즈에 클라이언트 코드를 깨뜨릴 걱정없이 자유로이 변경,삭제,대체가 가능하다.
객체 필드는 절대로 PUBLIC으로 선언하면 안된다.
그 필드에 관계된 불변식을 강제할 수 없다. 필드가 변경될 때 특정한 동작이 실행되도록 할 수도없으므로, 변경 가능 PUBLIC 필드를 가진 클래스는 다중 스레드에 안전하지 않다. 그러나 상수들이 핵심적 부분을 구성한다고 판단되는 경우, 해당 상수들을 public static final 필드들로 선언하여 공개할 수 있다. 이런 필드들은 반드시 기본 자료형 값들을 갖거나, 변경 불가능 객체를 참조해야 한다.
public static final 배열 필드를 두거나, 배열 필드를 반환하는 접근자를 정의해서는 안된다.
해결법1. public으로 선언되었던 배열은 private로 바꾸고 변경이 불가능한 public 리스트를 하나 만드는 것.
해결법2.배열을 private로 선언하고, 해당 배열을 복사해서 반환하는 public 메서드를 하나 추가하는 것.
요약
접근 권한은 최대한 낮추고 최소한의 public API를 설계한 다음, 다른 모든 클래스,인터페이스, 멤버는 api에서 제외하라. public static final 필드를 제외한 어떤 필드도 public 필드로 선언하지 마라. 그리고 public static final필드가 참조하는 객체는 변경 불가능 객체로 만들어라.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[클래스와 인터페이스]규칙15. 변경 가능성을 최소화하 (0) | 2017.04.24 |
---|---|
[클래스와 인터페이스]규칙14.public 클래스 안에는 public 필드를 두지 말고 접근자 메서드를 사용하라 (0) | 2017.04.22 |
[모든 객체의 공통 메서드]규칙12.Comparable 구현을 고려하라 (0) | 2017.04.20 |
[모든 객체의 공통 메서드]규칙11.clone을 재정의할 때는 신중하라 (0) | 2017.04.19 |
[모든 객체의 공통 메서드]규칙10.toString은 항상 재정의하라 (0) | 2017.04.19 |