[TIL] TypeScript 파고들기(4): 객체지향

hanbyul.choi·2023년 7월 28일
0

[TIL]

목록 보기
29/39

추상 클래스(abstract)

  • 상속을 통해서 사용하게끔 하는 클래스

  • 추상 함수를 구현해서 직접 사용하지만
    무조건 추상함수만 가지고 있는 것은 아님
    일반 함수도 상속시켜서 정의하지 않고 곧바로 사용할 수도 있음.

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

  • 추상 클래스의 목적은 상속을 통해 자식 클래스에서 메서드를 제각각 구현하도록 강제를 하는 용도

  • 다시말해, 핵심 기능 구현은 전부 자식 클래스에게 위임 하는 것

 ☑️ 추상 클래스 사용 방법

  • 추상 클래스 및 추상 함수는 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();

인터페이스(interface)

  • 타입스크립트에서 객체의 타입을 정의하는데 사용.
  • 객체가 가져야할 속성과 메서드를 정의함.
  • 구조만 정의하고 기본구현 즉 생성자를 제공하지 않는다.

☑️ 추상 클래스와 인터페이스 차이점

  • 추상 클래스
    • 단일 상속만 지원한다.
    • 추상 클래스를 상속받은 자식 클래스는 반드시 추상 함수를 구현해야 한다.
  • 인터페이스
    • 다중 상속을 지원한다.
    • 즉, 하나의 클래스는 여러 인터페이스를 구현할 수 있다.
    • 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 전부 구현해서 사용해야 한다.

☑️ 사용 구분

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

객체지향 설계 원칙 - S.O.L.I.D

1) S (SRP. 단일 책임 원칙)

  • 필요한 기능에 대해서만 가지고 있을 것.

2) O (OCP. 개방 페쇄 원칙)

  • 클래스 확장에 대해서는 열려있어야 하고, 수정에 대해서는 닫혀 있어야 함.
  • 인터페이스나, 상속을 통해서 부모클래스는 변경하지 않고 기능을 확장.

3) L (LSP. 리스코프 치환 원칙)

  • 서브타입은 기반이 되는 슈퍼타입을 그대로 대체하여 사용할 수 있어야함.
  • 즉, 자식클래스는 부모클래스의 기능을 수정하지 않고도 원하는 기능이 수행되어야함.

4) I (ISP. 인터페이스 분리 원칙)

  • 클래스는 자신이 사용하지 않는 인터페이스의 영향을 받지 않아야함.
  • 해당클래스에게 사용하지도 않는 메소드를 구현하게 하면 안됨.
  • 따라서 인터페이스를 너무 범용성있게 정의하지 않고 필요한 만큼만 정의해서 사용해야함.

5) D (DIP. 의존성 역전 원칙)

  • 하위수준 모듈(상속받아 구현하는 클래스)보다 그 부모 단계에 있는 상위 수준 모듈(인터페이스)에 의존해서 만들어야함.

TypeScript 내용 요약 정리

1) TypeScript

  • JavaScript의 상위 집합(superset)으로 정적 타입 검사를 지원
  • 더 안전하고 예측 가능한 코드를 작성할 수 있게 해줌
  • .ts 파일을 .js 파일로 컴파일하여 실행

2) 기본 타입 및 고급 타입

☑️ JavaScript에서 파생된 기본 타입    
  - string
  - number
  - boolean
  - null
  - undefined

☑️ 새로 추가된 타입    
  - tuple
  - enum
  - any
  - unknown

3)타입의 집합화

☑️ union 타입

  - 여러 타입 중 하나를 가질 수 있는 타입을 정의할 때 사용
  - 사용 방법: 타입1 `|` 타입2

☑️ intersection 타입

  - 여러 타입의 조합을 가질 수 있는 타입을 정의할 때 사용
  - 사용 방법: 타입1 `&` 타입2

4) 타입과 인터페이스의 차이

☑️ 타입    
  - 별칭을 사용하여 새로운 타입을 정의

☑️ 인터페이스    
  - 객체의 구조를 정의하는 데 사용됩
  - 클래스에서 구현

5) 클래스와 상속

☑️ 클래스    
  - 객체의 설계도로 사용되며 생성자, 메서드, 속성 등을 포함

☑️ 상속    
  - 클래스 간의 관계를 정의하는 방법
  - 부모 클래스의 기능을 자식 클래스가 상속

6) 객체지향 설계 원칙 - S.O.L.I.D

☑️ 단일 책임 원칙(SRP)

  - 한 클래스는 하나의 책임만 가져야 한다.

☑️ 개방 폐쇄 원칙(OCP)

  - 확장에는 열려 있고 수정에는 닫혀 있어야 한다.

☑️ 리스코프 치환 원칙(LSP)

  - 서브타입은 슈퍼타입을 대체할 수 있어야 한다.

☑️ 인터페이스 분리 원칙(ISP)

  - 인터페이스는 클라이언트가 필요로 하는 메서드만 제공해야 한다.

☑️ 의존성 역전 원칙(DIP)

  - 추상화에 의존해야 하며 구체화에 의존하면 안된다.

0개의 댓글