접근 제어자
접근 제어자는 멤버 변수/함수 혹은 클래스에 사용되며 외부에서의 접근을 제한하는 역할을 한다.
private : 같은 클래스 내에서만 접근이 가능하다.
default(nothing) : 같은 패키지 내에서만 접근이 가능하다.
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public : 접근 제한이 전혀 없다.
private - default - protected -pulbic 순으로 접근 범위가 넓다.
예제를 위해 패키지 하나와 클래스 하나를 새로 생성했다.
package pkg;
public class ModifierTest {
private void messageInside(){
System.out.println("This is private");
}
public void messageOutside(){
System.out.println("this is public");
messageInside();
}
protected void messageProtected(){
System.out.println("this is protected");
}
}
그리고 기존의 Main클래스에서 Modifier메소드의 값을 불러와 봤다.
import pkg.ModifierTest;
class Child extends ModifierTest{
void callParentProtected(){
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();
Child child = new Child();
child.callParentProtected();
}
}
pkg.ModifierTest를 임포트해야 정상적으로 값을 불러올 수 있다.
ModifierTest를 부모로 상속받는 자식 클래스 Child를 만들어주고, 메세지하나와 messageProtected()메서드를 상속받게 했다.
그후, Main 클래스에서 ModifierTest의 인스턴스를 하나 생성하고, 접근제한자가 public인 messageOutside()메서드를 호출했다. 이때 값은 messageOutside()메서드와 messageInside()메서드가 모두 출력된다.
같은 클래스 내에서만 접근이 가능한 private 접근자를 사용한 messageInside()메서드가 출력된 이유는 같은 클래스인 messageOutside()메서드 내에서messageInside()를 호출했기 때문이다.
이는 곧, private접근자를 사용했어도, 필요한 경우 public접근자를 사용한 클래스를 이용해 다른 패키지나 클래스에서도 함께 호출해내는 식으로 활용할 수 있다는 뜻이다.
마지막으로 자식 클래스 Child의 인스턴스를 생성해 messageProtected()메서드를 불러냈다.
protected 접근 제어자는 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하기 때문에 문제없이 잘 출력이 된다.
마지막으로, 접근제어자를 따로 쓰지 않으면 private가 기본적으로 적용이 된다.