[Effective Java 3rd] 아이템15~17

Mr.Sir·2022년 6월 30일
0

Effective Java 스터디

아이템15 클래스와 접근 권한을 최소화하라

자바의 접근 제어 메커니즘은 클래스, 인터페이스, 멤버의 접근성을 명시한다.
각 요소의 접근성은 그 요소가 선언된 위치와 접근제한자로 정해진다.
이 접근제한자를 제대로 활용하는 것이 정보 은닉의 핵심이다.
기본 원칙은 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.
패키지 외부에서 쓸 이유가 없다면 package-private으로 선언한다.

  • private : 멤버를 선언한 톱레벨 클래스에서만 접근가능.
  • package-private : 멤버가 소속된 패키지 안의 모든 클래스에서 접근.
  • protected : package-private의 접근 범위 포함하며, 이 멤버를 선언한
    클래스의 하위 클래스에서도 접근 가능.
  • public : 모든 곳에서 접근 가능.

public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다.
public 클래스는 상수용 public static final 필드 외에는 어떠한 pulbic 필드도 가져서는 안 된다.


  • 자바 클래스에는 객체가 가져야 할 구성 멤버가 선언된다.(복수 및 생략가능)

    • 필드 : 객체의 데이터가 저장.
      필드는 생성자와 메소드 전체에서 사용되며 객체와 함께 존재.
      변수는 생성자와 메소드 내에서만 존재하며 종료시 소멸.
    • 생성자 : 객체 생성시 초기화 담당
    • 메서드 : 객체의 동작 실행
  • 인스턴스 멤버 : 인스턴스를 생성한 후 사용할 수 있는 필드와 메소드.

    • 클래스 영역에 선언된다.
    • 객체에 소속된 멤버이기 때문에 객체 없이 사용불가.
    • 인스턴스 필드 : 객체마다 따로 존재, 인스턴스 생성 시 힙 영역에 할당.
      인스턴스 소멸 시 메모리 해제.
    • 인스턴스 메소드 : 객체마다 존재하지 않고,
      클래스 로딩 시 메소드 영역에 저장되고 공유된다.
  • this : 인스턴스의 자기 자신 의미한다. 주로 필드의 이름과 메소드 또는 생성자의 매개변수의 이름이 동일한 경우, 인스턴스 필드임을 명확히 하기 위해 사용.

  • 정적 멤버 : static. 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드.

    • 클래스 영역에 선언된다.
    • 정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.
    • 필드와 메소드 선언 시 앞에 static 키워드를 붙이면 된다.
    • 정적멤버는 클래스 로더가 클래스를 로딩해서 메소드 영역에 적재될 때 클래스 별로 관리된다.
    • 프로그램 시작부터 종료까지 메모리에 존재.

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

필드 선언시 private, 접근자(getter)를 public으로.
-> public 클래스는 가변 필드를 직접 노출해서는 안 된다.


아이템17 변경 가능성을 최소화하라

클래스를 불변으로 만들려면..

  • 객체의 상태를 변경하는 메서드를 제공하지 않는다.
  • 클래스를 확장할 수 없도록 한다.
  • 모든 필드를 final로 선언한다.
  • 모든 필드를 private으로 선언한다.
  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

getter가 있다고 해서 setter를 무조건 만들필요는 없다.
클래스는 꼭 필요가 아니면 불변이어야 한다.
불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄인다.
합당한 이유가 없다면 모든 필드는 private final이어야 한다.
생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다.

profile
Deepveloper

0개의 댓글