[웹 개발 기초 자바스크립트] 11. 다형성

Shy·2023년 8월 27일
0

NodeJS(Express&Next.js)

목록 보기
12/39

다형성

poly(많은) + morph(형태) => 다형성, 다양한 형태를 가질 수 있다.

다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것이다.

예를 들어서, 도형이라는 부모 클래스와 삼각형, 사각형, 원 클래스가 있다 해보자.

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

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

객체의 변수나 메서드가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다. 오버 라이딩(Overriding)을 사용하여 자식 클래스의 메서드가 부모 클래스의 메서드와 다르게 동작하거나 다른 값으로 지정될 수 있다.

소스코드 예쩨

// 메서드는 같지만, 그 안의 구현은 다르다.
class PaymentGateway {
	consturctor() {
    	this.connect();
    }
    connect () {
    	// 결제 제공업체에 연결
        // ..
    }
    pay(amount) {
    	// ..
    }
    refund(amount) {
    	// ..
    }

class Paypal extends PaymentGateway {
	pay(amount) {
    	// 페이팔 전용 로직을 구현해야 한다.
    }
    refund(amount) {
    	// 페이팔 전용 로직을 구현해야 한다.
    }
    connect() {
    	// 페이팔 전용 로직을 구현해야 한다.
    }
    
class Visa extends PaymentGateway {
	pay(amount) {
    	// Visa 전용 로직을 구현해야 한다.
    }
    refund(amount) {
    	// Visa 전용 로직을 구현해야 한다.
    }
    connect() {
    	// Visa 전용 로직을 구현해야 한다.
    }
class Customer {
	makePayment(gateway, amount) {
    	return gateway.pay(amount)
    }
    
    // 만약 다형성이 없다면, 이런식으로 메소드들을 생성해야 한다.
    // payByPaypal(amount) {}
    // payByVisa(amount) {}
    
    getRefund(gateway, amount) {
    	return gateway.refund(amount)
    }

const john = new Customer();
const paypal = new Paypal();
const visaCard = new Visa();

john.makePayment(paypal, 100);
john.makePayment(visaCard, 100);

설명

위 소스코드는 객체 지향 프로그래밍의 다형성(Polymorphism) 개념을 잘 설명해 주는 예이다. 다형성이란 하나의 인터페이스나 클래스가 다양한 형태로 동작하는 것을 의미한다.

이 예제에서 PaymentGateway는 기본적인 결제 게이트웨이를 나타내는 클래스이다. 그리고 이 클래스는 기본적인 연결 메서드(connect)와 결제 메서드(pay), 환불 메서드(refund)를 포함하고 있다.

그런 다음 Paypal과 Visa 클래스는 PaymentGateway 클래스를 상속받아서 각각의 특정 로직과 세부 사항으로 메서드를 재정의(override)한다. 이렇게 상속을 통해 하위 클래스가 부모 클래스의 메서드를 재정의하는 것을 메서드 오버라이딩(Method Overriding)이라고 한다.

  • PaymentGateway
    • 기본적인 결제 게이트웨이의 형태를 제공합니다.
    • connect, pay, refund 등의 메서드를 포함하며, 이러한 메서드는 실제 구현이 필요하다.
  • Paypal
    • PaymentGateway를 상속받아 페이팔의 특성에 맞게 메서드를 재정의한다.
    • pay, refund, connect 메서드가 페이팔의 서비스에 맞게 재정의되었다.
  • Visa
    • PaymentGateway를 상속받아 Visa의 특성에 맞게 메서드를 재정의한다.
    • pay, refund, connect 메서드가 Visa의 서비스에 맞게 재정의되었다.

이렇게 다형성을 통해 여러 결제 게이트웨이의 공통적인 동작을 PaymentGateway 클래스에 정의하고, 각 결제 게이트웨이의 특성에 맞게 메서드를 재정의하여 각기 다른 동작을 구현할 수 있다. 이는 코드의 재사용성을 높이고, 유지 보수를 용이하게 한다.

또한, 다형성의 특징을 활용하면 PaymentGateway 타입의 참조 변수로 Paypal이나 Visa 객체를 참조하면서도 각 객체의 특정 메서드를 호출할 수 있다. 이로써 동일한 코드에서 다양한 동작을 수행할 수 있게 된다.

profile
초보개발자. 백엔드 지망. 2024년 9월 취업 예정

0개의 댓글