다형성과 추상화

이 글과 하위 글들은 [객체 지향 프로그래밍 입문]에 관한 내용입니다. 최범균님의 인프런의 강의를 보며 정리한 내용으로 문제가 될시 삭제하겠습니다.

다형성

  • 여러(poly) 모습(morph)을 갖는 것

  • 객체 지향에서는 한 객체가 여러 타입을 갖는 것을 말한다. 즉 한 객체가 여러 타입의 기능을 제공하며, 보통 타입 상속으로 다형성을 구현한다. 하위 타입은 상위 타입도 된다.

다형성 예)

class Timer {
  start(): void {}
  stop(): void {}
}

interface Rechargeable {
  charge: () => void;
}

class IotTimer extends Timer implements Rechargeable {
  charge(): void {
    // ...
  }
}
const iotTimer = new IotTimer();

iotTimer.start();
iotTimer.stop();

const timer: Timer = iotTimer;

timer.start();
timer.stop();

const rechargeable: Rechargeable = iotTimer;
rechargeable.charge();

추상화(Abstraction)

데이터나 프로세스 등을 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정.

두 가지 방식의 추상화

  • 특정한 성질

  • 공통 성질(일반화)

간단한 예

  • (특정한 성질) DB의 USER 테이블: 아이디, 이름, 이메일

  • (특정한 성질) Money 클래스: 통화, 금액

  • (공통 성질) 프린터: HP Mxxx, 삼성 SL-Mxxx

  • (공통 성질) GPU: 지포스, 라데온

타입 추상화

여러 구현 클래스를 대표하는 상위 타입을 도출한다. 흔히 인터페이스 타입으로 추상화하며, 추상화 타입과 구현은 타입 상속으로 연결한다.

아래와 같이 추상 타입을 이용한 프로그래밍을 할 수 있다.

const notifier: Notifier = getNotifier(...);
notifier.notify(someNoti);

추상 타입은 구현을 감추고, 기능의이 구현이 아닌 의도를 더 잘 드러내 준다.

추상 타입 사용에 따른 이점: 유연함

만약 콘크리트 클래스를 직접 사용한다면?

공통점을 도출하고, 도출한 추상 타입을 사용한다면?

사용할 대상 접근도 추상화 한다면?

언제나 추상화 하는게 좋을까?

추상화 -> 추상 타입 증가 -> 복잡도 증가

No. 아직 존재하지 않는 기능에 대한 이른 추상화는 주의해야 한다. 잘못된 추상화의 가능성이 높아지고 복잡도만 증가된다. 실제 변경, 확장이 발생할 때 추상화를 시도하자.

추상화를 잘 하려면 어떻게 해야 될까?

구현을 한 이유가 무엇 때문인지 생각해야 한다.

Last updated