JAVA의 Super

 

 

JAVA의 Super 키워드

Java에서 super 키워드는 하위 클래스의 직계 상위 클래스를 참조하는 데 사용됩니다. 하위 클래스에 의해 재정의되거나 숨겨질 때 상위 클래스의 멤버(필드 및 메서드)에 액세스하거나 호출하는 데 자주 사용됩니다. super 키워드는 상속을 처리하고 기본 클래스를 확장하는 보다 특화된 클래스를 만들 때 특히 유용합니다.

super 키워드의 주요 용도는 다음과 같습니다.

 

 

상위 클래스 멤버 액세스

하위 클래스가 메서드를 재정의하거나 상위 클래스의 필드를 숨길 때 super를 사용하여 해당 메서드나 필드의 상위 클래스 버전에 액세스할 수 있습니다. 이는 원래 기능 중 일부를 유지하면서 부모 메서드의 동작을 수정하려는 경우에 유용합니다.

class Parent {
    void display() {
        System.out.println("This is the parent class.");
    }
}

class Child extends Parent {
    @Override
    void display() {
        super.display(); // Call parent's display method
        System.out.println("This is the child class.");
    }
}

 

상위 클래스 생성자 호출

하위 클래스가 인스턴스화되면 해당 생성자는 일반적으로 초기화 프로세스의 일부로 상위 클래스의 생성자를 호출해야 합니다. super()를 사용하여 상위 클래스의 생성자를 호출할 수 있습니다.

class Parent {
    Parent(int value) {
        System.out.println("Parent constructor: " + value);
    }
}

class Child extends Parent {
    Child() {
        super(10); // Call parent's constructor with value 10
        System.out.println("Child constructor");
    }
}

 

메서드 모호성 극복

하위 클래스가 인터페이스를 구현하거나 동일한 이름의 메서드가 있는 여러 클래스를 확장하는 경우 ‘super’를 사용하면 메서드 호출 시 모호성을 해결하는 데 도움이 될 수 있습니다.

interface A {
    void display();
}

class Parent {
    void display() {
        System.out.println("Parent's display method");
    }
}

class Child extends Parent implements A {
    @Override
    public void display() {
        super.display(); // Call parent's display method
        System.out.println("Child's display method");
    }
}

 

하위 클래스에 의해 숨겨진 상위 클래스 액세스

하위 클래스가 상위 클래스의 멤버와 동일한 이름을 가진 멤버(필드 또는 메서드)를 정의하는 경우 상위 멤버는 숨겨집니다. super를 사용하여 상위 멤버를 명시적으로 참조할 수 있습니다.

class Parent {
    String name = "Parent";
}

class Child extends Parent {
    String name = "Child";
    
    void displayName() {
        System.out.println(super.name); // Access parent's name
    }
}

 

 

 

super 키워드는 클래스 자체가 아니라 상위 클래스의 인스턴스를 참조하기 때문에 정적 컨텍스트(예: 정적 메서드 또는 정적 블록)에서 사용할 수 없습니다. 또한 super를 사용하여 상위 클래스의 모든 메소드나 필드에 액세스할 수 있는 것은 아니며 하위 클래스에 표시되는 메소드나 필드에만 액세스할 수 있습니다.

‘super’를 효과적으로 사용하면 상속 계층 구조에서 클래스 간의 계층 구조와 관계를 유지하는 데 도움이 됩니다.