Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java protected vs default 접근 제어자 차이점 완벽 정리

핵심 요약

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.

두 접근 제어자 비교 정리

접근 위치protecteddefault
같은 패키지접근 가능접근 가능
다른 패키지의 서브클래스접근 가능접근 불가
다른 패키지의 일반 클래스접근 불가접근 불가

결론적으로 두 접근 제어자의 결정적인 차이는 상속 관계에서의 접근 허용 여부입니다. 패키지 외부의 하위 클래스에게도 기능 확장을 허용하고 싶다면 protected를, 오직 같은 패키지 내부에서만 사용하도록 제한하고 싶다면 default를 선택하는 것이 좋습니다.