<aside> 📃
스피커 개발 요구 사항
public class Speaker{
int volume;
...
void volumeUp(){
if(volume >= 100){
System.out.println("음량을 증가할 수 없습니다.");
}
else{
volume += 10;
}
}
}
public class SpeakerMain{
speaker.volume = 200;
}
Speaker 객체를 사용하는 사용자는 Speaker의 volume 필드와 메서드에 모두 접근이 가능
→ volumeUP()
메서드를 통해 음량이 100을 넘지 못하도록 개발했지만 Speaker
에서 volume
필드에 직접 접근해 원하는 값을 설정할 수 있기 때문에 소용이 없음.
⇒ 근본적 해결 방법 : volume
필드를 Speaker
클래스 외부에서 접근하지 못하도록 막는 것!
✅ 해결 방법
public class Speaker{
private int volume;
}
//필드에 직접 접근
System.out.println("volume 필드 직접 접근 수정");
speaker.volume = 200; //private 접근 오류
// 컴파일 오류 메시지
volume has private access in access.Speaker
private
: 모든 외부 호출을 거부default(package-private)
: 같은 패키지 안에서의 호출 허용protected
: 같은 패키지 안에서의 호출 허용, 패키지 달라도 상속관계의 호출 허용public
: 모든 외부 호출 허용차단 범위 : private → default → protected → public
📦 package-private
접근 제어자를 명시하지 않으면 같은 패키지 안에서 호출을 허용하는
default
접근 제어자가 적용 기본값으로 사용되기에default
라는 용어를 사용하나,package-private
가 더 정확한 표현이다. 두 용어를 함께 사용한다.