자바는 객체 지향의 캡슐화(Encapsulation)를 구현하기 위해 접근제어자(Access Modifier)를 사용한다.
접근제어자는 클래스, 변수, 메서드가 다른 클래스/패키지/상속 관계에서 어느 범위까지 접근 가능한지를 결정.
1. 자바 접근제어자 종류
| 접근제어자 | 클래스 내 | 같은 패키지 | 상속관계 | 다른 패키지 |
| public | O | O | O | O |
| protected | O | O | O | X |
| (default) | O | O | X | X |
| private | O | X | X | X |
1) public
- 어디서든 접근 가능.
- 다른 패키지, 다른 클래스에서도 사용 가능.
- 주로 라이브러리 API, 유틸리티, 공개 메서드에서 사용.
2) protected
- 같은 패키지 + 상속받은 자식 클래스에서 접근 가능.
- 다른 패키지의 경우 상속 관계가 있어야 접근 가능.
- 주로 상속 관계에서 자식 클래스만 접근 가능하도록 할 때 사용.
3) (default) (접근제어자를 쓰지 않음)
- 같은 패키지에서만 접근 가능.
- 패키지 외부, 상속 관계에서도 접근 불가.
- "패키지 프라이빗(package-private)"라고 부르기도 함.
- 같은 기능 묶음(패키지) 안에서만 사용하게 하고 외부에는 숨기고 싶을 때 사용.
4) private
- 해당 클래스 내부에서만 접근 가능.
- 다른 클래스, 자식 클래스, 같은 패키지에서도 접근 불가.
- 데이터 은닉(Encapsulation) 을 구현하기 위해 사용.
- 멤버 변수는 private, 접근은 public getter/setter로 제공하는 것이 OOP의 일반적인 습관(캡슐화를 위해).
2. 클래스에 접근제어자 사용
- public, (default)만 사용 가능.
- protected, private는 클래스 선언에 사용할 수 없음.
- 클래스 자체를 외부에서 사용 가능하게 할지(공개), 패키지 내부에서만 사용할지(숨김)를 결정할 때 사용.
3. 접근제어자와 캡슐화의 관계
- 접근제어자는 데이터 보호, 의도하지 않은 사용 방지, 유지보수성을 높이기 위해 필수적.
- 멤버 변수는 private으로 숨기고, 외부에는 public 메서드를 통해서만 접근하도록 제한:
- 외부에서는 직접 balance를 변경할 수 없고 deposit, getBalance 메서드를 통해서만 관리.
public class Account {
private int balance;
public int getBalance() { return balance; }
public void deposit(int amount) { this.balance += amount; }
}
4. 정리
✅ public: 언제 어디서든 접근 가능 (공개 API, 유틸리티, Controller, Service Interface)
✅ protected: 상속 + 같은 패키지 접근 허용 (상속 확장용 메서드에서 활용)
✅ (default): 같은 패키지 접근만 허용, 의존성 낮추기 위해 내부용으로 자주 사용
✅ private: 해당 클래스 내부에서만 사용, 캡슐화 및 내부 로직 은닉용
'Study > Java' 카테고리의 다른 글
| 정적 멤버와 static (0) | 2025.07.08 |
|---|---|
| 인스턴스 멤버와 this (0) | 2025.07.08 |
| 상속(Inheritance)와 다형성(Polymorphism) (0) | 2025.07.07 |
| 캡슐화(Encapsulation) (0) | 2025.07.06 |
| JAVA 기본 개념(배열, 연산자, 조건문, 반복문) (0) | 2025.07.06 |