접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
- public과 default 접근 제한자의 중간쯤에 해당
- 필드, 생성자, 메소드 선언에 사용될 수 있음
- 같은 패키지에서는 defualt와 같이 접근 제한이 없지만 다른 패키지에서는 자식 클래스만 접근을 허용함
protected 접근제한자 EX)
package package1;
public class A {
protected String field;
protected A() {
}
protected void method() {
}
}
A 클래스
- protected로 선언된 필드, 생성자, 메소드
package package1;
public class B {
public void method() {
A a = new A(); //(o)
a.field = "value"; //(o)
a.method(); //(o)
}
}
B 클래스
- A 클래스와 동일한 패키지 내에 있음
- A 클래스의 protected 필드, 생성자, 메소드에 접근 가능
package package2;
import package1.A;
public class C {
public void method() {
A a = new A(); //(x)
a.field = "value"; //(x)
a.method(); //(x)
}
}
C 클래스
- A 클래스와 다른 패캐지에 있음
- A 클래스의 protected 필드, 생성자, 메소드에 접근할 수 없음
package package2;
import package1.A;
public class D extends A {
public D() {
super(); //(o)
this.field = "value"; //(o)
this.method(); //(o)
}
}
D 클래스
- A 클래스와 다른 패키지에 있지만 A 클래스를 상속받음
- A 클래스의 protected 필드, 생성자, 메소드에 접근 가능
- 단, new 연산자를 사용해서 생성자를 직접 호출할 수는 없고 자식 생성자에서 super()로 A 생성자를 호출할 수 있음.