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

김동훈·2023년 5월 28일
0

Effective-java

목록 보기
6/14
post-thumbnail

평상시 public class에서 아무런 고민없이 당연하게 private필드로 작성하고 있었다.
이번 챕터들을 읽어보며 이러한 습관에 대해 다시 생각해보고 그 이유를 찾아볼수 있다. item 16에서 말하는 내용은 그리 많지 않아 짧은 글이 될 예정이다.


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

이런 클래스는 필드에 직접 접근(public)할 수 있어서 캡슐화의 이점이 깨진다.

따라서 이런 클래스가 있다면, public을 private로 제한하고 접근자(getter)를 추가한다. getter도 문제점을 가지고 있는데, 이러한 경우는 배열같은 필드를 getter를 통해 반환하면, private필드라도 충분히 수정가능하다는 문제가 생긴다.

이러한 getter의 문제는 필드를 그대로 반환 하지 말고, Collections.unmodifiableList같은 것을 사용하여 새로운 객체로 반환해주면 된다.

만약 package-private클래스이거나, private 중첩클래스라면 필드를 노출해도 괜찮다. 어차피 패키지 내부에서만 사용되어, 외부 코드가 영향을 줄 수 없어서 라고 이해했다.

java.awt의 Point클래스가 이렇게 잘못 만들어진 클래스라고 하는데, 실제로 public으로 필드를 열어두고 있다.

이렇게 public으로 열어두었을 때의 또 다른 문제점은 API를 변경하지 않고는 표현방식을 바꿀수 없다라는 것이다.
이는 public으로 열어두었을 때 클라이언트 코드가 이러한 field들을 직접 접근하여 사용하고 있었을 것이다. 나중에 이를 알고, private으로 변경하려면 클라이언트 코드들을 모두 에러가 발생할 것이다.

여기서 API를 변경해야한다는 의미를 생각해 볼 수 있다.


effective-java스터디에서 공유하고 있는 전체 item에 대한 정리글

profile
董訓은 영어로 mentor

0개의 댓글