[Effective Java] item16 - public 클래스에서는 public 필드가 아닌 접근자 메소드를 사용하라

신민철·2023년 4월 21일
0

Effective Java

목록 보기
16/23
post-thumbnail
class House {
	public String addr;
	public long price;
}

해당 클래스에 필드는 자유롭게 접근가능하므로 캡슐화가 이루어지지 못한다.

불변식을 보장할 수 없고, 외부에서 필드에 접근할 때 추가적인 작업을 할 수도 없다. (ex. Locking)

class House {
	private String addr;
	private long price;

	public House(String addr, long price) {
		this.addr = addr;
		this.price = price;
	}
	
	public String getAddr() { return addr; }
	public long getPrice() { return price; }

	public void setAddr(String addr) { this.addr = addr; }
	public void setPrice(long price) { this.price = price; }
}

public 클래스라면 이 방식으로 접근자를 제공함으로써 유연성을 얻을 수 있다. 또한 마음대로 필드에 접근할 수 없게 된다.

하지만 package-private(default), private 중첩 클래스는 필드를 공개해도 상관이 없다. 클라이언트 코드가 클래스 내부에 묶이지만 클라이언트도 결과적으로 해당 패키지 내에서만 작동하기 때문에 상관없다.

자바 플랫폼 라이브러리 중에 반면교사를 삼아야 할 예시가 두가지가 있는데 java.awt.package의 Point와 Dimension 클래스다. 이 클래스들은 내부를 노출하여 심각한 성능 문제를 해결하지 못했다.

public 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;
	}
	...
}

public 클래스의 필드가 불변이라면 단점이 줄지만, 필드를 읽을 때 부수작업을 할 수 없다는 단점은 여전히 존재한다. 단 불변식을 보장하여 각 인스턴스가 유효한 시간임을 보장한다.



핵심 정리
public 클래스는 가변 필드를 직접 노출하면 절대 안 된다. 불변 필드도 안심할 수는 없다. package-private이나 private 중첩 클래스는 노출해도 상관이 없다.

0개의 댓글