예를 들어서, 도형이라는 부모 클래스와 삼각형, 사각형, 원 클래스가 있다고 가정합니다.
도형이라는 클래스에 getArea(){ return this.width * this.height }
이 있다면 삼각형 클래스에서는 getArea 메소드에서는 다른 방식으로 Area를 구할 것이며, 사각형 클래스에서도 getArea 메소드에서 다른 방식으로 Area를 구할 것입니다.
이렇게 같은 메소드라도 각 인스턴스에 따라 다양한 형태를 가질수 있는 것을 다형성이라고 합니다.
// Polymorphism -- 클래스는 메서드는 같지만 구현이 다릅니다.
class PaymentGateway {
constructor() {
this.connect();
}
connect() {
// 결제 제공업체에 연결
// ...
}
pay(amount) {}
refund(amount) {}
}
class Paypal extends PaymentGateway {
pay(amount) {
// Paypal 전용 로직 구현
}
refund(amount) {
// Paypal 전용 로직 구현
}
connect() {
// Paypal 전용 로직 구현
}
}
class Visa extends PaymentGateway {
pay(amount) {
// Visa 전용 로직 구현
}
refund(amount) {
// Visa 전용 로직 구현
}
connect() {
// Visa 전용 로직 구현
}
}
<aside> 💡 메서드는 같지만 그 안의 구현은 다릅니다!
</aside>
class Customor {
makePayment(gateway, amount) {
return gateway.pay(amount);
}
// 만약 다형성이 없다면 이런식으로 메서드들을 생성해야함.
// payByPaypal(amount) {}
// payByVisa(amount) {}
getRefund(gateway, amount) {
return gateway.refund(amount);
}
}
const marvel = new Customor();
const paypal = new Paypal();
const visaCard = new Visa();
marvel.makePayment(paypal, 100);
marvel.makePayment(visaCard, 100);
다형성이 유용한 이유는 ?
더 일반적인 코드를 재사용하고 작성할 수 있습니다.
만약 위에 처럼 새로운 결제 게이트웨이 제공업체(paypal 등등...)가 있는 경우
Client 클래스의 결제 로직을 조정하지 않고 새 클래스를 생성하기만 하면 됩니다.