본문 바로가기

STUDY/이펙티브자바

4-2) public 클래스에서는 public 필드가 아닌 접근자 메소드를 사용하라

접근자 메소드

 

// Point 클래스의 x, y 값은 아무곳에서나 접근 가능하고
// 그 결과 x, y에 대한 관리 책임은 Point가 가지고있지 않는다.
class Point {
    public double x;
    public double y;
}

위 Point 클래스는 x, y 좌표를 나타내는 실수형 필드를 가지고 있다. 정말 그뿐이다. 연관된 정보를 모아둔 것 이외의 역할을 하지않는 C언어 시절의 클래스이다. OOP의 철학을 따르는 Java의 개발자라면 이런 퇴보한 클래스는 만들면 안된다. Point 클래스를 만들었다면 x, y 값에 대한 책임도 함께 가지고 있는 클래스를 만들어야 한다.

 

// x, y의 값은 Point 클래스 내부에서만 수정하기때문에
// x, y에 대한 관리책임은 Point 클래스에 있다.
public class Point {
    private double x;
    private double 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;
    }
}

 

 


불변 필드는 public으로 노출해도 괜찮을까?

 

public final class Time {
    public static final int HOURS_PER_DAY    = 24;
    public static final int MINUTES_PER_HOUR = 60;
    public static final int SECONDS_PER_MINUTE = 60;
    ...
}

위 코드를 보면 Time 클래스의 불변 필드들이 존재한다. 불변 필드이기 때문에 public으로 노출했으나 이런 코드는 나중에 문제가 생길 수 있다. 예를 들어서 윤초와 같이 특별한 경우 SECONDS_PER_MINUTE는 61이 되어야 한다. 이런 예외 상황은 로직에 따라 처리해야 하고, 결국 예외 로직을 포함한 접근자  메소드를 만들어서 반환해야 한다. 그렇게 되면 필드에 직접 접근하여 사용하던 외부 코드들은 모두 새로 만들어진 접근자 메소드를 사요하도록 수정되어야 한다. 이처럼 어떤 예외가 발생할 지 모르기 떄문에 처음부터 접근자 메소드를 사용하는 것이 좋다.

728x90