본문 바로가기
Java

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

by jayden-lee 2019. 4. 14.
728x90

Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다.

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

Point 클래스는 데이터 필드에 직접 접근할 수 있다. 이러한 클래스를 만들면, 객체 지향에서 캡슐화 장점을 사용할 수 없다. 또한, 불변 클래스를 만들 수 없다. Point 클래스의 접근 제한자는 package-private이기 때문에 패키지 내부에서만 사용할 수 있다.

 

이러한 클래스를 보면 필드를 모두 private을 변경하고, setter 또는 getter 접근자를 추가하고 싶어할 것이다.

 

Point 클래스에 접근자를 추가하고 필드는 각 접근자 메서드를 통해 접근할 수 있도록 변경한 코드이다.

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 void setX(double x) { this.x = x; }
        public void setY(double y) { this.y = y; }
}

public 클래스라면 위와 같은 방식을 사용하는 것이 옳다. 하지만 필드를 public으로 공개하는 것이 항상 나쁜 방법은 아니다. package-private(default) 또는 private 중첩 클래스의 경우에는 데이터 필드를 노출해도 문제 없다.

클래스 필드에 직접 접근 가능한 Point와 Dimension 클래스

java.awt.package 패키지에 Point와 Dimension 클래스들은 필드를 외부로 직접 노출하고 있다. 이로 인해서 불변성을 보장할 수 없으며, 여러 문제점을 안고 있다.

 

아래 이미지는 java.awt.package 패키지의 Point 클래스이다.

 

요약

public 클래스는 가변 필드를 직접 노출해서는 안된다. 불변 필드라면 노출하더라도 덜 위험하지만 굳이 그렇게 설계하지 말자. 접근자 메서드를 통해서 필드를 접근하도록 설계하자. 그리고 필드의 값을 수정할 수 있는 setter 메서드는 정말 필요한 경우에만 추가하는 것이 좋다. package-private 클래스 또는 private 중첩 클래스에서는 필드를 노출하는 것이 나을 때도 있다.

댓글