핵심 요약
protected 접근 제어자는 같은 패키지 내에서 접근할 수 있을 뿐만 아니라 서브클래스(하위 클래스)에서도 접근할 수 있습니다. 반면 default(접근 제어자 미지정)는 패키지 레벨 접근 제어자로, 같은 패키지 안에서만 접근이 허용됩니다.
protected 접근 제어자란?
- protected는 같은 패키지 내부에서는 public처럼, 패키지 외부에서는 private처럼 동작합니다.
- 단, 패키지 외부라도 서브클래스 객체에 대해서는 public처럼 접근을 허용합니다.
- 최상위(top-level) 클래스나 인터페이스에는 protected를 적용할 수 없습니다. protected는 클래스의 멤버인 필드, 메서드, 생성자에만 사용할 수 있습니다.
- 슈퍼클래스에서 protected로 선언된 필드, 메서드, 생성자는 다른 패키지에 있더라도 그 서브클래스만 접근할 수 있습니다.
- 같은 패키지에 속한 클래스들은 protected 멤버를 가진 클래스의 서브클래스가 아니어도 protected 필드, 메서드, 생성자에 자유롭게 접근할 수 있습니다.
예제 코드
public class ProtectedTest {
// protected로 선언된 변수
protected int age = 30;
protected String name = "Adithya";
/**
* 이 메서드는 protected로 선언되었습니다.
*/
protected String getInfo() {
return name + " is " + age + " years old.";
}
public static void main(String[] args) {
System.out.println(new ProtectedTest().getInfo());
}
}
실행 결과
Adithya is 30 years old.
default 접근 제어자란?
- 클래스의 멤버를 아무 접근 제어자 없이 선언하면 자동으로 default 접근 수준이 적용됩니다.
- default 역시 같은 패키지 내부에서는 public처럼, 패키지 외부에서는 private처럼 동작합니다.
- 클래스의 default 멤버는 같은 패키지 안의 모든 코드에서 사용할 수 있지만, 어떤 경우에도 패키지 외부에서는 접근할 수 없습니다.
- default는 접근을 패키지 레벨로만 제한하기 때문에, default 멤버를 가진 클래스를 상속했더라도 다른 패키지에서는 해당 멤버에 접근할 수 없습니다.
예제 코드
public class DefaultTest {
// 접근 제어자가 지정되지 않은 변수
int age = 25;
String name = "Jai";
/**
* 이 메서드는 default 접근 제어자로 선언되었습니다.
*/
String getInfo() {
return name + " is " + age + " years old.";
}
public static void main(String[] args) {
System.out.println(new DefaultTest().getInfo());
}
}
실행 결과
Jai is 25 years old.
두 접근 제어자 비교 정리
| 접근 위치 | protected | default |
|---|---|---|
| 같은 패키지 | 접근 가능 | 접근 가능 |
| 다른 패키지의 서브클래스 | 접근 가능 | 접근 불가 |
| 다른 패키지의 일반 클래스 | 접근 불가 | 접근 불가 |
결론적으로 두 접근 제어자의 결정적인 차이는 상속 관계에서의 접근 허용 여부입니다. 패키지 외부의 하위 클래스에게도 기능 확장을 허용하고 싶다면 protected를, 오직 같은 패키지 내부에서만 사용하도록 제한하고 싶다면 default를 선택하는 것이 좋습니다.