접근제어자가 왜 필요한지 아래 예시를 통해 알아보자.
// ✅ 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
키워드를 사용하여
volume 속성을 함부로 접근하지 못하게 설정하고,
Speaker 클래스 내부에서만 접근할 수 있도록 해보자.
```java
// ✅ Speaker 클래스
public class Speaker(){
private int volume; // ✅ private 적용
...
}
이제 신입개발자가 실수로 속성에 직접 접근하려고 해도,
컴파일에러가 발생하여 스피커의 부품들이 과부하에 걸릴 일은 없게 되었다!
아래 순서로 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개만 생성할 수 있다.default
접근제어자가 붙어있기 때문에!접근제어자에 대한 이론적인 부분을 정리해봤다.
더 나아가 캡슐화를 JAVA 보자.
인프런 김영한의 실전 자바 - 기본편