자바, 객체지향!

자바, 객체지향!

자바 프로그래밍의 꽃, 조립식 프로그래밍!

32 상속과 생성자 호출

# 상속과 생성자 호출 <div class="embed-responsive embed-responsive-16by9"> <iframe src="https://www.youtube.com/embed/W8IBgA-tSJU" frameborder="0" allowfullscreen></iframe> </div> ## 목차 1. 학습 목표 2. 자식 객체와 생성자 호출 3. 디폴트 생성자 4. 요약 ## 학습목표 객체의 생성 과정에 따른 생성자 호출을 이해한다. ## 자식 객체와 생성자 호출 자식 객체를 만들려면 먼저 부모 클래스의 생성자 호출이 완료되어야 합니다. 쉽게 말해 2층 건물을 올리려면 먼저 1층 건물을 지어야합니다. 아래의 클래스 다이어그램을 참고로 객체의 생성과정을 알아보겠습니다. ![](https://i.imgur.com/UZBbyCA.png) ### 1층 짓기 Novice 클래스는 건물로 비유하면 1층 설계도입니다. 1층 객체 생성 예는 아래와 같습니다. ``` // Novice 객체 생성 Novice n = new Novice("초보", 100); ``` ### 2층 짓기 그렇다면 Wizard 클래스는 2층이겠죠? 2층을 올리려면 먼저 1층이 있어야 합니다. 따라서 Wizard 생성자는 먼저 부모 클래스(Novice)의 생성자 호출을 완료해야 합니다. 이를 super 키워드를 통해 사용할 수 있는 것 기억하시죠? ``` // Wizard 객체 생성 Wizard w = new Wizard("해리포터", 100, 100); // Wizard 생성자 예 public Wizard(String name, int hp, int mp) { super(name, hp); // 1층을 먼저 지어야 함! this.mp = mp; } ``` ### 3층 짓기 마찬가지로 GreadWizard 클래스는 3층의 설계도입니다. 3층을 지으려면 먼저 2층이 있어야 하는데, 2층이 있으려면 전에 1층이 지어져야만 합니다. ``` // GreatWizard 객체 생성 GreatWizard gw = new GreatWizard("간달프", 100, 100, 100); // GreatWizard 생성자 예 public GreatWizard(String name, int hp, int mp, int shield) { super(name, hp, mp); // 2층을 먼저 지어야 한다! this.shield = shield; } ``` ## 디폴트 생성자 자식 객체 생성시 부모클래스의 생성자를 호출해야합니다. 그러나 예외도 있습니다. 부모 클래스의 생성자가 디폴트 생성자인경우, 직접적으로 super의 생성자를 호출하지 않아도 됩니다. 그럼 디폴트 생성자는 어떤 생성자일까요? 디폴트 생성자는 파라미터가 없는 생성자 입니다. ``` class A { // 디폴트 생성자: 파라미터가 없는 생성자 public A() { // 생성자 구현부 생략.. } } ``` 자식 객체 생성시 부모 클래스를 호출하지 않은 경우, 자동으로 부모의 디폴트 생성자를 호출합니다. ``` public class Test { public static void main(String[] args) { new B(); } } class A { public A() { System.out.println("AAA"); } } class B extends A { public B() { // super(); System.out.println("BBB"); } } ``` 위 코드의 실행 결과는 아래와 같습니다. ``` AAA BBB ``` ## 요약 1. 상속 관계의 객체 생성시 부모의 생성자 호출이 반드시 먼저 완료되어야 한다. 2. super 키워드는 부모의 생성자를 호출한다. 3. 자식 생성자에서 부모의 생성자 호출을 생략한 경우, 부모의 디폴트 생성자를 호출한다. 4. 디폴트 생성자란 파라미터가 없는 생성자이다.

Challenge

개념 실습! 학습 내용을 진짜 내 것으로 만들기!