이번 글에서는 클래스 내부 필드와 메서드에 적용된
접근 제한자(public, default, private)가
같은 패키지 또는 다른 패키지에서 접근할 때
어떤 영향을 미치는지 실습을 통해 확인합니다.
📦 클래스 코드 (A.java)
package ch06.sec13.exam03.package1;
public class A {
public int field1;
int field2;
private int field3;
public A() {
field1 = 1;
field2 = 1;
field3 = 1;
method1();
method2();
method3();
}
public void method1() {
}
void method2() {
}
private void method3() {
}
}
📦 클래스 코드 (B.java)
package ch06.sec13.exam03.package1;
public class B {
public void method() {
A a = new A();
a.field1 = 1; // (O) public
a.field2 = 1; // (O) default - 같은 패키지라서 가능
a.field3 = 1; // (X) private - 접근 불가
a.method1(); // (O) public
a.method2(); // (O) default - 같은 패키지라서 가능
a.method3(); // (X) private - 접근 불가
}
}
📦 클래스 코드 (C.java)
package ch06.sec13.exam03.package2;
import ch06.sec13.exam03.package1.A;
public class C {
public C() {
A a = new A();
a.field1 = 1; // (O) public
a.field2 = 1; // (X) default - 다른 패키지라서 접근 불가
a.field3 = 1; // (X) private - 접근 불가
a.method1(); // (O) public
a.method2(); // (X) default - 다른 패키지라서 접근 불가
a.method3(); // (X) private - 접근 불가
}
}
💬 코드 설명
- public
→ 어디서든 접근 가능 (같은 패키지 + 다른 패키지 모두)
- default (아무 키워드 없음)
→ 같은 패키지 안에서는 접근 가능, 다른 패키지에서는 접근 불가
- private
→ 클래스 내부에서만 접근 가능. 다른 클래스에서는 절대 접근 불가
📌 간단 정리
접근 제한자 |
같은 패키지 |
다른 패키지 |
같은 클래스 내부 |
public |
O |
O |
O |
default (생략) |
O |
X |
O |
private |
X |
X |
O |
💻 실행 결과
- B 클래스에서는 field1, field2, method1(), method2() 사용 가능
→ field3, method3() 사용 불가 (private 때문)
- C 클래스에서는 field1, method1()만 사용 가능
→ field2, field3, method2(), method3() 모두 접근 불가
💡 포인트 정리
- public은 모두에게 공개
- default는 같은 패키지끼리만 공개
- private은 자기 클래스 내부에서만 사용 가능
- 다른 패키지에서 접근하려면 반드시 public이어야 함
- private 필드는 외부에서 직접 수정하거나 읽을 수 없기 때문에 getter/setter를 통해 우회 접근함