EXTENDS IMPLEMENTS

extends와 implements 비교

상속과 구현을 객체지향 일반론으로만 보면 TypeScript의 구조적 타입 시스템을 놓치기 쉽다. extends는 부모 구현과 멤버를 물려받고, implements는 클래스 인스턴스가 특정 구조를 만족하는지 검사하지만 런타임 코드를 만들지는 않는다.

01

관계 의미 확인

자식이 부모의 한 종류인지, 단지 같은 메서드 계약을 만족하면 되는지 구분한다.

is-a가 아니면 상속이 부담이 된다
02

extends 사용

공통 구현, protected helper, 기본 상태를 공유해야 할 때 부모 클래스를 확장한다.

깊은 상속은 변경 전파가 크다
03

implements 사용

클래스가 특정 메서드와 속성 구조를 제공해야 할 때 interface를 구현한다.

런타임에는 interface가 사라진다
04

override 확인

부모 메서드를 덮을 때 noImplicitOverride와 override 키워드로 의도를 고정한다.

부모 이름 변경을 놓치지 않는다
05

접근 제한 판단

private와 protected가 구조적 호환성에 미치는 영향을 확인한다.

private 멤버가 있으면 같은 선언 출처가 중요해진다
extends class
구현 상속 부모 생성자, 메서드, protected 멤버, 런타임 prototype 관계를 만든다.
super 호출을 확인한다
implements interface
구조 계약 검사 클래스 인스턴스가 interface 멤버를 제공하는지 컴파일 시 확인한다.
코드는 생성하지 않는다
structural
모양 기반 호환 명시적으로 implements하지 않아도 구조가 같으면 할당될 수 있다.
명목 타입이 아니다
override
덮어쓰기 의도 부모 메서드와 실제로 연결된 override인지 컴파일러가 확인한다.
대형 클래스에서 유용하다

타입 확인

런타임 필요 공통 코드가 필요한지, 타입 계약만 필요한지 먼저 확인한다.
super 호출 생성자와 override 메서드에서 부모 초기화가 필요한지 본다.
구조 호환 implements 없이도 같은 구조 객체가 할당되는 사례를 확인한다.