→ private : 같은 클래스 내에서만 접근이 가능합니다
→ default(nothing) : 같은 패키지 내에서만 접근이 가능합니다.
→ protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능합니다.
→ public : 접근 제한이 전혀 없습니다.
👉 위의 설명을 토대로 접근 범위에 대해 정리를 하면 다음과 같습니다.
(좁음) (넓음)
private → default → protected → public
public class Main {
public static void main(String[] args) {
}
}
예제를 위해 java 디렉토리에 오른쪽 마우스를 누르고 new → package 를 클릭하고, pkg
라는 이름의 package를 만듭니다.
pkg
디렉토리 내부에 ModiferTest 클래스를 만듭니다.
ModifierTest.java
package pkg;
public class ModifierTest {
private void messageInside() {
System.out.println("This is private modifier");
}
public void messageOutside() {
System.out.println("This is public modifier");
messageInside();
}
protected void messageProtected() {
System.out.println("This is protected modifier");
}
}
Main.java
import pkg.ModifierTest;
class Child extends ModifierTest {
void callParentProtectedMember() {
System.out.println("Call my parent's protected method");
super.messageProtected();
}
}
public class Main {
public static void main(String[] args) {
ModifierTest modifierTest = new ModifierTest();
modifierTest.messageOutside();
// modifierTest.messageInside(); // compile error
// modifierTest.messageProtected(); // compile error
Child child = new Child();
child.callParentProtectedMember();
}
}
💡 위 예제를 실행해보면 어떻게 결과가 나오나요? 분명, access에 대한 컴파일 오류가 발생할 것입니다. 이처럼 접근 제어자를 통하여 접근할 수 있는 범위가 제한되곤 합니다.
👉 그렇다면 왜 접근 제어자를 사용하지?
- 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것입니다.
- 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생깁니다.
- 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서!
- 이런 것을 캡슐화(encapsulation)라고 합니다.
- 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구입니다.