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

자바스크립트는 객체 지향 언어로, 다형성과 추상 클래스와 관련된 개념을 지원합니다. 이번 글에서는 다형성과 추상 클래스의 개념과 자바스크립트에서의 활용에 대해 살펴보겠습니다.

다형성 (Polymorphism)

다형성은 하나의 인터페이스나 추상 클래스를 통해 여러 타입의 객체를 다루는 방식을 말합니다. 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다. 자바스크립트는 동적 타입 언어이기 때문에 다형성을 지원하며, 다양한 방식으로 구현될 수 있습니다.

class Shape {
  area() {
    console.log("계산 불가");
  }
}

class Circle extends Shape {
  constructor(radius) {
    super();
    this.radius = radius;
  }

  area() {
    return Math.PI * this.radius ** 2;
  }
}

class Square extends Shape {
  constructor(side) {
    super();
    this.side = side;
  }

  area() {
    return this.side ** 2;
  }
}

let shapes = [new Circle(5), new Square(4)];
shapes.forEach(shape => console.log(shape.area()));

위의 예제는 Shape 클래스를 부모 클래스로 하는 CircleSquare 클래스를 정의하고 있습니다. 이 예제에서 forEach 메소드를 이용하여 Shape 클래스를 상속받은 서브 클래스의 멤버 함수를 호출함으로써, 동일한 인터페이스를 통해 다양한 타입의 객체를 다룰 수 있는 다형성의 예를 보여줍니다.

추상 클래스 (Abstract Class)

추상 클래스는 인스턴스를 생성할 수 없는 클래스로, 부모 클래스로만 활용됩니다. 자바스크립트에서는 클래스의 메소드를 직접 구현하지 않고, 추상 메소드로만 정의할 수 없기 때문에, 명시적인 추상 클래스가 없습니다. 하지만, 추상 클래스를 모방하기 위해 아래와 같이 일반 클래스를 추상 클래스로 활용할 수 있습니다.

class Shape {
  constructor() {
    if (this.constructor === Shape) {
      throw new Error("추상 클래스는 인스턴스를 생성할 수 없습니다.");
    }
  }

  area() {
    throw new Error("area 메소드는 구현되어 있지 않습니다.");
  }
}

class Circle extends Shape {
  constructor(radius) {
    super();
    this.radius = radius;
  }

  area() {
    return Math.PI * this.radius ** 2;
  }
}

// 이하 동일

위의 예제에서는 Shape 클래스를 추상 클래스로 활용하기 위해 생성자에서 this.constructor를 통해 자기 자신을 확인하고, 메소드는 에러를 발생시킴으로써 하위 클래스에서 구현되어야 함을 알립니다.

결론

자바스크립트는 다형성과 추상 클래스의 중요한 개념을 지원하고 있으며, 이를 통해 객체 지향 프로그래밍의 장점을 살려 유연하고 유지보수가 용이한 코드를 작성할 수 있습니다.

참고 문헌: