Rlog

[StackOverflow] 왜 자식생성자에서 super() 를 써야 하는가? 본문

Java

[StackOverflow] 왜 자식생성자에서 super() 를 써야 하는가?

dev_roach 2022. 2. 3. 23:58
728x90

최근에 영어 공부도 할겸 StackOverflow 활동을 이틀에 하나정도는 답변을 다는 식으로 활동해보려고 한다.

일단 질문은 아래내용이다.
https://stackoverflow.com/questions/70973089/using-super-in-child-constructor

 

Is it unnecessary to put super() in constructor?

Isn't this one automatically put by the compiler if I don't put it in a subclass's constructor? That means I don't even need to care about it? In some articles they put it out. And if I've got one

stackoverflow.com

대충 내가 이해한 바로는 왜 Child Class 의 생성자에 super() 를 써야 할때가 있는가?

어차피 우리가 명시적으로 적어주지 않아도 컴파일러가 그렇게 해주는데 라는 식의 질문이라고 생각했다.

 

질문하신 분이 코드는 올리지 않아서 코드는 내가 직접 작성했다.

public class Parent {

    private String name;
    private String age;

    public Parent() {
    }
}
public class Child extends Parent {

    public Child() {
    }
}

우리가 적은 코드에서는 Child 에서 명시적으로 super() 를 호출해주지 않고 있다.

하지만 컴파일된 파일을 한번 디어셈블 해서 한번 확인해보자.

public class com.example.demo.Child extends com.example.demo.Parent {
  public com.example.demo.Child();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method com/example/demo/Parent."<init>":()V
       4: return
}

코드를 봐서 알겠지만 1번째 라인에서 invokespecial #1 이라는 것이 수행되고 있다.

invokespecial 은 간단히 설명해서 인스턴스의 메소드를 실행해주는 것이라고 생각하는것이 편하다.

정말 궁금하다면 아래 글귀를 한번 읽어보길 바란다.

 

invokespecial

 

Operation Invoke instance method;

direct invocation of instance initialization methods and methods of the current class and its supertypes

 

일단 invokespecial 이 Parent 의 <init> 을 호출한다는 것을 알 수 있다.

이 디어셈블된 코드를 봤을때 질문자의 의도는 일단 이해가 갈 것 이다. 

굳이 컴파일러가 super() 를 만들어 주는데 왜 우리는 super() 를 써야 하는가..?

 

근데 사실 질문이 조금 잘못되기도 했다는 생각이 드는게.. 저기 질문중에 mandatory 라는 단어가 나오는데..

사실 위와 같이 우리가 의무적으로 적는것이 아닌 optional 하게 적는 것인데.. 질문을 보면 자신도 알고 있는데 왜 mandatory 라는 표현을 썼는지는 잘 모르겠다.. 내 영어실력이 부족한건가?

 

하여튼 내가 질문을 잘못이해한것일 수 있지만 내 답변은 아래와 같았다.

 

it is not mandatory to include a super() as the first line of every constructor. 
that's what the compiler should do, not what you should do.

 

오늘의 영어공부 끝~!