본문 바로가기

프로그래밍언어/Java

[Java 기본] 접근 제어자 이해

접근 제어자란?


자바는 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을 직접 변경하려고 하면 오류가 발생하는 것을 확인할 수 있다.

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.