우리는 접근제어자를 통해 필드나 메서드에 접근하는 권한을 부여했다.
private 을 사용하면 자신의 클래스가 아닌 클래서에서는 접근하지 못한다.
그렇지만! 자바에서는 private 필드에 접근하여 값을 읽어오거나 수정하는 방법이 있다.
바로 Getter와 Setter !
public class Tv1 {
private String color = "black";
private int size = 100;
private boolean power = false;
//Getter
public String getColor() {
return color;
}
public int getSize() {
return size;
}
public boolean getPower() {
return power;
}
//Setter
public void setColor(String color) {
this.color = color;
}
public void setSize(int size) {
this.size = size;
}
public void setPower(boolean power) {
this.power = power;
}
}
이렇게 getter를 설정해두면 다른 클래스(Main)에서 getColor()를 통해 color 값을 불러올 수 있다.
또 setter를 통해 변수에 접근해 값을 변경 할 수도 있다.
public class Main {
public static void main(String[] args) {
Tv1 tv = new Tv1();
// System.out.println(tv.color); 바로 private 변수에 접근했으므로 오류.
System.out.println(tv.getColor()); // "black" 출력
//tv.size = 10; 바로 private 변수에 접근해 값을 지정할 수 없다.
tv.setSize(300); setter를 이용.
System.out.println(tv.getSize()); // 300 출력.
}
}
방법 자체는 이렇게 간단하지만 왜 굳이 private으로 접근을 막아놓고 또 접근할 수 있는 방법을 만들어 놓은 것일까??
getter 를 통해 값을 가져올 때 내부 필드를 값을 숨긴 채로 가공된 값만 얻을 수 있다.
setter를 통해 값을 설정 할 때, tv 의 size가 음수일 수 없는데
누군가 -값을 설정 할 수도 있다.
이 때 setter 메소드 내에 이를 방지하는 로직을 만들어 주면
음수값을 입력했을 때 경고를 하거나 막을 수 있다.
이 두 가지는 사실 객체지향 방법론에서 캡슐화의 예를 잘 보여준다고 할 수 있다.