접근 제어자 이해1

자바는 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();
    }
}

스크린샷 2024-12-06 오후 2.30.41.png

새로운 개발자가 기존 코드를 이어받아서 개발하게 되었다. 새로운 개발자는 기존 요구사항을 잘 몰랐다.

소리를 더 올리면 좋겠다고 생각한 개발자는 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();
    }
}

스크린샷 2024-12-06 오후 2.32.36.png

volumeUp() 과 같은 메서드에서 음량이 100을 넘지 못하도록 기능을 개발했지만 소용이 없다.

왜냐하면 Speaker의 volume 필드에 직접 접근해서 원하는 값을 설정할 수 있기 때문이다.