객체 지향 프로그램(OOP) 언어인 Java에서는 데이터를 보호하기 위해 외부에서 직접적으로 접근하는 것을 막아두는 경우가 있다. 외부에서 마음대로 데이터를 읽고 변경하게 된다면 해당 객체의 결점이 없는 상태, 바로 무결성이 깨질 수가 있다.
예를 들어,
사람의 나이나, 생년월일, 자동차의 속도 같은 것들은 음수가 될 수 없다. 또한 외부에서 해당 데이터를 음수로 변경하게 된다면 객체의 무결성이 깨지게 된다.
human.age = 15;
이러한 경우에는 접근 제어자 private을 사용해 필드의 직접적인 접근은 막아두고 메소드를 활용해 받아온 데이터(매개변수의 값)를 먼저 검사하고 유효할 때에만 저장할 수 있게끔 만들 수 있다.
이 때 사용하는 메소드가 바로 Getter와 Setter이다.
Getter와 Setter 메소드를 사용하면 객체의 무결성을 해치지 않으면서 데이터 또한 안전하게 사용할 수 있다.
일반적으로 Getter 메소드는 get-, Setter는 set-을 사용한다.
set 메소드는 private으로 선언된 필드의 값을 수정하고자 할 때 필요하다.
private 필드는 직접 접근할 수 없으므로, 객체는 입력 값을 setter 메소드의 매개값으로 넘겨주고 값을 검사하고 난 후 그 값이 필드의 값으로 적절한 경우에만 저장하게 된다.
값을 변경하는 역할은 생성자에서 또한 가능하다.
하지만, 생성자가 없는 경우도 있기 때문에 setter를 이용해 값을 입력할 수 있다. 이렇듯 주로 데이터를 변경하는 역할을 한다고 보면 된다.
값을 변경하는 역할을 Setter에서 했다면,
Getter는 데이터를 읽어오는 역할을 주로 수행한다.
외부에서 객체의 데이터를 읽어올 때에도 안전하게 값을 유지할 수 있도록 해준다.
Getter와 Setter는 보통 세트로 많이 사용하지만, 경우에 따라서는 필요한 메소드만 생성도 가능하다.
아래 코드는 Getter/Setter를 세트로 사용한 예이다.
// 생년월일로 get, set 메소드의 예를 들어보았다.
class Human {
private Sring name;
private int year;
private int month;
private int day;
// 사람의 생년월일은 한 번 정해지고 나면 변하지 않는다.
// 따라서 필드를 private으로 선언
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getYear() {
return year;
}
public String setYear() {
this.year = year;
}
public String getMonth() {
return month;
}
public String setMonth() {
this.month = month;
}
public String getDay() {
return day;
}
public String setDate() {
this.day = day;
}
// getter, setter 만들고 생성자 작성
// 이 때, setter를 사용해 데이터 수정
public Human(String name, int year, int month, int date) {
setName(name);
setYear(year);
setMonth(month);
setDay(day);
}
// Human 클래스 안에 생년월일을 출력할 수 있는 메소드 선언
// 데이터를 불러올 때 getter 사용
void printHumanBirth() {
System.out.println(getName()+"의 생년월일");
System.out.println(getYear()+"년\t"+getMonth()+"월\t"+getDay()+"일\n")
}
}
public class GetSetTest {
public static void main(String[] args){
// person의 객체를 생성해 객체의 초기값을 바로 생성자에게 넘겨준다.
Human Jason = new Human("Jason", 1984, 3, 4);
Human Hazel = new Human("Hazel", 1996, 7, 23);
Human Tom = new Human("Tom", 2003, 11, 14);
Jason.printHumanBirth();
Hazel.printHumanBirth();
Tom.printHumanBirth();
}
}
Human의 타입으로 객체를 3개 생성해 이름과 생년월일을 같이 준다.
프로그램의 안정성을 위해 매개변수를 가지고 있는 생성자가 있을 경우,
기본 생성자가 자동으로 만들어지지 않기 때문에 작성해주는 것이 좋다.
그러나 여기서는 일단 생략했다.
아래와 같이 객체가 가지고 있는 메소드 printHumanBirth()를 사용해 결과까지 출력되는 것을 볼 수 있다.
Jason의 생년월일
1984년 3월 4일
Hazel의 생년월일
1996년 7월 23일
Tom의 생년월일
2003년 11월 14일