[StackOverflow] 왜 자식생성자에서 super() 를 써야 하는가?
최근에 영어 공부도 할겸 StackOverflow 활동을 이틀에 하나정도는 답변을 다는 식으로 활동해보려고 한다.
일단 질문은 아래내용이다.
https://stackoverflow.com/questions/70973089/using-super-in-child-constructor
대충 내가 이해한 바로는 왜 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.
오늘의 영어공부 끝~!