[커널아카데미] 백엔드 개발 부트캠프 12기 3주차 - 허수

굴착드릴·2025년 4월 10일

자바의 정석 연습문제 [7-6]을 풀다가 생긴 이야기를 적어보았습니다.


[7-6] 자손 클래스의 생성자에서 조상 클래스의 생성자를 호출해야 하는 이유

알고 있던 사실

자바에서 Object를 제외한 모든 클래스의 생성자 첫줄엔 this() 또는 super()가 와야 하며 적지 않으면 컴파일러가 해당 코드를 자동으로 삽입합니다.

이 때문에 기본생성자를 정의하지 않고 다른 생성자를 정의한 경우 컴파일 에러가 발생합니다.


문제를 보고 처음 든 생각

위와 같은 사실을 알고 있었지만 "왜 super() 또는 this()를 호출하도록 설계를 해놓았을까"는 떠오르지 않았습니다.


삽질 시작

문제의 발단

우연치 않게 이번 과정을 같이 들어보자고 말했던 동생도 같은 문제에 대해 고민을 하고 있었습니다.

저는 이 문제에 대해 "왜 super() 또는 this()를 호출하도록 설계를 해놓았을까"를 고민하고 있었지만 동생은 문제에서 묻는 것은 Setter를 써도 되는데 왜 생성자를 사용하는 걸까"가 아니냐? 라고 하며 저희의 삽질은 시작되었습니다.


생성자 블록에서 setter쓰면 안되나?

처음엔 간단하게 답변 후 문제에서 묻는 요지는 제가 생각한게 맞지 않냐고 말을 하려고 했습니다.

그래서 컴파일도 되고 생성자 블록에서 setter를 써도 되긴 하는데 그럴꺼면 그냥 부모 생성자를 쓰는게 맞지 않나?라고 답했습니다.


setter말고 생성자를 반드시 호출해야하는 이유는?

동생: "근데 그건 권고사항이고 반드시 해야만 하는건 아니잖아요"

나: "어라?"

순간 문제에서 묻는게 정말 이거였나?라는 생각이 스쳤습니다.


"해야하는 이유"

단일책임원칙?

부모의 setter를 자식 클래스에서 호출해서 초기화하는것은 단일책임원칙에 위배되기 때문에 하지 말라는 소리가 아닐까? 라는 생각이 들었지만

이는 원칙이고 자바 시스템적으로 막은건 아니지 않나? 라는 생각이 들었습니다.

그리고 '문제에선 분명 해야하는 이유를 물었는데...'라는 고민이 들었습니다.

그러다 컴파일러가 자동으로 추가해주는 것은 반드시 해야하는 것인데 사용자가 추가하지 않아서 아닐까? 라는 생각이 스쳤습니다.


돌아온 정신

물어볼 수 있는 사람이 있어야 한다

결국 우리끼리 고민하는 것은 시간낭비라는 판단, 문제의 요지와 우리가 고민했던 것에 대해 튜터님께 여쭤보기로 했습니다. 그리고 1분도 안돼서 해결됐습니다.

7장에서 우리가 배운 것

"7장에서 우리가 배운 것을 생각해보면 바로 답이 나올 것이다"라고 튜터님께서 말씀하셨습니다.

해답

"자식 클래스 멤버에서 부모클래스의 멤버를 사용할 수 있으므로 부모 클래스의 멤버가 먼저 초기화되어 있어야 하기 때문."이 답입니다.

자식 클래스
읽고 나면 당연한 사실이지만 그 당시 떠오르지 않은 것. 즉 대충 아는 것이었습니다.


돌아보기

허수의 표본

모든 문제가 해결되고 돌이켜보니 어이가 없었습니다. 그리고 이내 부끄러워졌습니다.

문제 해석을 똑바로 못하고 이리저리 상상의 나래를 펴고, 그 펼친 상상의 나래 역시 확실하지 않아 다시 꼬리를 무는 악순환이 반복되었습니다.

또 문제 해석을 똑바로 못했다는 것은 애초에 제대로 알고 있지 않기 때문에 여러 생각이 들었다는 결론이 났습니다.

반복할 것, 반복하지 말 것

초반 챕터에서 기초가 부족하단 것을 깨닫고 찬찬히 해보겠다고 다짐했지만 여전히 어리숙한 부분이 많은 것 같습니다. 남궁성 강사님께선 아직도 자바를 모두 이해하지 못했다고 말씀하셨습니다. 자만하지 말고 읽고 또 읽어 이런 상황이 반복되지 않도록 해야겠다는 다짐이 들었습니다.


동생의 이야기

profile
두두두두..

0개의 댓글