아래의 내용은 java_grammer 레파지토리 C03Inheritance 디렉터리에 저장되어있는 내용을 정리함
자바에서 클래스에 사용할 수 있는 접근제어자는 public과 default(생략형) 두 가지뿐임.
| 접근제어자 | 접근 범위 | 설명 |
|---|---|---|
| public | 프로젝트 전체 | 모든 패키지, 클래스에서 접근 가능 |
| default | 같은 패키지 | 접근제어자를 명시하지 않았을 때 기본값으로 적용됨 |
package C03Inheritance;
public class C04ProtectedClass {
// 변수, 메서드 접근제어자 정리
public String st1 = "hello java 1";
private String st2 = "hello java 2";
String st3 = "hello java 3"; // default
protected String st4 = "hello java 4";
}
| 접근제어자 | 접근 가능 범위 | 특징 |
|---|---|---|
| public | 프로젝트 전체 | 모든 클래스, 패키지에서 접근 가능 |
| protected | 동일 패키지 + 상속받은 클래스 | 상속관계라면 다른 패키지에서도 접근 가능 |
| default | 동일 패키지 | 접근제어자를 명시 안 하면 기본으로 적용되는 값 |
| private | 해당 클래스 내부 | 외부 클래스나 상속 관계에서도 접근 불가 |
접근 범위는 다음 순서로 넓어지는 것임.
private < default < protected < public
package C03Inheritance;
public class C05ProtectedTest {
public static void main(String[] args) {
C04ProtectedClass c1 = new C04ProtectedClass();
System.out.println(c1.st1); // public
//System.out.println(c1.st2); // private (접근 불가)
System.out.println(c1.st3); // default
System.out.println(c1.st4); // protected
}
}
위 코드에서는 C04ProtectedClass의 각 변수들이 어떤 접근 범위를 가지는지 확인하는 예제임.
st1은 public이므로 어디서든 접근 가능함. st2는 private이므로 클래스 내부에서만 접근 가능함. (테스트 클래스에서는 접근 불가) st3는 기본값인 default이므로 같은 패키지 내에서는 접근 가능함. st4는 protected이므로 같은 패키지에서는 접근 가능하며, 다른 패키지라도 상속받은 클래스에서는 접근 가능함.protected는 다른 패키지에서는 접근이 제한되지만, 상속 관계일 때는 예외적으로 접근 가능한 특수한 접근제어자임.
즉,
이 차이점 때문에 protected는 상속을 고려한 캡슐화를 구현할 때 자주 사용되는 접근제어자임.
| 구분 | 접근제어자 | 접근 가능 범위 | 비고 |
|---|---|---|---|
| 클래스 | public / default | 전체 / 동일 패키지 | 클래스에는 protected, private 사용 불가 |
| 필드 / 메서드 | public, protected, default, private | 전체 → 동일 패키지 → 상속관계 → 내부 | 접근 수준 조정용 |