덕타이핑
- 객체의 본질을 갖게 본다 = 메서드의 동작이 같아도된다
- 실행 시간 (런타임)에 객체의 속성과 메서드를 검사하여 타입을 결정한다.
interface People {
talk(): void;
whoAmI: string;
}
class Human implements People {
whoAmI = "human"
talk = () => {
console.log(`say ${this.whoAmI} : 말할 수 있어요`);
}
}
class Robot {
whoAmI = "robot"
talk = () => {
console.log(`say ${this.whoAmI} : 말할 수 있어요`);
}
}
const humanInstance = new Human();
const robotInstance = new Robot();
function startTalk(people: People): void {
people.talk();
}
startTalk(humanInstance); // --- 1) "say human : 말할 수 있어요"
startTalk(robotInstance); // --- 2) "say robot : 말할 수 있어요"
2번의 함수호출에선 파라미터로 들어간 robot은 people로 정의되어있지 않기에 에러가 남
이 시점에서 타입스크립트의 Duct Typing 개념이 적용
Class Robot
은 Class Human
이 정의된 대로 변수 whoAmI
, Method talk
모두 가지고 있다.
Interface People
은 아니지만,
Interface People
이 가지고 있는 property
를 모두 가지고있으므로 타입체크를 통과
타입추론같은 느낌
가능한 이유가 뭐지?
타입(data의 형태)을 컴파일 단계에서 결정하면 정적 타이핑, 런타임에서 결정하면 동적타이핑
근데, 타입스크립트는 타입검사를 런타임단계가 아니라 컴파일단계에서 하는데?
다형성 적인 측면에서 접근하면?
- 정적 다형성은 컴파일 타임 바인딩을 의미하며, 동적 다형성은 런타임 바인딩을 의미합니다.
- 보통 객체 지향 언어에서 정적 다형성을 overloading이라고 하며, 동적 다형성을 overriding
이라고 부릅니다.
- 정적 다형성(혹은 overloading)은 동일한 함수 이름을 가지더라도 해당 함수가 가지는 파라
미터들의 개수, 타입, 순서가 다를 경우 컴파일러가 다른 함수로써 인식 하는 것을 의미합니다.
- 동적 다형성(overriding)은 동일한 함수 이름과 파라미터 특성을 지닌, 상속 관계에
있는 클래스들의 멤버 함수에 대해서 외형적으로 호출되는 타입에 상관없이 실제 생성된 객체
의 함수가 호출되도록 처리 되는 특성을 의미합니다.
...
다형성의 이런 특성(=동적)에 의해 객체 지향 프로그래밍에서는 ‘동일한 인터페이스의 여러 객체,
동일한 객체의 여러 인터페이스’를 갖는 것이 가능합니다.
어떤 객체의 형태가 컴파일 단계에서 결정되면 정적 다형성, 런타임 단계에서 결정되면 동적다형성이라고한다.
타입스크립트는 컴파일 단계에서 실제로 지정된 Type인지 아닌지를 판단하지 않는다.
대신 런타입 단계에서 지정된 Type이 가지고 있는 변수와 method가 있는지 판단하고,없다면 에러가 발생된다.
즉, 타입스크립트는 런타임 단계에서 객체가 어떤 형태를 지니고 있는 판단하는 동적 다형성 혹은 덕타이핑의 특성을 지니고 있다.
구조적 타이핑
구조적 타이핑은 구조적 타입 시스템(Structural Type System) 이라고도 불린다. 실제 구조와 정의에 의해 결정되는 타입 시스템의 한 종류이다. 명시적 선언이나 이름을 기반으로 하는 명목적 타입 시스템(Nominal Type System) 인 Java, C#등과 다르고, 런타임에 타입을 체크하는 덕 타이핑과 다르다.
- 구조적 타이핑에서는 객체의 이름이나 상속 관계보다는 객체가 가지고 있는 속성과 메서드의 이름, 타입, 순서 등 구조적인 측면에 초점을 맞춥니다.두 객체가 동일한 구조를 가지고 있다면, 서로 호환되는 타입으로 간주된다.
- 구조적 타이핑을 지원하는 언어에서는 변수나 함수의 반환 값에 대한 타입을 명시적으로 선언하지 않아도 된다.
명시적 타이핑
- 컴파일단계에서 해석할때 타입이 다르다면 오류 Java와 C같은 구조를 뜻한다.