자바는 public
, private
같은 접근 제어자(access modifier)를 제공한다. 접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.
스피커에 들어가는 소프트웨어를 개발한다고 하자.
스피커의 음량은 절대로 100을 넘으면 안된다는 요구사항이 있다.
package access;
public class Speaker {
int volume;
Speaker(int volume) {
this.volume = volume;
}
void volumeUp() {
if (volume >= 100) {
System.out.println("음량을 증가할 수 없습니다. 최대 음량입니다.");
} else {
volume += 10;
System.out.println("음량을 10 증가합니다.");
}
}
void volumeDown() {
volume -= 10;
System.out.println("volumeDown 호출");
}
void showVolume() {
System.out.println("현재 음량: " + volume);
}
}
생성자를 통해 초기 음량 값을 지정할 수 있다.
volumeUp()
메서드를 보자. 음량을 한번에 10씩 증가한다. 단 음량이 100을 넘게되면 더는 음량을 증가하지 않는다.
package access;
public class SpeakerMain {
public static void main(String[] args) {
Speaker speaker = new Speaker(90);
speaker.showVolume();
speaker.volumeUp();
speaker.showVolume();
speaker.volumeUp();
speaker.showVolume();
}
}
초기 음량 값을 90으로 지정했다. 그리고 음량을 높이는 메서드를 여러 번 호출했다.
Speaker
클래스를 보니 volume
필드를 직접 사용할 수 있었다. volume
필드의 값을 200으로 설정하고 이 코드를 실행한 순간 스피커가 고장났다.
package access;
public class SpeakerMain {
public static void main(String[] args) {
Speaker speaker = new Speaker(90);
speaker.showVolume();
speaker.volumeUp();
speaker.showVolume();
speaker.volumeUp();
speaker.showVolume();
// 필드에 직접 접근
System.out.println("volume 필드 직접 접근 수정");
speaker.volume = 200;
speaker.showVolume();
}
}
Speaker
객체를 사용하는 사용자는 Speaker
의 volume
필드와 메서드에 모두 접근할 수 있다.
앞서 volumeUp()
과 같은 메서드를 만들어서 음량이 100을 넘지 못하도록 기능을 개발했지만 소용이 없다. 왜냐하면 Speaker
를 사용하는 입장에서는 volume
필드에 직접 접근해서 원하는 값을 설정할 수 있기 때문이다.