접근 제어자
클래스, 메서드, 변수에 대한 외부 접근 범위를 제한하는 키워드입니다.
4가지 접근 제어자
| 제어자 | 같은 클래스 | 같은 패키지 | 자식 클래스 | 외부 |
|---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | X |
default (없음) | O | O | X | X |
private | O | X | X | X |
package com.example;
public class Person {
public String name; // 어디서든 접근 가능
protected int age; // 같은 패키지 + 자식 클래스
int height; // 같은 패키지만 (default)
private String ssn; // 이 클래스 내부만
}
캡슐화와의 관계
필드는 private으로 감추고, 필요한 경우만 public getter/setter로 노출하는 것이 캡슐화의 기본.
public class Account {
private long balance; // 외부 직접 접근 차단
public long getBalance() { return balance; }
public void deposit(long amount) {
if (amount <= 0) throw new IllegalArgumentException();
this.balance += amount; // 검증 로직을 통해서만 변경
}
}
상속에서의 주의점
자식 클래스가 메서드를 오버라이딩할 때 접근 범위를 좁힐 수 없음 (넓히는 것만 가능).
class Parent {
protected void method() {}
}
class Child extends Parent {
public void method() {} // O protected → public (확장 가능)
// private void method() {} // X 컴파일 에러 (범위 축소 불가)
}
핵심 정리
-
private→default→protected→public순으로 접근 범위 확장 -
필드는
private, 외부에 노출할 동작만public— 캡슐화의 기본 원칙 -
오버라이딩 시 접근 범위는 같거나 넓게만 변경 가능