Java에서 **
protected
**와 default
(package-private) 접근 제어자는 클래스 멤버(속성, 메서드 등)에 대한 접근 권한을 제어하는 방법입니다. 두 접근 제어자의 차이점을 이해하는 것은 클래스와 패키지의 접근 범위를 관리하는 데 중요합니다. 아래에서 각각의 접근 제어자와 이들의 차이점을 자세히 설명하겠습니다.1. protected
접근 제어자
- 정의:
protected
는 클래스의 멤버가 같은 패키지 내의 다른 클래스와 상속 관계에 있는 서브클래스에서 접근할 수 있게 하는 접근 제어자입니다.
- 접근 가능 범위:
- 같은 패키지 내의 다른 클래스: 같은 패키지에 있는 다른 클래스에서 접근할 수 있습니다.
- 서브클래스: 상속받은 자식 클래스에서 접근할 수 있습니다. 이 자식 클래스는 같은 패키지에 있거나 다른 패키지에 있을 수 있습니다.
- 예제:
// 부모 클래스
package com.example;
public class Parent {
protected void protectedMethod() {
System.out.println("Protected method in Parent");
}
}
// 자식 클래스
package com.example;
public class Child extends Parent {
public void useProtectedMethod() {
protectedMethod(); // 상속받은 protected 메서드 호출
}
}
// 다른 패키지의 서브클래스
package com.another;
import com.example.Parent;
public class AnotherChild extends Parent {
public void accessProtectedMethod() {
protectedMethod(); // 상속받은 protected 메서드 호출
}
}
2. default
(package-private) 접근 제어자
- 정의:
default
접근 제어자는 접근 제어자를 명시하지 않은 경우 자동으로 적용되는 접근 제어자입니다. 패키지 내에서만 접근할 수 있습니다.
- 접근 가능 범위:
- 같은 패키지 내의 다른 클래스: 같은 패키지에 있는 다른 클래스에서 접근할 수 있습니다.
- 다른 패키지의 클래스: 접근할 수 없습니다.
- 예제:
// 같은 패키지 내 클래스
package com.example;
class PackagePrivateClass {
void packagePrivateMethod() {
System.out.println("Package-private method");
}
}
public class AnotherClass {
public void accessMethod() {
PackagePrivateClass obj = new PackagePrivateClass();
obj.packagePrivateMethod(); // 같은 패키지에서 접근 가능
}
}
// 다른 패키지의 클래스
package com.another;
import com.example.PackagePrivateClass;
public class Test {
public void tryAccess() {
PackagePrivateClass obj = new PackagePrivateClass();
// obj.packagePrivateMethod(); // 컴파일 오류: 접근할 수 없음
}
}
protected
vs. default
(package-private) 접근 제어자 차이점
- 접근 범위:
protected
: 같은 패키지 내의 모든 클래스와 상속 관계에 있는 자식 클래스에서 접근할 수 있습니다.default
: 같은 패키지 내의 클래스에서만 접근할 수 있으며, 패키지가 다른 클래스에서는 접근할 수 없습니다.
- 상속 시 접근 가능성:
protected
: 상속을 통해 패키지가 다른 경우에도 자식 클래스에서 접근할 수 있습니다.default
: 상속 관계와 관계없이 패키지가 다르면 접근할 수 없습니다. 패키지가 다르면 접근할 수 없으므로, 상속이 있어도 다른 패키지에서는 접근할 수 없습니다.
결론
protected
접근 제어자는 클래스의 멤버가 상속받은 자식 클래스에서 접근할 수 있게 하며, 같은 패키지 내에서도 접근할 수 있습니다. 따라서 상속 구조에서 유용하게 사용됩니다.
default
(package-private) 접근 제어자는 같은 패키지 내에서만 접근할 수 있게 하며, 패키지가 다른 클래스에서는 접근할 수 없습니다. 이 접근 제어자는 패키지 내부에서만 사용될 때 적합합니다.
Share article