# 인터페이스와 다형성
#### CODE <a class='btn btn-default' href='/codes/41602'>Link</a>
```
public class Polymorphism {
public static void main(String[] args) {
// 성기사 객체 생성
HolyKnight uther = new HolyKnight("우서", 180);
// 탱커로서의 역할 수행
uther.increaseHp();
// 힐러로서의 역할 수행
uther.heal();
}
}
interface Tanker {
public void increaseHp();
}
interface Healer {
public void heal();
}
/* 1. 탱커와 힐러 역할을 부여하세요. */
class HolyKnight implements Tanker, Healer{
private String name;
private int hp;
public HolyKnight(String name, int hp) {
this.name = name;
this.hp = hp;
}
/* 2. Tanker의 메소드를 오버라이딩하세요. */
public void increaseHp(){
System.out.println("전체 체력 +50 증가시킵니다.");
}
/* 3. Healer의 메소드를 오버라이딩하세요. */
public void heal(){
System.out.println("체력을 +30 회복합니다.");
}
}
```
#### INPUT
```
```
#### OUPUT
```
전체 체력 +50 증가시킵니다.
체력을 +30 회복합니다.
```
uther.increaseHP(); 로도 작동은 하지만
Tanker t = uther; t.increaseHP(); 로 코드를 작성하는 것은 코드의 가시성을 높히고 명확함을 주기위해서 라고 생각해도 괜찮을까요?
sehongpark님의 답변
## 한 객체가
다양한 인터페이스로 해석될 수 있음을 나타내는데 목적이 있습니다.
## PS.
uther 객체는 HolyKnight 객체입니다.
HolyKnight는
Tanker와 Healer 인터페이스를 구현하고 있으므로,
Tanker와 Healer 타입으로 해석될 수 있습니다.
```
// 성기사 객체 생성
HolyKnight uther = new HolyKnight("우서", 180);
// 탱커로서의 역할 수행 - 업캐스팅
Tanker t = (Tanker) uther;
t.increaseHp();
// 힐러로서의 역할 수행 - 업캐스팅
Healer h = (Healer) uther;
h.heal();
```