개발 일기

접근 제어자 본문

Java

접근 제어자

ji_su_04 2024. 7. 30. 17:55

접근 제어자 이해

 

자바는 public, private 같은 접근 제어자를 제공한다.

접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 매서드에 접근하는 것을 허용하거나 제한할 수 있다.

 

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("볼륨을 10 감소했습니다.");
    }

    void showVolume(){
        System.out.println("현재 볼륨은 " + volume);
    }
}

 

package access;

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

        speaker.volumeUp();
        speaker.showVolume();

        speaker.volumeUp();

        //필드에 직접 접근
        System.out.println("volume 직접 접근수정");
        speaker.volume =200;

        speaker.showVolume();
    }
}

 

위 코드를 보면 SpeakerMain에서 Speake 필드에 직접 전급이 가능하다.

이런 경우 만약 볼륨의 값이 100 초과시 기계적 에러가 발생한다면 분명 문제가 생길 것이다.

 

private int volume;

 

이런 경우 private를 사용하면 모든 외부 호출을 막을 수 있다.

따라서  private가 붙은 경우 해당 클래스 내부에서만 호출이 가능하다.

 

위와 같이 실행 후 SpeakerMain을 실행하게 되면 컴파일 에러가 발생한다.

 

접근 제어자 종류

 

자바는 4가지 종류의 접근 제어자를 제공한다.

 

  • private: 모든 외부 호출을 막는다.
  • default(package-private): 같은 패키지 안에서의 호출을 허용한다.
  • protected: 같은 패키지안에서 호출을 허용하고 패키지가 달라도 상속 관계의 호출은 허용한다.
  • public: 모든 외부 호출을 허용한다.

private > default> protected> public 순서로 public이 가장 많이 허용한다.

 

default: 접근 제어자를 명시하지 않으면 같은 패키지 안에서 호출을 허용하는 default 접근 제어자가 적용된다.

default라는 용어는 해당 접근 제어자가 기본값으로 사용되기 떄문에 붙여진 이름이지만, 실제로는 package-private가 더 정확한 표현이다. 왜냐면 해당 접근 제어자를 사용하는 멤버는 동일한 패키지 내의 다른 클래스에서만 접근이 가능하기 때문이다.

 

접근 제어자의 핵심은 속성과 기능을 외부로부터 숨기는 것

  • private 나의 클래스 안으로 속성과 기능을 숨길 때 사용, 외부 클래스에서 해당 기능을 호출할 수 없다.
  • default는 나의 패키지 안으로 속성과 기능을 숨길 때 사용, 외부 패키지에서 해당 기능을 호출할 수 없다.
  • protected는 상속 관계로 속성과 기능을 숨길 때 사용, 상속 관계가 아닌 곳에서 해당 기능을 호출할 수 없다.
  • public은 기능을 숨기지 않고 어디서든 호출할 수 있게 공개한다.
반응형

'Java' 카테고리의 다른 글

자바 메모리 구조  (0) 2024.07.31
캡슐화  (0) 2024.07.30
패키지  (0) 2024.07.30
생성자  (0) 2024.07.29
this  (0) 2024.07.29