자바스크립트는 유연한 동적 언어로 잘 알려져있습니다. 그래서 JAVA
와 같은 언어와 다르게 타입에 대해서는 명시적으로 선언없이 자유자재로 사용할 수 있습니다.
// JAVA
String name = "daeun";
// Javascript
const name = "daeun";
우리는 자바를 정적 타입 언어, 자바스크립트는 동적 타입 언어라고 분류할 수 있습니다. 정적은 컴파일 시점, 동적은 런타임 시점에 타입이 체크되어진다고 생각하면 됩니다.
그리고 정적 타입이 가지는 장점과 동적 타입이 가지는 단점을 보완하는 것이 타입스크립트입니다.
하나의 예로, 즉 타입스크립트는 기존에 자바스크립트가 가지던 런타임에서 오는 이슈들을 컴파일 시점에 알아차릴 수 있습니다.
간단히 타입스크립트과 자바스크립트를 비교하면 다음과 같습니다.
// static
let staticName: string = "daeun";
staticName = 1; // TypeError
// dynamic
let dynamicName = "daeun";
dynamicName = 1; // Ok
결국 타입스크립트는 결국 정적으로 타입을 검사하고 싶어 사용하는 것이라고 이해할 수 있습니다.
타입스크립트 공식문서에는 아래와 같은 말이 나와있는데요,
타입스크립트의 코어 원리 중 하나는 타입 체킹을 **형태(Shape)**에 중점을 둔다고 합니다.
그리고 이것을 덕 타이핑
또는 구조적 서브타이핑
이라고 부른다고 합니다.
이때 Shape
는 무엇을 나타내는 것이고, 덕 타이핑은 무엇일까요?
덕 타이핑은 객체 자신이 어떠한 타입인지가 중요하지 않고, 특정 메소드나 속성의 존재로 타입을 판단하는 것을 말합니다.
반대의 경우에는 특정 타입을 정의함으로써, 그 타입을 특정하게 됩니다.
덕 타이핑은 특정 타입에 얽매이지 않고, 원하는 행동을 할 수 있는 여부로 판단하게 됩니다.
그래서 타입에 제약없이 사용하여 보다 유연하게 코드를 작성할 수 있습니다.
덕 타이핑은 다형성 측면의 관점으로 볼 수 있습니다. (OOP의 다형성과 같이 연관지어 생각할 수 있습니다.)
이론적으로는 이해가 잘 가지 않을 수 있지만, 코드를 보면 이해하기가 쉽습니다.
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);
startTalk(robotInstance);
위 코드만 보았을 때, 클래스인 Human
은 People
을 상속받았기 때문에 타입이 People이라고 볼 수 있습니다.
그래서 startTalk
함수의 매개변수로 들어가도 에러가 뜨지 않고 함수가 실행될 수 있을 것으로 보입니다.
반대로 클래스 Robot
의 인스턴스는 어떨까요?
매개변수로 들어간 robotInstance
는 타입이 People로 정의되어 있지 않습니다. 따라서 에러를 발생시킬 것으로 예상되지만, 에러가 발생하지 않습니다.
따라서 이 시점에서 덕타이핑 개념이 도입되는 것입니다.
정의된 타입이 아니더라도 정의된 타입과 같은 Shape를 가지고 있다면 타입체크에서 에러가 나지 않는 것입니다.
덕 타이핑은 객체가 어떤 타입에 걸맞은 변수와 메소드를 지니면 객체를 해당 타입에 속하는 것으로 간주한다.
만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.
최종적으로 정리하면,
타입스크립트의 정적타이핑
은 타입검사 측면에서 해석한 결과이고,
타입스크립트의 동적타이핑
인 Duck Typing
은 다형성의 측면에서 해석한 결과입니다.
그래서 타입스크립트를 정적, 동적 이라는 상반된 개념 모두 연관지을 수 있었던 것입니다.
(타입스크립트는 동적언어인 자바스크립트의 단점을 보완하고자 탄생한 것이므로, 정적언언의 특징과 동적언어의 특징을 모두 가지고 있다고 이해하면 됩니다. 그 중 덕타이핑이 동적 언어의 특징이라고 할 수 있겠죠?)
덕타이핑 정리
- 장점
- 타입에 대해 매우 자유롭다.
- 타입을 미리 정하는 것이 아니라 실행 되었을 때, 해당 Method들을 확인하여 타입을 정한다.
- 단점
- 런타임 자료형 오류가 발생할 수 있다. 런타임에서 값은 예상치 못한 유형이 있을 수 있기 때문이다.
- 이런 오류가 프로그래밍 실수 구문에서 오랜 시간 후에 발생할 수 있다.
- 데이터의 잘못된 자료형의 장소로 전달되는 구문은 작성하지 않아야 한다. 이것은 버그를 찾기 어려울 수도 있다.