제어자 |
같은 클래스 |
같은 패키지 |
자식 클래스 (다른 패키지) |
외부 클래스 |
---|---|---|---|---|
public |
O |
O |
O |
O |
protected |
O |
O |
O |
X |
(default) |
O |
O |
X |
X |
private |
O |
X |
X |
X |
(default): 접근 제어자를 명시하지 않은 경우
자식 클래스가 부모 클래스의 protected 멤버에 접근하려면 상속을 받아야 함
어디서든 접근 가능
클래스, 메서드, 생성자, 필드 등에 사용
외부에서 자주 사용할 API에는 public을 사용
public class Car {
public String model;
public void start() {
System.out.println("시동을 켭니다.");
}
}
해당 클래스 내부에서만 접근 가능
외부 클래스나 하위 클래스에서도 접근 불가
가장 제한적인 접근 제어자
일반적으로 **멤버 변수(필드)**에 사용하여 직접 접근을 막고, getter/setter를 통해 간접적으로 접근하게 함
public class Car {
private String engineNumber;
public String getEngineNumber() {
return engineNumber;
}
public void setEngineNumber(String number) {
this.engineNumber = number;
}
}
같은 패키지 또는 다른 패키지의 자식 클래스에서 접근 가능
상속 시에 주로 사용됨
외부에는 노출하지 않으면서, 자식 클래스에서는 사용하도록 허용하는 경우 유용
public class Animal {
protected void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
public void bark() {
makeSound(); // 가능
}
}
접근 제어자를 명시하지 않으면 default 접근으로 간주
같은 패키지 내에서만 접근 가능
다른 패키지에서는 접근 불가
class House {
void openDoor() {
System.out.println("문을 엽니다.");
}
}
사용 대상 |
가능 제어자 |
---|---|
클래스 |
public, (default) |
필드 |
public, protected, private, (default) |
메서드 |
public, protected, private, (default) |
생성자 |
public, protected, private, (default) |
클래스에는 private 또는 protected 사용 불가
클래스가 public이면 파일 이름과 클래스 이름이 같아야 함
public class BankAccount {
private int balance;
public void deposit(int amount) {
if (amount > 0)
balance += amount;
}
public int getBalance() {
return balance;
}
}
balance는 private으로 외부에서 직접 접근 금지
deposit()과 getBalance()를 통해 제한된 접근 허용
제어자 |
사용 위치 |
접근 허용 범위 |
---|---|---|
public |
클래스, 필드, 메서드 |
모든 클래스에서 접근 가능 |
protected |
필드, 메서드 |
같은 패키지 + 다른 패키지 자식 클래스 |
(default) |
클래스, 필드, 메서드 |
같은 패키지 내에서만 접근 가능 |
private |
필드, 메서드, 생성자 |
선언된 클래스 내부에서만 접근 가능 |
접근 제어자는 클래스 구성 요소에 대한 접근 범위를 명확히 지정함으로써 코드의 안정성과 보안성을 높여줍니다.
특히 객체지향 설계에서 캡슐화와 은닉성을 구현할 때 필수적인 도구입니다.
개발 시에는 최소한의 공개 범위를 유지하는 정보 은닉 원칙을 따르는 것이 좋습니다.