# 상속과 생성자 호출
## 들어가며
---
이전 장에서 우리는 접근 제한자와 자바 API에 대해 배웠습니다.

이번 장에서는 상속과 인터페이스에 대한 내용을 배울 건데요, 그 시작으로 상속에 대한 개념을 알아보도록 하죠.
## 목차
---
1. 상속이란
2. 상속의 필요성
## 1. 상속이란
상속이란, *기존 클래스를 확장하여 새 클래스를 만드는 것*입니다.

상속이라는 개념을 설명하기 위해, RPG 게임 속 직업으로 초심자와 마법사라는 직업이 있다고 해볼게요. 또 초심자(Novice)는 마법사(Wizard)로 전직이 가능하고, 각 직업의 속성은 아래와 같다고 합시다.

위 클래스 다이어그램을 보면, Novice와 Wizard에 중복 속성이 있죠? 이때, 상속 개념을 사용하면 이러한 중복을 제거할 수 있습니다. 그뿐 아니라, 더 확장 가능한 형태의 클래스를 구성할 수 있게 되죠. 어떻게요? 바로 `extends` 키워드를 사용해서 말이죠!

위 코드를 보면 Wizard는 extends 키워드를 통해 Novice의 속성을 물려받습니다. 다시 말해, Novice 클래스로부터 확장되는 거죠. 따라서 Wizard 클래스는 실제로 자신의 필드인 mp와 fireball() 메소드 뿐만 아니라, Novice의 두 필드 name과 hp와 메소드인 punch()를 가지게 됩니다. 이를 확인하기 위해 아래와 같은 코드를 실행해 볼 수 있겠네요. (더 자세한 내용은 실습을 통해 연습해볼게요)
```
// 객체 생성
Wizard w = new Wizard();
// 필드 초기화
w.name = "닥터 스트레인지";
w.hp = 100;
w.mp = 100;
// 메소드 수행
w.punch();
w.fireball();
```
## 2. 상속의 필요성
---
이러한 상속을 사용하면 어떤 장점이 있을까요?

#### 중복 코드 제거
먼저는 앞서 말한 중복 코드를 제거할 수 있습니다. 만약 상속없이 코드를 작성했다면 아래와 같이 중복이 많았겠죠?
```
class Novice {
private String name;
private int hp;
public void punch() {
System.out.println("Punch!!");
}
}
class Wizard {
private String name; // 필드 중복
private int hp; // 필드 중복
private int mp;
// 메소드 중복
public void punch() {
System.out.println("Punch!!");
}
public void fireball() {
System.out.println("Fireball@@");
}
}
```
#### 프로그램의 확장성 증가
더 나아가 상속은, 클래스 코드의 *재사용성(**resuability**)을 증가*시키는데요, 이는 프로그램의 확장성을 증가시키게 됩니다.
지금까지 상속에 대한 정의와 필요성에 대해 이야기해보았는데요, 다음 실습을 통해 더 연습해보도록 할까요?
## 요약
---
1. 상속이란, 기존 클래스를 확장하여 새 클래스를 만드는 것이다.
2. 상속을 사용하면, 중복된 코드를 줄일 수 있다.
3. 상속은 코드의 재사용성 및 확장성을 증가시킨다.
4. extends 키워드로 상속을 구현한다.
## 확인하기
---
<div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5d121d76553fe300148a86f7" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5d121d76553fe300148a86f7/q/1?method=iframe"></iframe></div></div>