다형성(Polymorphism)

예를 들어서, 도형이라는 부모 클래스와 삼각형, 사각형, 원 클래스가 있다고 가정합니다.

도형이라는 클래스에 getArea(){ return this.width * this.height } 이 있다면 삼각형 클래스에서는 getArea 메소드에서는 다른 방식으로 Area를 구할 것이며, 사각형 클래스에서도 getArea 메소드에서 다른 방식으로 Area를 구할 것입니다.

이렇게 같은 메소드라도 각 인스턴스에 따라 다양한 형태를 가질수 있는 것을 다형성이라고 합니다.

Untitled

소스 코드를 통해 이해하기

// 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 클래스의 결제 로직을 조정하지 않고 새 클래스를 생성하기만 하면 됩니다.