[Effective Java] Item16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

2022년 03월 17일

TOC

이 글은 Effective Java 3/E의 내용을 요약한 글입니다. 자세한 내용은 책을 참고하시기 바랍니다.

일반적으로 사용하는 접근자 제공 방법

class Point {
    public double x;
    public double y;
}

다음과 같은 클래스는 필드에 위치한 데이터를 외부에서 직접 접근할 수 있어 캡슐화의 이점을 제공하지 못한다. 그래서 우리는 일반적으로 필드를 private으로 변경 후 getter를 추가하여 사용합니다.

class Point {
    private double x;
    private double y;

    public double getX() { return x; }
    public double getY() { return y; }

    public Point setX(double x) { this.x = x; }
    public Point setY(double y) { this.y = y; }
}

우리는 일반적으로 다음과 같은 방법을 사용하여 외부에서 내부 필드에 대한 직접적인 접근도 막아주고, 접근자(getter,setter)를 제공하며 내부에 대한 접근을 할 수 있는 유연성을 제공합니다.

package-private 클래스와 private 중첩 클래스의 데이터 필드

  • package-private 클래스와 private 중첩 클래스는 추강 개념만 올바르게 표현하면 데이터 필드를 노출하여도 문제가 없습니다.
  • 선언면과 클라이언트 코드 면에서나 접근자 방식보다 깔끔하다.
  • 클라이언트 코드가 클래스 내부 표현에 묶이더라도 해당 패키지 안에서만 동작을 하여 문제가 없다.
  • private 중첩 클래스의 경우, 해당 클래스를 포함하는 외부 클래스까지로 제한된다.

불변 필드의 노출

public 클래스의 필드가 불변이면 직접 노출될 때의 단점은 조금 줄어드나 좋지는 않은 방법이다. 단점

  • API를 변경하지 않고 표현 방식을 바꿀 수 없다.
  • 필드를 읽을 때 부수 작업을 수행할 수 없다.

핵심 정리

public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다. 불변 필드라면 노출해도 덜 위험하지만 완전히 안심할 수는 없다. 하지만 package-private 클래스나 private 중첩 클래스에서는 종종 필드를 노출하는 편이 나을 때도 있다.

Buy me a coffeeBuy me a coffee
Written by

@Seongwon

기술공유를 통해 새로운 가치 창조을 추구하는 백엔드 개발자 오성원입니다.
©SeongwonOh