외부로부터 객체의 접근을 막는다면 어떻게 객체의 멤버변수나 메소드를 사용할 수 있을까? 해당 객체가 갖고 있는, 그리고 외부에서 사용할 수 있는 메소드를 통해 간접적인 접근이 가능하다. 그 메소드가 바로 getter, setter
메소드다.
그 동안 생성한 객체의 멤버변수에 접근할 때 사용했던 방법은 다음과 같다.
Car car1 = new Car();
// car1객체의 price에 5000을 대입한다.
int x = 5000;
car1.price = x;
// car1객체의 price의 값을 y에 대입한다.
int y = car1.price + 2000;
그러나 정보 은닉을 구현하기 위해 객체 내에 간접적인 접근이 가능한 메소드를 정의한다.
get() 메소드
Car
클래스의 멤버변수를 접근제한자private
을 통해 외부에서 접근하지 못하도록 정의했다. 그러나 멤버변수의 값을 반환하는 get()
메소드를 정의함으로써 간접적인 접근을 허용한다.
public class Car {
private String name;
private String maker;
private int price;
public String getName() {
return name;
}
public String getMaker() {
return maker;
}
public int getPrice() {
return price;
}
public Car(String name, String maker, int price) {
this.name = name;
this.maker = maker;
this.price = price;
}
}
Car
객체를 직접 정의한 생성자를 통해 초기화했다. Car
객체의 멤버변수들은 private
이기 때문에 car.멤버변수명
과 같은 방법으로 접근할 수 없다. 그래서 get()
메소드를 통해 간접적으로 접근한다.
public class CarApp {
public static void main(String[] args) {
Car car = new Car("3-series", "BMW", 5000);
// 객체의 각 멤버변수들을 반환받고 main메소드에서 정의한 변수에 대입한다.
String name = car.getName();
String maker = car.getMaker();
int price = car.getPrice();
}
}
set() 메소드
앞의 예제에 더해 set()
메소드도 정의했다. 멤버변수의 타입에 맞는 값을 인자로 전달받아 객체의 멤버변수에 대입하는 메소드다.
public class Car {
private String name;
private String maker;
private int price;
public String getName() {
return name;
}
public String getMaker() {
return maker;
}
public int getPrice() {
return price;
}
public void setName(String name) {
this.name = name;
}
public void setMaker(String maker) {
this.maker = maker;
}
public void setPrice(int price) {
this.price = price;
}
public Car(String name, String maker, int price) {
this.name = name;
this.maker = maker;
this.price = price;
}
}
객체 생성 시 초기화되었던 멤버변수들에 새로운 값을 대입했다. car.멤버변수명
이 아니라, set()
메소드를 통해 간접적으로 대입했다.
public class CarApp {
public static void main(String[] args) {
Car car = new Car("3-series", "BMW", 5000);
System.out.println(car.getName());
System.out.println(car.getMaker());
System.out.println(car.getPrice());
car.setName("E-class");
car.setMaker("Benz");
car.setPrice(8000);
System.out.println();
System.out.println(car.getName());
System.out.println(car.getMaker());
System.out.println(car.getPrice());
}
}
출력
3-series
BMW
5000
E-class
Benz
8000