자바 접근 제어자(Access Modifier) 정보 은닉과 캡슐화를 위한 필수 지식
자바 접근 제어자(Access Modifier)는 클래스·필드·메서드·생성자의 접근 범위를 조절해 정보 은닉과 모듈화를 보장하는 핵심 장치입니다. 적절한 접근 제어는 코드의 안정성·가독성·재사용성을 크게 높여 줍니다.
접근 제어자의 4가지 종류
| 접근 제어자 | 접근 범위 | 대표 용도 |
|---|---|---|
public |
모든 패키지·모든 클래스 | 외부에 공개할 API |
protected |
같은 패키지 + 상속받은 클래스 | 상속 전용 멤버 공유 |
| (default) | 같은 패키지 | 패키지 내부 전용 유틸 |
private |
선언 클래스 내부 | 캡슐화·데이터 보호 |
1. private — 가장 강력한 정보 은닉
public class Account {
private int balance; // 외부 직접 접근 차단
public int getBalance() { // 간접 접근
return balance;
}
public void deposit(int amt) {
if (amt > 0) balance += amt;
}
}
- 장점 : 내부 구현 변경 시 외부 영향 최소화
- Tip : 필드는 기본적으로
private, 외부 노출은 Getter/Setter만
2. (default) — 패키지 전용 접근
class PackageHelper { // 키워드 없음 → default
void log(String msg) { ... } // 같은 패키지에서만 호출
}
- 활용 : 동일 패키지 모듈 간 헬퍼 클래스
- 주의 : 다른 패키지에선 보이지 않아 협업 시 의도치 않은 제한 발생 가능
3. protected — 패키지 + 상속 관계
package animal;
public class Animal {
protected String name;
}
package zoo;
import animal.Animal;
public class Tiger extends Animal {
void roar() { System.out.println(name + " roars!"); } // OK
}
- 사용 : 자식 클래스에게만 노출할 공통 로직
- 주의 : 무분별한
protected남용은 설계 결합을 높임
4. public — 공개 API
public class StringUtils {
public static String capitalize(String s){ ... } // 어디서나 호출
}
- 역할 : 라이브러리·도메인 모델의 외부 계약
- Tip : 공개 범위가 넓을수록 변경 비용 ↑, 꼭 필요한 멤버만
public
접근 범위 한눈에 보기
| 같은 클래스 | 같은 패키지 | 자식 클래스 | 외부 패키지 | |
|---|---|---|---|---|
public |
✅ | ✅ | ✅ | ✅ |
protected |
✅ | ✅ | ✅ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
private |
✅ | ❌ | ❌ | ❌ |
접근 제어 설계 Best Practice
- 필드는 무조건
private+ Getter/Setter - 상속 고려 멤버만
protected - 패키지 모듈 유틸은 default
- 외부 API 최소한만
public - IDE 기능(Encapsulation, Generate Getter/Setter) 적극 활용
질문 정리
Q1. protected와 default 차이가 헷갈려요.
protected→ 패키지 + 상속- default → 패키지 한정 (상속 무관)
Q2. private 필드가 많은데 성능에 문제 없나요?
접근 제어는 컴파일 단계 정보이므로 런타임 성능에 거의 영향 없습니다.
Q3. 패키지 이름만 달리해 같은 클래스명을 써도 괜찮을까요?
가능하지만 가독성·의존성이 떨어질 수 있어 의미 있는 패키지 구조가 중요합니다.
Q4. public 필드를 쓰면 안 되나요?
데이터 무결성·유연성 관점에서 권장되지 않습니다. 필드 변경 로직을 메서드로 캡슐화하세요.
Q5. 모듈 시스템(JPMS)에서도 접근 제어자가 동일하게 적용되나요?
네. 다만 module-info.java 로 공개/은닉 패키지를 추가로 제어할 수 있습니다.
댓글남기기