다양한 상황에 따른 접근 제어자를 확인해보자.
지금부터는 패키지 위치가 매우 중요하다. 패키지 위치에 주의하자.
AccessData
package access.a;
public class AccessData {
public int publicField;
int defaultField;
private int privateField;
public void publicMethod() {
System.out.println("publicMethod() 호출됨." + publicField);
}
void defaultMethod() {
System.out.println("defaultMethod() 호출됨." + defaultField);
}
private void privateMethod() {
System.out.println("privateMethod() 호출됨." + privateField);
}
public void innerAccess() {
System.out.println("내부 호출");
publicField = 100;
defaultField = 200;
privateField = 300;
publicMethod();
defaultMethod();
privateMethod();
}
}
패키지 위치는 package access.a 이다. 패키지 위치를 꼭 맞추어야 한다. 주의하자.
순서대로 public, default, private 을 필드와 메서드에 사용했다.
마지막에 innerAccess() 가 있는데, 이 메서드는 내부 호출을 보여준다. 내부 호출은 자기 자신에게 접근하는 것이다. 따라서 private 은 포함한 모든 곳에 접근할 수 있다.
이제 외부에서 이 클래스에 접근해보자.
AccessInnerMain
package access.a;
public class AccessInnerMain {
public static void main(String[] args) {
AccessData accessData = new AccessData();
// 호출 가능
accessData.publicField = 100;
accessData.publicMethod();
// 호출 가능
accessData.defaultField = 200;
accessData.defaultMethod();
// 호출 불가
// accessData.privateField = 300;
// accessData.privateMethod();
accessData.innerAccess();
}
}
publicMethod() 호출됨.100
defaultMethod() 호출됨.200
내부 호출
publicMethod() 호출됨.100
defaultMethod() 호출됨.200
privateMethod() 호출됨.300
AccessOuterMain
package access.b;
import access.a.AccessData;
public class AccessOuterMain {
public static void main(String[] args) {
AccessData accessData = new AccessData();
// 호출 가능
accessData.publicField = 100;
accessData.publicMethod();
// 호출 불가
// accessData.defaultField = 200;
// accessData.defaultMethod();
// 호출 불가
// accessData.privateField = 300;
// accessData.privateMethod();
accessData.innerAccess();
}
}
publicMethod() 호출됨.100
내부 호출
publicMethod() 호출됨.100
defaultMethod() 호출됨.200
privateMethod() 호출됨.300