본문 바로가기

개발/[스터디] 이펙티브 자바

아이템 15. 클래스와 멤버의 접근권한을 최소화하여라

개념

정보은닉

1. 뜻

클래스 내부 데이터, 구현정보를 외부 컴포넌트에서 분리시키는 것

2. 장점

2.1 시스템 개발 속도 높인다. : 여러 모듈 동시에 개발 가능

2.2 다른 컴포넌트로 교체가 쉽다.

2.3 소프트웨어의 재사용성을 높인다. (필요한 모듈만 분리하여 타 프로그램에 붙이면 됨)

 

접근 제어자

private: 멤버가 선언된 클래스 내 

default: 접근 제어자 생략시 자동 부여. 동일 패키지 내 

protected: 동일 패키지 내 or 상속했을 경우

public: 어디서든

 

정보 은닉 원칙

1. 모든 클래스&멤버의 접근성을 가능한 낮춘다.

 

2. public 클래스의 인스턴스 필드는 가능한 public이 아니어야한다.

- 값의 불변성을 보장해야한다. 

- thread-safe하지 않다. 

 

3. 클래스가 표현하는 추상 개념을 완성하는데 꼭 필요한 개념이라면 사용 가능

예) product 클래스 내에서 할인률을 표현할 경우

      public static final DISCOUNT_RATE

 

4. 길이가 0이 아닌 배열은 모두 변경 가능

    >> 클래스에서 public static final 배열 필드를 두거나, 이 필드를 반환하는 접근자 메서드를 제공하지 말자. 

예) public static final Things[] VALUES = {...};

 

4.1 final인데 왜 변환이 가능할까? 

final은 주소값이 바뀌지 않는 것을 뜻한다. final에서 값을 추가/삭제 할 수 있다. 

 

4.2 해결 방법

4.2.1 public 배열을 private으로 만들고, public 불변 리스트 추가

private static final Things[] PRIVATE_VALUES = { ... };

public static final List<Thing> VALUES = Collections.unmodifiableListArrays.asList(PRIVVATE_VALUES)

 

4.2.2 배열을 private으로 만들고 그 복사본을 반환하는 public 메소드를 추가한다. 

private static final Things[] PRIVATE_VALUES = { ... };

public static final Things values() {

  return PRIVATE_VALUES.clone();

}

 

 

** 이해 안 가는 부분

97p

반면 public으로 선언하면 API가 되므로 하위 호환을 위해 영원히 관리해줘야한다. 

: 하위호환은 어떤 내용을 이야기하는걸까?