기록이 힘이다.

[이펙티브 자바] 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 본문

JAVA

[이펙티브 자바] 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

dev22 2023. 3. 23. 20:18
728x90

이처럼 퇴보한 클래스는 public이어서는 안 된다!

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

 

캡슐화의 이점을 제공하지 못한다. 모두 private으로 바꾸고 public 접근자(getter)를 추가한다. 

 

package effectivejava.chapter4.item16;

// 코드 16-2 접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화한다. (102쪽)
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; }
}

패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공

 

package-private 클래스 혹은 private 중첩 클래스라면 데이터 필드를 노출한다 해도 하등의 문제가 없다. 

 

불변 필드를 노출한 public 클래스 - 과연 좋은가? 

package effectivejava.chapter4.item16;

// 코드 16-3 불변 필드를 노출한 public 클래스 - 과연 좋은가? (103-104쪽)
public final class Time {
    private static final int HOURS_PER_DAY    = 24;
    private static final int MINUTES_PER_HOUR = 60;

    public final int hour;
    public final int minute;

    public Time(int hour, int minute) {
        if (hour < 0 || hour >= HOURS_PER_DAY)
            throw new IllegalArgumentException("Hour: " + hour);
        if (minute < 0 || minute >= MINUTES_PER_HOUR)
            throw new IllegalArgumentException("Min: " + minute);
        this.hour = hour;
        this.minute = minute;
    }

    // 나머지 코드 생략
}

각 인스턴스가 유효한 시간을 표현함을 보장한다.