이 글은 Getters And Setters in Java Explained 를 번역한 글입니다.
번역에 오류가 있을 수 있으니 주의바랍니다.
무의식적으로 쓰던 getter 과 setter에 대한 궁금증이 생겼다.
암기만 하고 있었을 뿐 어떤 상황에서 getter 과 setter을 쓰는지
제대로 알고 있지 못했다.
그래서 getter 과 setter을 썼을때 개발자가 얻을 수 있는
이점에 대해 알아보기로 했다.
getter 은 인스턴스 변수를 반환하고 setter 은 인스턴스 변수를
대입하거나 수정한다. 그래서 accessor이나 mutator로 불리기도 한다(이건 중요하지 않음).
관습에 따라 getter은 변수 앞에 get, setter은 변수 앞에 set 이 붙고
그 변수들의 앞글자는 대문자로 한다.
public class Vehicle {
private String color;
// Getter
public String getColor() {
return color;
}
// Setter
public void setColor(String c) {
this.color = c;
}
}
getter 은 객체의 attribute(변수) 를 반환하고 setter 은
파라미터를 받아서 attribute 에 할당한다.
getter와 setter 가 정의되면 main 메서드에서 이렇게 사용할 수 있다.
public static void main(String[] args) {
Vehicle v1 = new Vehicle();
v1.setColor("Red");
System.out.println(v1.getColor());
}
// 결과 "Red"
getter 와 setter 로 값들을 처리할 수 있다.
setter 에서 값이 할당되기 전에 파라미터의 유효성을 검사 할 수도 있다(validate).
getter, setter을 통해 값에 대해 얼마나 중요하게 다룰지 조절할 수 있다.
간단히 아래의 예제를 보자.
public void setNumber(int number) {
if (number < 1 || number > 10) {
throw new IllegalArgumentException();
}
this.number = num;
}
위의 setter을 통해 1과 10 사이의 숫자들만 number 변수에 할당 할 수 있다. 아래와 같이 직접 수정하는 것보다 훨씬 나은 방식이다.
obj.number = 13;
1과 10 사이의 값만을 원하는데 13을 할당했다.
이렇게 값을 대입하면 원치 않는 에러나 결과가 나올 수 있다.
number 변수를 private 으로 지정하고 setNumber 메서드를
이용하면 이와 같은 문제를 예방할 수 있다.
number이 private이므로 number을 불러오려면 자연스럽게
getter 메서드가 있어야 한다.
public int getNumber() {
return this.number;
}
내 생각대로 정리하자면 데이터에 할당될 값이 어떤 기준 안에 있어야 할때
setter을 사용해 그 기준에 맞게 강제할 수 있다는 점이 중요한 것 같다.
그에 따라 getter은 필연적으로 따라오는 것이다.