[Effective Java] 14. pullic Class에서 public 멤버 사용 지양

최대 1 분 소요

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

이러한 class는 데이터 멤버를 외부에서 직접 수정할 수 있어 캡슐화의 이점을 누릴 수 없다.

특히 외부로 공개하는 api인 경우 api 자체를 변경하지 않고서는 내부 표현을 수정할 수 없고, 불변식 검증을 강제할 수도 없다. 또한, 특정 멤버에 접근하려 할때 어떠한 동작을 하려는 형태의 구현이 불가능하다.

따라서, 반드시 getter, setter를 두는 것이 바람직하겠다.

1. public class가 아닌 경우

class가 package-private 이거나 nested class 인 경우 데이터 멤버를 public으로 공개하더라도 잘못이라고 할 수 없다.

추상화를 제대로 구현했다면 이러한 구현은 특정 package나 class에 종속되고 이는 외부에 공개되는 내용이 아니기 때문이다.

2. immutabla class인 경우

내부 값이 변경되지 않는 imuutable class인 경우 public class에서 public 멤버를 외부에 공개하여도 그 심각성은 덜하다.

public final class Time {
    public final int hour;
    public final int minute;
	
    public Time(int hour, int minute) {
        ...
    }
}

위와 같은 class는 생성자를 통해 값의 validation 체크를 할 수 있을뿐 아니라 final로 선언된 멤버로 인해 한번밖에 값이 할당될 수 밖에 없다.

하지만 여전히 api 명세를 수정하지 않고는 내부 표현을 변경할 수 없고, 특정 멤버에 접근할때 어떤 동작을 하는 구현은 불가능하다.

댓글남기기