Skip to content

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

Description

@DongLee99

다음과 같은 클래스 설계는 지양하라

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

위 클래스는 데이터 필드에 직접 접근이 가능해 캡슐화의 이점을 제공하지 못한다. 당연히 불변도 보장할 수 없다. (나중에 어디서 변화가 있는 지 찾을 수 없어 엄청난 사이드 이펙트 발생의 우려가 있다.) 따라서 필드를 모두 private로 바꾸고 public 접근자 getter를 추가해라.

// 접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화 한다.
class Point {
    private double x;
    private double y;
    
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

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

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

패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.

자바 플랫폼 라이브러리에도 public 클래스의 필드를 직접 노출하지 말라는 규칙을 어기는 사례가 종종 있다. 대표적인 예가 java.awt.package 의 Point와 Dimension 클래스다. 이 클래스들을 흉내 내지 말 것.

public 클래스의 필드가 불변이라면 직접 노출시 단점이 조금 줄어들지만 결코 좋은 코드는 아니다
API를 변경하지 않고는 표현 방식을 바꿀 수 없고, 필드를 읽을 때 부수 작업을 수행할 수 없다는 단점은 여전하다.

핵심

public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions