본문 바로가기
Java

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

by 신입같은 3년차 2021. 1. 2.
728x90

예시 코드를 하나 보도록 하겠습니다.

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

위와 같은 class는 public이기 때문에 데이터 필드에 직접 접근할 수 있기 때문에 캡슐화의 이점을 제대로 살리지 못한다.

위와 같은 class는 불변성을 보장할 수 없고, 외부에서 접근할 때 부수 작업을 수행할 수도 없습니다. (변경후 데이터 처리를 부수작업이라고 보시는게 편합니다.)

위와 같은 문제를 해결하기 위해 Setter/Getter를 통해 내부 필드에 접근할때 접근자 메서드를 사용하여 접근하도록 하는방법입니다. 위의 코드를 접근자 메서드를 활용하여 작성하면 다음과 같습니다.

class Point {
    private double x; // publid 을 private로 변경 
    private double y; // publid 을 private로 변경 

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

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

그렇다면 접근자 메서드를 활용하면 얻을 수 있는 이점은 무엇이 있을까??

바로 접근자 메서드를 활용하면 내부 표현방식을 언제든 변경가능 하기 때문에 유연성을 제공한다.

하지만 package-private(protected) class 또는 private 중첩 class 라면 public을 통해 필드를 노출한다 해여도 문제는 없다.


결과적으로는 public 으로는 절대 필드를 노출시키지 말고, 불변 필드라고 하여도 완전히 안심할수는 없다. 하지만 package-private(protected) class나 private 중첩 클래스에서는 필드를 노출하는 편이 나을수도 있다.

728x90
반응형

댓글