9_class/7_override.ts, super 키워드 질문
super키워드에 대해 궁금한 점이 있어서 질문 드립니다. 제가 알고 있는 super 키워드를 constructor에서 사용하는 경우는 부모 클래스에 있는 프로퍼티를 자식 클래스에서 따로 선언하지 않은 채로 그대로 상속받았을 때 super 키워드를 통해 부모 클래스의 constructor을 호출하여 그 프로퍼티들에 대한 값을 초기화하는 것으로 이해를 했었습니다. 그러나 위 강의에서 마지막 부분에 보면 class PropertyParent2, class PropertyChild2 는 모두 name이란 프로퍼티를 갖고 있습니다. 즉 제가 생각하기엔 Propertychild2의 name과 PropertyParent2의 name은 상속 받은 프로퍼티가 아닌 PropertyChild2만의 프로퍼티라고 생각하였습니다. 그런데 강사님이 PropertyChild2 클래스의 constructor에 super(name); this.name = name; 을 둘 다 적는 것을 보고 의문을 느껴 super(name); 부분을 주석 처리를 하였더니 상속받은 클래스의 constructor에서는 super키워드를 '반드시' 포함해야한다 라고 오류가 뜹니다. 제가 일전에 이해한 super 키워드에 대한 설명 자체가 잘못된 것인지 궁금하고 만약 제가 이해한 super 키워드에 대한 이해가 맞았다면 왜 저 코드에선 그러한 오류가 발생하는지 궁금합니다. 그리고 제가 틀렸다면 어떤 클래스로부터 상속받은 클래스가 있다면 그 클래스는 '반드시' super 키워드를 사용해야하는 것에 대한 답변도 듣고 싶습니다.
Answer 2
0
안녕하세요!
질문을 한줄로 작성해주셔서 이해하기가 조금 어려운데 다음에는 정리해서 코드 예제와 함께 질문해주시면 제가 훨씬 정확한 답변을 해드릴 수 있습니다.
질문은 "자식 클래스에 왜 꼭 super() 생성자를 실행해줘야 하는가?"로 이해했습니다.
조금 논리적으로 생각해보면 매우 간단합니다.
상속을 구현하면 자식 클래스는 "절대적으로" 부모클래스의 "확장"이라는 개념이 됩니다.
이건 "왜?"라고 질문 할 필요가 없습니다. 애초에 그런 기능으로 만들어진거고 그렇기 때문에 "상속" (영어로도 inheritance 입니다) 이라는 이름이 붙은거죠.
그럼 여기서 거꾸로 생각을 해볼 수 있습니다. 자식 클래스가 부모 클래스를 무조건 "확장" 하도록 하려면 이 부분을 프로그램에서 강제 할 수 있는 방법은 부모 클래스의 생성자를 "무조건" 실행하도록 하는 방법 뿐입니다. 방법 뿐이라기보다 당연히 그렇게 돼야한다고 보는게 맞겠죠.
제가 질문을 읽기에는 대략적으로 잘 이해를 하고 계신 것 같아서 어떤부분에서 헷갈리신건지 사실 정확히는 모르겠습니다. 그런데 혹시
"자식에서 this.name = name을 어차피 실행하는데 왜 super()를 불러서 name 프로퍼티를 또 선언해줘야하냐?"
가 질문이라면 그 이유는 자식에서 this.name = name을 실행할지 안할지 알 수 없기 때문입니다. 이게 가능하게 하려면 자식 생성자에서 부모 생성자의 모든 프로퍼티를 구현 했는지 안했는지 모두 체크해야하고 없는 프로퍼티별로 빌드타임 에러를 발생시켜줘야 하는데 그럼 결국 "super() 실행 안했음" 에러랑 같습니다.
혹시 이게 질문이 아니었다면 다시 정리해서 질문 주시면 감사하겠습니다.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다.
김동민 님께서 질문하신 super 키워드와 클래스 상속 및 생성자(constructor) 호출과 관련된 내용에 대해 설명드리겠습니다. super 키워드는 자식 클래스에서 부모 클래스의 생성자를 호출할 때 사용됩니다. 자식 클래스에서 생성자를 정의할 때, 만약 자식 클래스가 부모 클래스의 프로퍼티나 메소드를 상속받아서 사용하려면 super()를 호출하여 부모 클래스의 생성자를 실행해야 합니다. 이는 부모 클래스의 프로퍼티가 올바르게 초기화되어 자식 클래스에서 사용될 수 있도록 하는 중요한 과정입니다.
질문에서 언급하신 PropertyChild2 클래스에 super(name);를 사용하는 것은 PropertyParent2 클래스에서 정의된 name 프로퍼티를 초기화하기 위함입니다. 즉, 자식 클래스의 생성자 내에서 super 키워드를 사용하는 것은 부모 클래스의 생성자를 호출하여 필요한 초기화 작업을 함께 수행하기 위한 것입니다. 자바스크립트(타입스크립트 포함)에서는 자식 클래스의 생성자에서 super를 호출하는 것이 필수적인데, 이는 클래스 상속 체계에서 정상적인 초기화 작업을 보장하기 위한 규칙입니다.
이와 유사한 질문으로, 상속받은 클래스가 부모 클래스의 속성을 어떻게 초기화하는지에 대한 설명이 포함된 내용을 추천해 드립니다. 해당 내용은 아래에 위치한 질문과 대답에서 확인하실 수 있습니다.
- 자세한 설명에 관한 질문 링크: super를 사용하는 건, 부모와 자식 클래스의 파라미터 이름이 꼭 같아야하나요?
이 설명이 김동민 님의 질문에 대한 답변으로 도움이 되었기를 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
ts강의 42. override 마지막즘 질문
0
42
1
25. js array의 문제점 4:55쯤 질문입니다
0
31
1
union 기본기 7분 53초 질문 드립니다.
0
117
2
Equality Narrowing 관련 질문
0
117
2
tsconfig.json 설명
0
124
2
환불 관련 질문 드립니다.
0
179
1
재너릭이랑 any 차이가 뭔가요?
0
221
2
리플렉션과 데코레이터 사용시 의문점
0
135
2
변수의 선언이 중복되었다고 할 때
0
162
2
type 으로 함수의 형식을 정의하고 함수를 정의할 때
0
144
1
declare 키워드가 가끔 나오던데 이건 뭔가요?
0
150
2
class가 값이 될 수 있다는 말을 이해하기 어렵습니다.
0
127
1
null값의 타입은 object 아닌가요?
0
188
1
타입? 인터페이스? 질문있습니다
0
147
1
type functionOnly = Extract<string| (()=> void), Function> 의 의미
0
171
2
npm install cache error
0
205
1
12_experimental_decorator, class decorator
0
131
1
강의 계획이 궁금합니다!
0
289
1
instantiator 질문
0
151
1
따라하는데 에러 생기네요
1
390
2
webstorm에서 ts-node 설치해도 문제가 발생하고 있습니다.
0
485
3
infer를 사용한 type의 쓰임새
0
131
1
혹시 수업하면서 작성된 코드는 따로 받아 볼 수 없나요?
0
203
1
object intersection에서 유니언으로 타입 질문
1
129
1

