[Effective Java] - 4장 아이템 16. Public 클래스에서는 Public 필드가 아닌 접근자 메서드를 사용하라

yeom yaloo·2023년 11월 9일
0

Effective Java

목록 보기
4/20
post-thumbnail

[4장 클래스와 인터페이스]

  • 추상화의 기본 단위인 클래스와 인터페이스
  • 자바의 심장과도 같다
  • 자바 언어에서 클래스와 인터페이스 설계에 사용한 강력 요소를 알아보자

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

  • 클래스와 멤버의 접근 권한과 관련된 키워드는 private,package-private,protected, public이다.
  • 4장 아이템 15 ~ 16 접근 제한자에 관한 개념을 클래스,인터페이스, 멤버에 적용할 때 어떻게 외부 컴포넌트로부터 내부 구현의 정보 은닉이 이뤄지는지에 대한 개념이다.
  • 불변과 관련된 키워드는 final과 관련이 있으며 해당 개념은 아이템 17에 나온다.

[핵심 정리]
public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다. 불변 필드라면 노출해도 덜 위험하지만 이 역시도 완전히 안심해서는 안 된다. 하지만 package-private 클래스나 private 중첩 클래스에서는 종종 (불변이든 가변이든)필드를 노출하는 것이 나을 때도 있다.

1. API의 필드가 public인 경우의 문제

public class Point {
    
    public int x;
    public int y;
    
}
  • 필드가 모두 public으로 직접 접근할 수 있게 되어 있다.
  • 이런 경우라면 캡슐화의 이점을 제공하지 못하는 문제가 있다.
  • 또한 API를 수정하지 않고는 내부 표현의 변경이 불가하고 불변식을 보장할 수 없다.
  • 외부에서 필드에 접근할 때 부수 작업(= getter, setter 등)을 수행할 수도 없게 된다.

2. API의 필드를 private하게 변경해보자

public class Point {

    //1. private 접근 제한자로 변경
    private int x;
    private int y;

    //2. 부수 작업을 수행할 메서드 추가 
    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
  1. public 접근 제한자를 사용하던 필드를 모두 private로 변경
  2. 부수 작업을 수행할 getter 메서드 추가

3. 접근자 메서드 추가의 이점

  • 패키지 바깥에서도 접근이 가능한 클래스인 경우에 접근자 메서드(getter)의 추가로 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻게 됐다.

내부 표현식을 언제든 바꿀 수 있는 것이 왜 이점이지?

public 클래스에서 public 하게 열어둔 필드가 있다고 가정해보자.

  • 이때 해당 public class(= Open API)를 사용하려는 클라이언트(=사용자)가 있을 것이고, 해당 필드의 내부 표현 방식을 마음대로 바꿀 수 없게 된다.
  • 왜 내부 표현 방식을 마음대로 바꿀 수 없냐 이를 개발자가 마음대로 변경하게 되면 클라이언트가 사용할 때 문제가 생기기 때문이다.
  • 그러나 Open API의 필드를 private하게 만들어 두면 해당 필드는 외부로부터 숨길수 있어서 클라이언트가 이 정보에 대해서 접근할 수 없게 된다.
  • 이런 상태에서 private한 필드의 내부 표현 방식을 개발자가 변경한다고 한들 이 Open API를 사용하고 있는 클라이언트에겐 아무런 영향이 가지 않는다.
  • 내부 표현식을 언제든지 바꿀 수 있는 것은 소프트웨어 개발에서 유연성과 유지보수성을 향상시키는 데에 기여하기 때문에 언제든 변경할 수 있는 것이 이점인 이유다.

[정리]

  • 가변 필드의 경우엔 절대로 public하게 선언해선 안된다. 무조건 private하게 선언하자
    • 가변 객체: ArrayList, StringBuilder 등
  • public class의 경우엔 필드를 private하게 선언해 필드에 직접 접근하지 못하게 하자
  • 필드는 private하게 만들고 이에 접근할 수 있는 접근자 메서드를 만들어 필드에 접근할 수 있게 하자
  • 가끔 package-private한 클래스와 private 중첩 클래스의 경우엔 데이터 필드의 노출이 필요한 경우도 종종 있다.
profile
즐겁고 괴로운 개발😎

0개의 댓글