상속이랑 다형성은 Java를 배울 때 가장 어려운 부분 중 하나입니다. 3 ~ 7편으로 나눠서, 차근 차근 써 보도록 하겠습니다. 이번 시간에는, 자식 객체를 생성했을 때, 어떤 일이 일어나는지 보도록 하겠습니다.

 

 


 코드를 보겠습니다.

 

 뭔가 간단해 보이는 것은 기분 탓인 듯 싶습니다. 일단, Parent의 생성자에서는 I'm parent init 이라는 문구를 출력합니다. 그리고, Child에서는 I'm child init이라는 문구를 출력합니다.

 

 

 main 함수에서는 Child 객체를 하나 생성합니다. 실행 결과가 어떻게 나올까요?

 

 

 요렇게 나옵니다. parent init 다음에 child init이 출력됩니다. 어떻게 흘러갔는지 차근차근 보겠습니다.

 

 


 먼저 생성자의 역할을 다시 상기해 볼 필요가 있습니다.

 

 

 그러면, 객체가 생성이 되고 난 후에, 생성자가 호출된다는 이야기입니다. 예를 들어서, A a = new A(); 는, A 객체를 생성하는 문장입니다. 그리고 생성된 객체를 a라는 참조 변수에 넣습니다.

 

 

 A 객체가 생성되었습니다.

 

 

 다음에, A의 생성자가 호출되었습니다.

 

 

 그리고 참조 변수 a가 새로 생성된 A 객체를 가리킵니다. 그러면, 예제의 코드는 어떻게 동작할까요?

 

 


 super()가 무엇일까요? 이는 부모 생성자를 호출하라는 뜻입니다. Child 생성자에서 super()를 호출했다면, 그것의 부모인, Parent 생성자를 호출합니다.

 

 

 즉, Child의 생성자에서 Parent의 생성자를 호출합니다. 다음에, Parent 생성자가 끝나면, Child 생성자에서 초기화 작업을 합니다. 그런데 코드에서 제가 super()를 부른 적이 없었습니다. 그런데, 어떻게 그게 가능할까요? 이는 명시하지 않더라도 컴파일러가 부모의 기본 생성자를 호출하기 때문입니다.

 

 

다시 흐름을 따라가 봅시다. Child 생성자에서, 맨 처음에 super()를 호출한다고 했으므로, I'm child가 출력되기 전에, Parent 생성자가 invoke가 됩니다. Parent에서 I'm Parent init을 출력합니다. 그리고 부모 생성자를 다 부르고 나서야, child가 출력이 됩니다. 따라서, parent init이 print 된 후에, child init이 프린트 됩니다.

 

 


 보너스. super 키워드도 많이 보셨을 겁니다. 어떤 일을 할까요? 다음 프로그램을 보겠습니다.

 

 

 Parent와 Child 클래스는 위와 같습니다.

 

 

 Child 객체를 만들고, 참조변수 ch가 Child 객체를 참조합니다. ch.foo를 호출했을 때, 어떤 일이 일어날까요? this는 자기 자신을 가리킵니다. super는 부모를 의미합니다.

 

 

 

 그러면 super.x는 parent의 x 필드를 의미합니다. 명시적으로 부모의 메서드나, 필드에 접근할 때 쓰는 것이 super입니다.