자바는 public, private 같은 접근 제어자를 제공한다. 접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.
여러분은 스피커에 들어가는 소프트웨어를 개발하는 개발자다.
스피커의 음량은 절대로 100을 넘으면 안된다는 요구사항이 있다. (100을 넘어가면 스피커의 부품들이 고장난다.)
Speaker
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);
}
}
SpeakerMain
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();
}
}

새로운 개발자가 기존 코드를 이어받아서 개발하게 되었다. 새로운 개발자는 기존 요구사항을 잘 몰랐다.
소리를 더 올리면 좋겠다고 생각한 개발자는 Speaker의 volume 필드를 직접 사용할 수 있었다.
SpeakerMain - 필드 직접 접근 코드 추가
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();
}
}

volumeUp() 과 같은 메서드에서 음량이 100을 넘지 못하도록 기능을 개발했지만 소용이 없다.
왜냐하면 Speaker의 volume 필드에 직접 접근해서 원하는 값을 설정할 수 있기 때문이다.