카테고리 없음

2023 하계 모각코 5차 종료

Kmentor 2023. 7. 24. 23:58

7/24

item 15 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를 변경해야한다는 의미를 생각해 볼 수 있다.