어떤 것을 이렇게도 볼 수 있고, 저렇게도 볼 수 있는 것
ex) 핸들이 있고, 오른 페달이 액셀, 왼쪽이 브레이크인 것 = 차, 그랜저, 버스 …
세부적인 부분 부분은 다르지만, 어쨌든 대충 보면 그냥 '차'다
객체지향의 꽃 이라고 불리는 다형성이란 동일한 인터페이스나 추상클래스를 구현했지만 타입이 다양한 객체를 동일하게 다룰 수 있게 해주는 능력이다.
house.draw()
dog.draw()
car.draw()
위 처럼 공통 메소드를 통합 시켜준다.
abstract interface class Drawable {
void draw();
}
class House implements Drawable {
void draw() {
...
}
}
Drawable d = elements[i];
d.draw();
선언을 상위 개념으로 인스턴스 생성은 하위 개념으로 한다.
추상적인 선언 = new 상세 정의
// 두번째 Interface
abstract interface class Moveable {
void move(int seconds);
}
class Car implements Drawable, Moveable
class Hero extends Character{
Hero(super.name, super.hp);
void attack(Monster monster){
print('$name이 $monster을 공격했다.');
print('10의 데미지');
monster.hp -= 10;
}
}
Character character = Hero('홍길동', 100); //OK
Sword sword = Hero('name, 100'); // NG
상속에 의한 is-a 관계가 성립한다면, 인스턴스를 부모 클래스 타입의 변수에 대입할 수 있다
부모 클래스 타입 변수에 대입하는 것으로, 퉁 칠 수 있음
어떤 멤버를 이용할 수 있는가는 상자의 타입이 결정한다
멤버가 어떻게 움직이는지는 내용의 타입이 결정한다
as 키워드를 사용하여 타입 캐스팅을 수행한다
is 키워드를 사용하여 타입을 검사할 수 있다
같은 부모를 가지는 다른 인스턴스를 동일시하여, 부모 클래스 타입의 에 담을 수 있다
마찬가지로, 부모 클래스 타입의 인수나 리턴 값을 이용하여, 다른 클래스를 모아서 처리 가능
동일시 취급 해도, 각각의 인스턴스는 각 클래스의 정의를 따르고 다른 동작을 한다.