Effective Java - Item 16

Updated:

Effective Java

Item 16. public 클래스에는 public 필드가 아닌 접근자 메서드를 사용하라

public 클래스의 public 가변필드

절대 가변 필드를 public으로 노출하면 안된다.

  • 데이터 필드에 직접 접근, 캡슐화의 이점을 제공하지 못한다
  • API를 수정하지 않고는 내부 표현을 바꿀 수 없다.
    필드를 공개하면 이를 사용하는 client가 생겨나므로, 내부 표현 방식을 함부로 바꿀 수 없게 된다.
  • 불변식 보장 불가
  • 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.

접근자(getter)와 변경자(setter)

위 두 방식을 이용하여 멤버 필드를 private로 제한하고 패키지 바깥에서 접근할 수 있게 접근자를 제공한다.
이를 통해 내부 표현 방식을 바꿀 수 있다.

데이터 필드를 노출해도 되는 경우

  • package-private(default) 클래스
    default 클래스는 한 패키지 내에서만 동작하므로, client 코드가 이 클래스 내부 표현에 묶인다.
    패키지 안에서만 동작하는 코드이므로, data 필드 노출이 가능하다.

  • private 중첩 클래스

    public class A{
    private int a;
    private List<B> b;
      
    private static class B{   //private static으로 중첩
      private int b;
    }
    }
    

    Inner private 중첩 클래스를 통하여 수정 범위를 외부 클래스까지 제한한다.

public 클래스의 불변 필드

직접 노출 할때의 단점은 조금 줄어들지만 문제는 여전히 존재

단점 1) API를 변경하지 않고는 표현 방식을 바꿀 수 없다
단점 2) 필드를 읽을 때 부수 작업을 수행할 수 없다

장점 1) final 이므로 불변식 보장

정리

public 클래스는 절대 가변 필드를 직접 노출해서는 안된다.
불변 필드라면 노출해도 덜 위험하지만 문제는 존재.
default & private 중첩 클래스는 (불변/가변) 둘다 노출해도 된다.

출처

Joshua Bloch. Effective Java 3/E. n.p.: 인사이트, 2018년 11월 1일.

Reference

https://jyami.tistory.com/78