Java 접근 제어자 - 필요성

​자바는 public, protected, private 키워드에 대한 접근 제어자(access modifier)를 제공한다. 이러한 접근 제어자를 사용하면 클래스를 외부에서 호출한 경우 필드 또는 메소드에 접근하는 것을 제한하거나 허용할 수 있다.

접근 제어자가 왜 필요한지 가정하고 하나의 소프트웨어를 만들어본다.

스피커 소프트웨어를 만들어 보도록 한다. 만약 볼륨이 100이 넘어가면 물리적인 장치들이 고장을 일으키니 볼륨 한도를 100이 넘지 않도록 한다.


스피커 코드

Speaker.class 와 SpeakerMain.class 를 작성하여 접근 제어자 없이 돌아가는 코드를 살펴본다.

Speaker.java

package access;

public class Speaker {
    int volume;

    Speaker(int volume) {
        this.volume = volume;
    }

    void speakerUp() {
        if (volume >= 100) {
            System.out.println("볼륨이 최대 음량입니다.");
        } else {
            volume += 10;
            System.out.println("음향이 " + volume + "으로 증가하였습니다.");
        }
    }

    void speakerDown() {
        volume -= 10;
        System.out.println("음향이 " + volume + "으로 감소하였습니다.");
    }

    void showSpeaker() {
        System.out.println("현재 음향은 " + volume + "입니다.");
    }
}

SpeakerMain.java

package access;

public class SpeakerMain {
    public static void main(String[] args) {
        Speaker speaker = new Speaker(80);
        speaker.showSpeaker();

        speaker.speakerUp();
        speaker.speakerUp();
        speaker.speakerDown();
        speaker.speakerUp();
        speaker.speakerUp();
        speaker.showSpeaker();
    }
}

출력

현재 음향은 80입니다.
음향이 90으로 증가하였습니다.
음향이 100으로 증가하였습니다.
음향이 90으로 감소하였습니다.
음향이 100으로 증가하였습니다.
볼륨이 최대 음량입니다.
현재 음향은 100입니다.

음향이 100 이상 되지 않도록 개발되었다.


문제의 시작

그러면 앞서 만든 스피커 코드에서 볼륨 한도로 100를 정하였는데, 새로운 개발자가 이어서 개발할 때 요구사항을 받지 못한 상황이면 볼륨 한도를 무시한 200으로 설정하게 될 수도 있다.

앞의 main 클래스를 실행하면 볼륨이 200으로 설정된 것을 보도록 한다.

SpeakerMain.java

package access;

public class SpeakerMain {
    public static void main(String[] args) {
        Speaker speaker = new Speaker(80);

        System.out.println("=== New Developer Code ===");
        speaker.volume = 200;
        speaker.showSpeaker();
    }
}

출력

현재 음향은 80입니다.
=== New Developer Code ===
현재 음향은 200입니다.

speaker 객체의 Dot(.) 접근으로 volume 필드 값을 200으로 설정한 것을 볼 수 있다. 이를 막아줄 필요가 있다.

요약

  • Speaker 객체를 사용자는 volume 필드를 접근할 수 있다.
  • 요구사항으로 volume 100 를 넘지 않도록 했으나, 외부에서 100 넘게 설정하였다.
  • Speaker 객체의 사용자는 volume 필드에 언제든지 접근해서 값을 설정한다.

이로 인해 volume 필드를 외부에서 접근하는 것을 막아줄 필요가 있다.