[javascript] 다형성과 추상 클래스의 개념

다형성(polymorphism)은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 서로 다른 클래스의 객체가 동일한 메서드를 호출했을 때 각자의 방식에 맞게 동작하는 현상을 말합니다. 자바스크립트는 동적 타이핑을 지원하고, 이로 인해 다형성을 쉽게 구현할 수 있습니다.

다형성(polymorphism)의 개념

다형성이란 같은 이름을 가진 메서드나 함수가 입력에 따라 다르게 동작하는 것을 의미합니다.

예를 들어, 동일한 print 메서드를 호출하더라도 다양한 서브클래스에서 오버라이딩된 메서드에 의해 다른 결과를 반환하는 것이 다형성의 대표적인 예입니다.

class Shape {
  print() {
    console.log("This is a shape");
  }
}

class Circle extends Shape {
  print() {
    console.log("This is a circle");
  }
}

class Square extends Shape {
  print() {
    console.log("This is a square");
  }
}

const shape = new Shape();
const circle = new Circle();
const square = new Square();

shape.print();   // This is a shape
circle.print();  // This is a circle
square.print();  // This is a square

이 예제에서 Shape 클래스의 print 메서드가 다형성을 구현한 것입니다. 각 서브클래스에서 print 메서드를 오버라이딩하여 해당 클래스의 동작에 맞게끔 구현했습니다.

추상 클래스(Abstract class)의 개념

추상 클래스는 인스턴스를 생성할 수 없는 클래스로, 다른 클래스들이 상속받아 사용하기 위한 목적으로 만들어집니다. 자바스크립트에서는 별도의 키워드로 추상 클래스를 지원하지 않지만, 추상클래스를 모방하기 위해 활용되는 패턴들이 있습니다.

하나의 추상 클래스로부터 파생된 여러 클래스가 같은 메소드를 다른 방식으로 재정의하는 경우, 이러한 구조를 활용하여 객체의 다형성과 확장성을 높일 수 있습니다.

class AbstractShape {
  print() {
    throw new Error("This method must be overridden");
  }
}

class Circle extends AbstractShape {
  print() {
    console.log("This is a circle");
  }
}

class Square extends AbstractShape {
  print() {
    console.log("This is a square");
  }
}

const circle = new Circle();
const square = new Square();

circle.print();  // This is a circle
square.print();  // This is a square

추상 클래스는 해당 클래스를 직접적으로 사용하기보다는 다른 클래스들의 공통적인 특성을 추출하여 상속하게 함으로써 유용하게 활용됩니다.

결론

다형성과 추상 클래스는 객체 지향 프로그래밍에서 중요한 개념으로, 자바스크립트 역시 강력한 다형성을 구현할 수 있는 특징을 가지고 있습니다. 이를 활용하여 유연하고 확장 가능한 코드를 작성할 수 있습니다.