Skip to content

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

@DongLee99

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 클래스는 절대 가변 필드를 직접 노출해서는 안 된다.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions