상세 컨텐츠

본문 제목

[Java] super, super() 키워드 차이

server

by 셉인 2024. 4. 4. 11:42

본문

728x90
Java에서 super 키워드와 super() 호출은 관련이 있지만 사용 목적이 다르다. 두 구문은 모두 상속 구조에서 사용되며, 자식 클래스가 부모 클래스와 상호작용할 때 필요하다.

 

super() 메서드 : 상위 클래스의 생성자 호출

super : 상위 클래스의 객체 호출

super 키워드

상속 관계의 인스턴스 변수가 같은 이름의 변수일 때 이를 구분하기 위해 사용

만약 키워드를 사용하지 않을 시, 자바 컴파일러는 자신이 속한 인스턴스 객체의 멤버를 먼저 호출하게 된다.

즉, 상위 클래스의 변수를 참조해야 할 경우 super 키워드를 통해 상위 클래스 객체의 멤버 값을 사용 가능

  • super 키워드는 부모 클래스의 멤버(필드, 메서드)에 접근할 때 사용된다.
  • 자식 클래스에서 부모 클래스의 메서드나 변수를 오버라이드했을 때, 원본 부모 클래스의 멤버에 접근하고자 할 때 super를 사용한다.
  • 예: super.parentMethod();는 부모 클래스에 정의된 parentMethod 메서드를 호출한다.

* super와 this의 차이점

super : 상위 클래스 객체의 멤버 값을 참조하기 위해 사용

this : 인스턴스 변수와 매개 변수를 구분하기 위해 사용하며 자기 자신을 지칭

super() 메서드 호출

this()와 유사하게 생성자 안에서만 사용 가능하며, 반드시 첫 줄에 작성해야 한다.

만약 첫 줄에 super()가 없는 경우, 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입하여 실행한다.

  • super()는 부모 클래스의 생성자를 호출하는 데 사용된다.
  • 자식 클래스의 생성자에서 첫 번째 줄에 super()를 사용하여, 해당 객체가 생성될 때 부모 클래스의 생성자도 함께 호출되도록 한다. 이는 부모 클래스의 상태가 적절히 초기화될 수 있도록 보장한다.
  • super()는 매개변수를 포함할 수 있으며, 이 경우 해당하는 부모 클래스의 오버로드된 생성자를 호출한다.
  • 자식 클래스의 생성자에서 super() 호출을 명시적으로 작성하지 않으면, 컴파일러는 부모 클래스의 기본 생성자(super())를 자동으로 호출한다. 단, 부모 클래스에 매개변수가 없는 기본 생성자가 없고 다른 생성자만 정의된 경우에는 명시적으로 super()를 호출해야 한다.

예시

class Parent {
    Parent() {
        System.out.println("부모 클래스의 생성자 호출");
    }
    
    void parentMethod() {
        System.out.println("부모 클래스의 메서드");
    }
}

class Child extends Parent {
    Child() {
    	//super()
        super(); // 부모 클래스의 생성자 호출 
        System.out.println("자식 클래스의 생성자 호출");
    }
    
    void childMethod() {
    	//super
        super.parentMethod(); // 부모 클래스의 메서드 호출
        System.out.println("자식 클래스의 메서드");
    }
}

public class Test {
    public static void main(String[] args) {
        Child c = new Child();
        c.childMethod();
    }
}
 

이 예제에서 Child 클래스의 생성자에서 super()를 사용하여 부모 클래스 Parent의 생성자를 호출한다. 또한, Child 클래스에서 super.parentMethod()를 사용하여 오버라이딩된 부모 클래스의 parentMethod 메서드에 접근한다.

728x90

관련글 더보기

댓글 영역