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
필드와 메서드에 접근할 수 있다.💡 참고 : 생성자도 접근 제어자 관점에서 메서드와 같다.