🔒 접근 제어자 (Access Modifier)
접근 제어자는 자바에서 클래스, 필드(멤버 변수), 메서드, 생성자에 대한 접근 범위를 제한하는 개념이다. 핵심 목적인 **캡슐화(Encapsulation)**를 통해 데이터와 기능을 외부로부터 적절히 보호하고, 코드의 무결성을 유지하는 것에 있다.
- private: 해당 클래스 내부에서만 접근할 수 있어 가장 엄격한 접근 제한을 가진다. 클래스 외부에서는 private 멤버에 직접 접근할 수 없다.
- default (패키지 접근): 접근 제어자를 명시하지 않으면 자동으로 적용된다. 같은 패키지 내에서만 접근이 가능하고 다른 패키지에서는 접근할 수 없다.
- protected: 같은 패키지 내에서만 접근 가능하며, 다른 패키지에 있더라도 해당 클래스를 상속받은 자식 클래스에서는 접근할 수 있다. default + 상속 관계가 추가된 형태다.
- public: 어디서나 접근 가능하도록 공개되어 있다.
🗝️ 접근 제어자의 핵심: 캡슐화
접근 제어자의 가장 중요한 역할은 캡슐화를 구현하는 것이다. 캡슐화는 객체의 내부 구현을 외부에 숨기고, 외부에 노출해야 할 부분만 public 메서드를 통해 간접적으로 접근하도록 한다. 객체 지향에서 직접적인 접근에는 제약을 많이 두지만 간접 접근에 대해서는 완만하다는 점이 돋보인다.
쉬운 예시로, 은행 계좌 클래스에서 잔액(balance) 필드를 private으로 선언하고, deposit()(입금)이나 withdraw()(출금) 같은 public 메서드를 통해 잔액을 조회하거나 입금, 출금 등의 작업을 진행하도록 하면, 외부에서 잔액을 마음대로 변경하여 데이터의 오류를 발생시킬 위험을 줄일 수 있다.
public class BankAccount {
private double balance; // 데이터를 private으로 숨김
public BankAccount(double initialBalance) {
if (initialBalance >= 0) {
this.balance = initialBalance;
} else {
this.balance = 0; // 초기 잔액은 음수가 될 수 없음
}
}
// 잔액을 가져오는 public 메서드 (Getter)
public double getBalance() {
return this.balance;
}
// 입금하는 public 메서드 (Setter)
public void deposit(double amount) {
if (amount > 0) {
this.balance += amount;
System.out.println(amount + "원이 입금되었습니다. 현재 잔액: " + this.balance);
} else {
System.out.println("입금액은 0보다 커야 합니다.");
}
}
// 출금하는 public 메서드 (Setter)
public void withdraw(double amount) {
if (amount > 0 && this.balance >= amount) {
this.balance -= amount;
System.out.println(amount + "원이 출금되었습니다. 현재 잔액: " + this.balance);
} else {
System.out.println("출금액이 잔액보다 많거나, 유효하지 않은 금액입니다.");
}
}
}
위 예시에서 balance는 private이라 외부에서 account.balance = 10000;처럼 직접 접근할 수 없고, deposit() 메서드와 withdraw() 메서드 같은 public 메서드를 통해서만 안전하게 조작할 수 있다.
➡️ 접근 제어자 사용 범위
1. 필드, 메서드, 생성자 레벨
각 멤버(필드, 메서드, 생성자)에 대해 위에서 설명한 네 가지 접근 제어자(private, default, protected, public)를 모두 사용할 수 있다.
2. 클래스 레벨
클래스 자체에 적용되는 접근 제어자는 public과 default 두 가지만 사용 가능하다.
- public 클래스: 어디서든 접근 가능한 클래스다.
- 클래스 이름은 반드시 파일명과 동일해야 한다 (예: public class MyClass는 MyClass.java 파일에 있어야 함).
- 하나의 자바 파일(.java) 안에 public 클래스는 오직 하나만 존재할 수 있다.
- default 클래스 (패키지 접근 클래스): 접근 제어자를 명시하지 않았을 때 기본적으로 적용되는 제어자다.
- 같은 패키지 내에서만 접근 가능하고 다른 패키지에서 이 클래스에 접근할 수 없다.
- 하나의 자바 파일 안에 여러 개의 default 클래스를 선언할 수 있지만, 일반적으로 하나의 파일에 하나의 최상위 클래스만 두는 것이 좋다.
'JAVA' 카테고리의 다른 글
| [JAVA] 자바의 메모리 구조(feat. 클래스 로딩과 인스턴스 생성) (0) | 2025.09.14 |
|---|---|
| [JAVA] 캡슐화란? (0) | 2025.09.14 |
| [JAVA] import 문에 대하여 알아보자. (0) | 2025.09.13 |
| [JAVA] 패키지란? (0) | 2025.09.13 |
| [JAVA] 가비지 컬렉션(GC)와 NPE (0) | 2025.09.13 |