접근 제어자란?
자바는 public, private 같은 접근 제어자(access modifier)를 제공한다. 접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.
예제를 통해 자세히 알아보자.
예제
스피커에 들어가는 소프트웨어를 개발해야 한다.
스피커의 음량은 절대로 100을 넘으면 안된다는 요구 사항이 있다. 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("Volume up ");
}
}
void volumeDown() {
volume -= 10;
System.out.println("Volume down");
}
void showVolume() {
System.out.println("Volume : " + volume);
}
}
SpeakerMain.java
public class SpeakerMain {
public static void main(String[] args) {
Speaker speaker = new Speaker(90);
speaker.showVolume();
speaker.volumeUp();
speaker.showVolume();
speaker.volumeUp();
speaker.showVolume();
}
}
요구사항대로 volumeUp 메서드를 여러 번 호출하더라도 100이 넘지 않도록 개발했다.
오랜 시간이 흘러서 업그레이드 된 다음 버전의 스피커를 출시하게 되었다. 이 때는 새로운 개발자가 기존 코들을 이어받아서 개발하게 되었다. 새로운 개발자는 기존 요구사항을 몰랐기 때문에 스피커 볼륨을 100이상 올렸으면 좋겠다고 생각한다.
새로운 개발자는 volme 필드에 직접 접근하여 볼륨을 수정한다.
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 = 200;
speaker.showVolume();
}
}
=> 100이 넘어가는 스피커가 만들어졌고, 스피커는 고장났다.
Speaker를 사용하는 사용자(Main메서드)는 Speaker 객체의 필드와 메서드에 모두 접근할 수 있다. VolumeUp 메서드에서 음량제한을 걸었으나, 사용자가 직접 볼륨을 변경할 수 있으므로 소용 없었다.
이 문제를 근본적으로 해결하기 위해서는 외부에서 volume 필드에 접근할 수 없도록 막아야 한다. 그래서 사용하는 것이 접근제어자 이다.
접근 제어자 이해
Speaker 클래스의 volume 필드를 수정해보자.
public class Speaker {
private int volume;
...
}
=> 접근 제어자 private 을 사용하면 speaker 클래스 안에서만 volume 필드를 변경할 수 있다.
=> 외부에서 volume을 직접 변경하려고 하면 오류가 발생하는 것을 확인할 수 있다.
* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 기본] 접근 제어자 사용 - 필드, 메서드 (0) | 2024.07.08 |
---|---|
[Java 기본] 접근 제어자 종류 (0) | 2024.07.08 |
[Java 기본] 패키지 (1) | 2024.07.05 |
[Java 기본] 생성자 - 오버로딩과 this() (0) | 2024.07.05 |
[Java 기본] 생성자 - 도입 (0) | 2024.07.05 |