| 접근 제한자 | 접근 범위 | 설명 | 사용 예시 |
|---|---|---|---|
public | 모든 클래스에서 접근 가능 | 패키지, 클래스, 상속 관계 상관없이 접근 가능 | 공용 API, 유틸 메서드 |
protected | 같은 패키지 + 상속받은 자식 클래스 | 외부 패키지라도 상속관계면 접근 가능 | 상속 구조에서 일부 허용 |
| (default) (package-private) | 같은 패키지 | 접근 제한자를 쓰지 않으면 기본 적용 | 패키지 내부 전용 기능 |
private | 같은 클래스 내부 | 외부 접근 완전 차단 | 필드, 헬퍼 메서드 은닉 |
1. public
어디서든 접근 가능
라이브러리의 API처럼 외부에서 쓰여야 하는 기능에 사용
public class MyClass {
public void printHello() {
System.out.println("Hello");
}
}
2. protected
같은 패키지 내에서는 자유롭게 접근 (package-private)
다른 패키지라도 상속받은 클래스에서 접근 가능
package a;
public class Parent {
protected void hello() {
System.out.println("Hello from Parent");
}
}
package b;
import a.Parent;
public class Child extends Parent {
public void callHello() {
hello(); // 상속받았으므로 접근 가능
}
}
3. default (package-private)
접근 제한자를 명시하지 않으면 기본 적용
같은 패키지에서만 접근 가능
class MyClass { // default 접근 제한
void printMsg() {
System.out.println("Same package only");
}
}
4. private
같은 클래스 내부에서만 접근 가능
외부에서 직접 수정/접근을 막아 데이터 은닉 구현
public class User {
private String password;
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
}
최상위 클래스(Top-level class) 는 public 또는 default(package-private)만 가능
import가 불가능내부 클래스(Inner Class) 는 4가지 모두 사용 가능
public class OuterClass { // ✅ 최상위 클래스
class InnerClass { // ❌ 최상위 아님 → 내부 클래스
}
}
public → 무제한 접근
protected → 같은 패키지 + 상속 관계 허용
default → 같은 패키지에서만
private → 해당 클래스 내부에서만