TypeScript

TypeScript : 객체 지향 프로그래밍 - 2 (추상 클래스, 인터페이스)

고래고래00 2024. 7. 2. 20:10

03. 추상 클래스

추상 클래스의 정의

  • 추상 클래스는 클래스와는 다르게 인스턴스화를 할 수 없는 클래스

추상 클래스가 있는 이유

  • 추상 클래스의 목적은 상속을 통해 자식 클래스에서 메서드를 제각각 구현하도록 강제 하는 용도
  • 추상 클래스도 최소한의 기본 메서드는 정의
  • 하지만, 핵심 기능의 구현은 전부 자식 클래스에게 위임을 하는 것

추상 클래스 사용 방법

  • 추상 클래스 및 추상 함수는 abstract 키워드를 사용하여 정의
  • 추상 클래스는 1개 이상의 추상 함수가 있는 것이 일반적
더보기
더보기
abstract class Shape {
  abstract getArea(): number; // 추상 함수 정의

  printArea() {
    console.log(`도형 넓이: ${this.getArea()}`);
  }
}

class Circle extends Shape {
  radius: number;

  constructor(radius: number) {
    super();
    this.radius = radius;
  }

  getArea(): number { // 원의 넓이를 구하는 공식은 파이 X 반지름 X 반지름
    return Math.PI * this.radius * this.radius;
  }
}

class Rectangle extends Shape {
  width: number;
  height: number;

  constructor(width: number, height: number) {
    super();
    this.width = width;
    this.height = height;
  }

  getArea(): number { // 사각형의 넓이를 구하는 공식은 가로 X 세로
    return this.width * this.height;
  }
}

const circle = new Circle(5);
circle.printArea();

const rectangle = new Rectangle(4, 6);
rectangle.printArea();
  • Shape 클래스의 abstract getArea(): number; 를 주목해주세요. 이 코드가 바로 추상 함수
  • 이 추상 클래스를 상속 받은 자식 클래스들은 반드시 getArea 함수를 구현해야 함

04. 인터페이스

  • 인터페이스는 TypeScript에서 객체의 타입을 정의하는데 사용
  • 인터페이스는 객체가 가져야 하는 속성과 메서드를 정의
  • 인터페이스를 구현한 객체는 인터페이스를 반드시 준수, 규약과 같아서 어길 수 없음
  • 인터페이스를 사용하면 코드의 안정성을 높이고 유지 보수성 향상

구현부 제공 여부

  • 추상 클래스
    • 클래스의 기본 구현을 제공
  • 인터페이스
    • 객체의 구조만을 정의하고 기본 구현을 제공 X

상속 메커니즘

  • 추상 클래스
    • 단일 상속만 지원
  • 인터페이스
    • 다중 상속을 지원
    • 하나의 클래스는 여러 인터페이스 구현 가능

구현 메커니즘

  • 추상 클래스
    • 추상 클래스를 상속받은 자식 클래스는 반드시 추상 함수를 구현해야 함
  • 인터페이스
    • 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 전부 구현해야 함

적절한 사용처

  • 기본 구현을 제공하고 상속을 통해 확장하는데 초점을 맞추고 싶다면 → 추상 클래스
  • 객체가 완벽하게 특정 구조를 준수하도록 강제하고 싶다면 → 인터페이스