본문 바로가기

프로그래밍언어/Java

[Java 기본] super - 부모 참조, 생성자

super - 부모 참조


부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면, 자식에서 부모의 필드나 메서드를 호출할 수가 없다. 자식에서 먼저 찾고 없을 경우에 부모를 찾기 떄문이다. 이 때 super라는 키워드를 사용하면 부모를 참조할 수 있다. 

 

 

예제


 

Parent.java

package extends1.super1;

public class Parent {

    public String value = "parent";

    public void hello() {
        System.out.println("Parent.hello");
    }
}

 

Child.java

package extends1.super1;

public class Child extends Parent{

    public String value = "child";

    @Override
    public void hello() {
        System.out.println("Child.hello");
    }

    public void call() {
        System.out.println("this value = " + this.value);
        System.out.println("super value = " + super.value);

        this.hello();
        super.hello();
    }
}

 

Main.java

package extends1.super1;

public class Super1Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.call();
    }
}

 

=> 필드 이름과 메서드 이름이 같을 경우 super를 이용해서 부모 클래스의 기능을 사용할 수 있다. 

 

super - 생성자


상속 관계의 인스턴스를 생성하면 결국 메모리 내부에서는 자식과 부모 클래스가 각각 다 만들어 진다. Child를 만들면 부모 Parent까지 함께 만들어지는 것이다. 따라서 각각의 생성자도 모두 호출되어야 한다.

 

상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 한다.

 

예제


 

ClassA.java

package extends1.super2;

public class ClassA {

    public ClassA() {
        System.out.println("ClassA 생성자");
    }
}

 

ClassB.java

package extends1.super2;

public class ClassB extends ClassA {

    public ClassB(int a) {
        super(); // 기본 생성자 생략 가능
        System.out.println("ClassB 생성자 a=" + a);
    }

    public ClassB(int a, int b) {
        super(); // 기본 생성자 생략 가능
        System.out.println("ClassB 생성자 a=" + a + " b=" +b);
    }
}

=> ClassB는 ClassA를 상속 받았다. 상속을 받으면 생성자의 첫줄에 super()를 사용해서 부모 클래스의 생성자를 호출해야 한다. 

  부모 클래스의 생성자가 기본생성자인(매개변수가 없는 생성자) 경우에는 생략해도 된다. 

 

 

ClassC.java

package extends1.super2;

public class ClassC extends ClassB{

    public ClassC() {
        super(10);
        System.out.println("ClassC 생성자");
    }
}

=> ClassC는 ClassB를 상속 받았다. ClassB는 두 개의 생성자가 있다. 

생성자는 하나만 호출할 수 있으므로 두 생성자 중 하나를 선택하면 된다. 

 

ClassMain.java

package extends1.super2;

public class Super2Main {
    public static void main(String[] args) {
        ClassC classC = new ClassC();

    }
}

 

실행결과

 

정리


 

ClassA()의 생성자는 최상위 부모이다. 생성자 코드를 실행하면서 "ClassA 생성자"를 출력한다. 

ClassA() 생성자 호출이 끝나면 ClassA를 호출한 ClassB 생성자로 제어권이 돌아간다. 

ClassB 생성자가 코드를 실행하고 호출이 끝나면 ClassB를 호출한 ClassC의 생성자로 제어권이 돌아간다. 

ClassC가 마지막으로 생성자 코드를 실행하면서 ClassC 생성자를 출력한다 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.