본문 바로가기
JAVA/Effective Java

item 16. public 클래스에서는 접근자 메서드를 사용하라

by Garonguri 2022. 4. 25.
728x90

다음과 같이 인스턴스 필드를 모아놓는 일 이외에는 아무 목적도 없는 클래스가 있다.

public class item16 {
    // instance field 선언 이외 하는 일 없음.
    public int x;
    public int y;
}

 

다음과 같이 public 필드를 노출시킨다면 여러 가지 단점이 있다.

-> ex) java.awt.package 의 Point, Dimension class

//java.awt.Point

package java.awt;

public class Point extends Point2D implements java.io.Serializable {
    public int x;
    public int y;
    
    public void move(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
  • 데이터 필드에만 직접 접근할 수 있을 뿐, 캡슐화의 이점을 제공하지 않는다.
  • API를 수정하지 않고는 내부 표현을 바꿀 수 없다.
  • 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다.

 

이러한 단점을 해결하는 방법은, 접근자 'getter'을 추가하면 된다.

public class item16 {
    // instance field 선언 이외 하는 일 없음.
    // -> 접근자 method 만들어줌
    private int x;
    private int y;

    public int getX() { return x; }

    public int getY() { return y;}
}
  • API를 수정하지 않아도 클래스 내부 표현식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다.

 

[ 예외 ]
package-private(default), private 중첩 클래스의 경우에는 data field를 public으로 노출해도 딱히 문제가 되지 않는다.
(클래스가 표현하는 추상 개념만 올바르게 표현 해 준다면)

- 이러한 경우 public으로 노출하는 방식이 getter을 사용하는 방식보다 깔끔하다.
- 또한 클라이언트 코드도 어짜피 위 클래스를 포함하는 패키지 안에서만 동작하는 코드이므로, 데이터 표현식 또한 바꿀 수 있다.

+ public class 필드가 불변이라면?

- 직접 노출할 때의 단점이 조금 줄어들긴 하지만, "API를 수정하지 않고는 내부 표현을 바꿀 수 없다." , "외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다." 는 단점은 여전하다.

 

[ 정리 ]

public class는 절대 가변 필드를 노출해서는 안된다.
package-private, private 중첩 클래스의 경우에는 필드를 노출하는 편이 나을 때도 존재한다.

 

 

728x90

댓글