일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- standard output
- 코틀린 in
- JPA
- https 실습
- IntelliJ
- cli 만들기
- InnoDB
- output stream
- 개인블로그 hugo
- Test
- resizer 구현
- kotlin
- resize image with go
- 돌연변이 테스팅
- 객체지향
- standard input
- 코틀린
- https implement
- 자바
- image resizer with go
- ruby
- 공짜블로그
- Convariance
- https go
- Mutation testing
- 코틀린 out
- Java
- https 서버 구현
- Pitest
- MySQL
- Today
- Total
Rlog
[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.
오늘의 영어공부 끝~!
'Java' 카테고리의 다른 글
[Java] ByteArrayStream (0) | 2022.03.28 |
---|---|
Jackson Databind 에서 is, get, set 을 이용하면 자동으로 값으로 인식하는 이유 (0) | 2022.03.22 |
[Intellij] Save Actions 를 이용한 자동 포맷팅 (1) | 2022.01.08 |
[Spring Batch] Batch Info Table 수동 생성하기 (0) | 2021.12.12 |
객체지향 체조 (0) | 2021.11.28 |