
✅ 필드, 메서드 레벨의 접근 제어자
✏️ 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 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 필드와 메서드에 모두 접근할 수 있다.
🖥️ 실행 결과

✏️ AccessOuterMain
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 필드와 메서드에 접근할 수 있다.
🖥️ 실행 결과

💡 참고 : 생성자도 접근 제어자 관점에서 메서드와 같다.
'Back-end > Java' 카테고리의 다른 글
| [Java - 기본] 캡슐화 (0) | 2024.04.14 |
|---|---|
| [Java - 기본] 접근 제어자 사용 - 클래스 레벨 (0) | 2024.04.14 |
| [Java - 기본] 접근 제어자 종류 (0) | 2024.04.13 |
| [Java - 기본] 접근 제어자 이해2 (0) | 2024.04.13 |
| [Java - 기본] 접근 제어자 이해1 (0) | 2024.04.13 |