protected vs default (package-private) 접근 제어자 차이점

허성재's avatar
Aug 14, 2024
protected vs default (package-private) 접근 제어자 차이점
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) 접근 제어자 차이점

  1. 접근 범위:
      • protected: 같은 패키지 내의 모든 클래스와 상속 관계에 있는 자식 클래스에서 접근할 수 있습니다.
      • default: 같은 패키지 내의 클래스에서만 접근할 수 있으며, 패키지가 다른 클래스에서는 접근할 수 없습니다.
  1. 상속 시 접근 가능성:
      • protected: 상속을 통해 패키지가 다른 경우에도 자식 클래스에서 접근할 수 있습니다.
      • default: 상속 관계와 관계없이 패키지가 다르면 접근할 수 없습니다. 패키지가 다르면 접근할 수 없으므로, 상속이 있어도 다른 패키지에서는 접근할 수 없습니다.

결론

  • protected 접근 제어자는 클래스의 멤버가 상속받은 자식 클래스에서 접근할 수 있게 하며, 같은 패키지 내에서도 접근할 수 있습니다. 따라서 상속 구조에서 유용하게 사용됩니다.
  • default (package-private) 접근 제어자는 같은 패키지 내에서만 접근할 수 있게 하며, 패키지가 다른 클래스에서는 접근할 수 없습니다. 이 접근 제어자는 패키지 내부에서만 사용될 때 적합합니다.
Share article

heo-gom