
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을 포함한 모든 곳에 접근할 수 있다.package access.a;
public class AccessInnerMain {
public static void main(String[] args) {
AccessData data = new AccessData();
// public 호출 가능
data.publicField = 1;
data.publicMethod();
// 같은 패키지 default 호출 가능
data.defaultField = 2;
data.defaultMethod();
// private 호출 불가
// data.privateField = 3;
// data.privateMethod();
data.innerAccess();
}
}
package access.a이다. 패키지 위치를 꼭 맞추어야 한다.public은 모든 접근을 허용하기 때문에 필드, 메서드 모두 접근 가능하다.default는 같은 패키지에서 접근할 수 있다. AccessInnerMain은 AccessData와 같은 패키지이다. 따라서 default 접근 제어자에 접근할 수 있다.private은 AccessData 내부에서만 접근할 수 있다. 따라서 호출 불가다.AccessData.innerAccess() 메서드는 public이다. 따라서 외부에서 호출할 수 있다.innerAccess() 메서드는 외부에서 호출되었지만 innerAccess() 메서드는 AccessData에 포함되어 있다. 이 메서드는 자신의 private 필드와 메서드에 모두 접근할 수 있다.
package access.b;
import access.a.AccessData;
public class AccessOuterMain {
public static void main(String[] args) {
AccessData data = new AccessData();
// public 호출 가능
data.publicField = 1;
data.publicMethod();
// 다른 패키지 default 호출 불가
// data.defaultField = 2;
// data.defaultMethod();
// private 호출 불가
// data.privateField = 3;
// data.privateMethod();
data.innerAccess();
}
}
package access.b이다. 패키지 위치를 꼭 맞추어야 한다.public은 모든 접근을 허용하기 때문에 필드, 메서드 모두 접근할 수 있다.default는 같은 패키지에서 접근할 수 있다. access.b.AccessOuterMain은 access.a.AccessData와 다른 패키지이다. 따라서 default 접근 제어자에 접근할 수 없다.private는 AccessData 내부에서만 접근할 수 있다. 따라서 호출 불가이다.AccessData.innerAccess() 메서드는 public이다. 따라서 외부에서 호출할 수 있다.innerAccess() 메서드는 외부에서 호출되었지만 해당 메서드 안에서는 자신의 private 필드와 메서드에 접근할 수 있다.
💡 참고 : 생성자도 접근 제어자 관점에서 메서드와 같다.