[JAVA] 접근제어자를 JAVA

wannabeing·2025년 3월 19일
2

JAVA

목록 보기
2/3

접근제어자가 왜 필요한지 아래 예시를 통해 알아보자.

➡️ 예시) 스피커에 들어가는 소프트웨어 설계

스피커 설계

  • 출시할 때 기본 볼륨은 90이다.
  • 볼륨은 최대 100까지만 증가할 수 있다.
  • 볼륨이 100 이상 되면 스피커의 부품들은 과부하에 걸리게 된다.

코드 표현

// ✅ Speaker 클래스
public class Speaker(){
	int volume;
    
    public Speaker(int volume){
    	this.volume = volume;
    }
	
    public void volumeUp(){
    	if(volume >= 100) { 
        	System.out.println("최대 볼륨입니다.");        
        } else {
        	volume += 10;
        }
    }
    
    public void volumeDown(){
    	volume -= 10;
    }
    
    public void showVolume(){
    	System.out.println("현재 볼륨은 " + this.volume + " 입니다.");
    }
}
// ✅ main()
public class Main {
    public static void main(String[] args) {
        Speaker speaker = new Speaker(90);
        speaker.showVolume(); // "현재 볼륨은 90 입니다."

        speaker.volumeUp(); // volume +10 증가
        speaker.showVolume(); // "현재 볼륨은 100 입니다."

        speaker.volumeUp(); // "최대 볼륨입니다."
        speaker.showVolume(); // "현재 볼륨은 100 입니다."

        // ✅ 신입개발자가 실수로 속성에 직접 접근
        speaker.volume = 200;
        speaker.showVolume(); // "현재 볼륨은 200 입니다."
        
        ❌ ❌ ❌  스피커의 부품들이 과부하에 걸렸습니다!!
    }
}

신입개발자가 임의로 Speaker 객체의 volume 속성에 직접 접근하여 변경해버렸고,
스피커의 부품들이 과부하에 걸리게 되버렸다.

이러한 문제들을 해결하기 위해 우리는 접근제어자를 사용한다.


💡 private 키워드를 사용하여 문제를 해결해보자

private 키워드를 사용하여

volume 속성을 함부로 접근하지 못하게 설정하고,
Speaker 클래스 내부에서만 접근할 수 있도록 해보자.

```java
// ✅ Speaker 클래스
public class Speaker(){
	private int volume; // ✅ private 적용
    ...
}    

이제 신입개발자가 실수로 속성에 직접 접근하려고 해도,
컴파일에러가 발생하여 스피커의 부품들이 과부하에 걸릴 일은 없게 되었다!


접근 제어자의 종류

  • private: 모든 외부 클래스 호출을 막는다.
  • pacakge-private: 같은 패키지 안에서의 호출은 허용한다.
  • protected: 같은 패키지 안에서의 호출은 허용한다.
    • 패키지가 달라도 상속관계일 경우, 호출을 허용한다.
  • public: 모든 외부 호출을 허용한다.

아래 순서로 public이 가장 많이 허용한다.
public > protected > package-private > private

❓ package-private

접근제어자를 명시하지 않으면 해당 접근제어자가 적용된다.
다른말로 default 접근제어자 라고도 한다.

💡 접근제어자의 핵심은

속성과 메서드를 외부로부터 숨기는 것이다.


클래스 레벨에서의 접근제어자

  • 클래스 레벨에서는 public, default만 사용할 수 있다.
  • public 클래스는 반드시 파일명과 클래스명이 같아야 한다.
// PublicClass.java

public class PublicClass {
    private String name;
    private String type;
}

class DefaultClass1{
    private String name;
    private String type;
}

class DefaultClass2 {
    private String name;
    private String type;
}
  • 클래스 파일에서 default 접근제어자를 사용하는 클래스는 계속 만들 수 있다.
  • public 접근 제어자를 사용하는 클래스는 단 1개만 생성할 수 있다.
  • 다른 패키지에서 PublicClass는 접근이 가능하지만,
    DefaultClass는 접근이 불가능하다. default 접근제어자가 붙어있기 때문에!

접근제어자에 대한 이론적인 부분을 정리해봤다.
더 나아가 캡슐화를 JAVA 보자.


출처

인프런 김영한의 실전 자바 - 기본편

profile
wannabe---ing

0개의 댓글