
지난 포스팅에서 타입스크립트에서의 기본 타입에 대해서 알아보았습니다. 이번 포스팅에서는 타입스크립트에 대해 본격적으로 들어가기 전에 이론적인 부분에 대해서 포스팅해보겠습니다.
타입스크립트에서의 타입이란 집합이라고 생각하면 이해하기 쉬울 것입니다. 집합이란 동일한 속성을 갖는 여러개의 원소를 하나로 묶어주는 것을 말합니다. 아래 이미지를 봐주세요.
정수, 소수점, 음수, 무한대 등 여러가지 숫자가 있는게 보일 것 입니다. 이러한 집합을 타입스크립트에서는 number 타입이라고 묶어줍니다.
이렇게 동일한 속성과 특징을 같은 집합이라고 생각하며 타입스크립트 타입에 접근해보겠습니다.
위의 이미지는 이 let num:20 = 20;이라는 코드를 집합으로 표현한 이미지 입니다. 넘버 리터럴 타입이라는 집합 안에 딱 20이라는 값 하나만 가지고 있는 것을 볼 수 있습니다.
넘버 리터럴 타입이라는 집합을 포함하고 있는 상위 집합인 넘버 타입 집합이 보이시나요? 여기 이미지에서 보이는 것처럼 20, 즉 넘버 리터럴 타입은 넘버 타입의 부분 집합이라고 할 수 있습니다. 여기서 넘버 타입은 슈퍼타입 다른 말로는 부모타입이라고 부릅니다. 그리고 넘버 리터럴 타입같이 다른 타입에 포함되어 있는 타입은 서브 타입 또는 자식타입이라고 합니다.
타입 사이의 계층에 대해 집합으로 알아보았습니다.
이제 타입 호환성에 대해 자세히 알아보겠습니다.
타입 호환성이란 어떤 타입을 다른 타입으로 취급해도 괜찮은지를 판단하는 것을 말합니다.
넘버 타입과 넘버 리터럴 타입이 있을 경우를 예시로 들어보겠습니다. 넘버 리터럴 타입을 넘버타입으로 취급하는건 가능하지만 넘버타입은 넘버 리터럴 타입으로 취급하는 것은 옳지 않습니다. ⭐ 왜냐하면 넘버타입이 넘버 리터럴 타입보다 더 큰 집합이 슈퍼 타입이기 때문입니다. 도형으로 예를 들면 모든 정사각형이 직사각형이지만, 모든 직사각형이 정사각형이 아닌 것처럼 말이죠.
또다른 예시를 들어보겠습니다.
let num1: number = 10;
let num2:10 = 10;
이라는 두 타입이 있다고 가정해봅니다.
num1은 넘버 타입이고, num2는 넘버 리터럴 타입인 것을 볼 수 있습니다. 위에서 말했던 것 처럼 넘버 리터럴 타입은 넘버 타입 안에 포함이 되어있기 때문에
num1 = num2;
이런 문법은 가능합니다. 하지만 반대로
num2 = num1;
이라는 문법은 불가능합니다. 넘버 리터럴 타입보다 넘버 타입이 더 크기 때문이죠. 만약 이 부분이 이해가 안가신다면 num1의 값을 다른 값으로 바꿔보세요. 지금은 num1과 num2의 값이 10으로 같지만 만약 num1에 값을 40이나 -20 또는 무한대로 바꾸면 위와 같은 문법이 성립하지 않다는 것을 볼 수 있습니다.
이렇게 해서 타입의 호환성에 대해서 알아보았습니다.
그리고 마지막으로 하나만 더 알아보겠습니다.
업 캐스팅 이란 위의 예시에서 넘버 리터럴 타입같은 서브 타입을 넘버타입같은 슈퍼타입으로 취급하는 것을 말합니다. 업 캐스팅은 모든 상황에 문제 없이 가능합니다.
아타운이 캐스팅``이란 업 캐스팅과 반대로 넘버타입같은 큰 타입을 넘버 리터럴 타입처럼 작은 타입으로 취급하는 것을 말합니다. 하지만 다운 캐스팅은 대부분의 상황에서는 허용이 되지 않습니다.
이렇게 해서 이번 포스팅에서는 타입스크립트의 타입에 대한 것을 집합으로 비유해서 보다 자세히 알아보았습니다. 감사합니다!
위의 내용은 <한 입 크기로 잘라먹는 타입스크립트> 강의 내용을 참고하면서 작성했습니다.