타입호환성

1개의 게시글

TypeScript

[TypeScript] 타입은 집합이다

November 26, 2025

타입스크립트를 공부하다 보면 "이 타입은 저 변수에 넣을 수 있는데, 왜 반대는 안 되지?"라는 의문이 생길 때가 있다. 이를 이해하기 위해서는 "타입은 집합(Set)이다" 라는 개념을 잡고 가야 한다. 1. 타입은 집합이다 수학 시간에 배운 집합을 떠올려보자. 집합은 동일한 속성을 갖는 여러 개의 요소를 하나의 그룹으로 묶은 단위를 말한다. 타입스크립트의 타입도 이와 똑같다. Number 타입 vs Number 리터럴 타입 예를 들어 number 타입은 우리가 아는 모든 숫자(-20, 0, 3, Infinity, NaN 등)를 포함하는 거대한 집합이다. 반면, 우리가 이전에 배운 Number Literal 타입(예: 20)은 어떨까? 이 타입은 오직 20이라는 딱 하나의 값만 포함하는 아주 작은 집합이다. 20은 숫자이므로, Number Literal Type은 결국 Number Type이라는 거대한 집합에 포함되는 부분 집합이 된다. --- 2. 슈퍼 타입(부모)과 서브 타입(자식) 타입스크립트의 모든 타입은 서로 포함하고 포함되는 관계를 갖는다. 이 관계를 부모와 자식 관계로 정의할 수 있다. - 슈퍼 타입 (Super Type, 부모): 다른 타입을 포함하는 더 큰 집합 (예: number). - 서브 타입 (Sub Type, 자식): 다른 타입에 포함되는 더 작은 집합 (예: number literal). 이 계층 구조를 전체적으로 보면 아래와 같다. unknown이 최상위 슈퍼 타입이고, never가 최하위 서브 타입이 된다. - 전체 계층도![타입트리.png](https://akodhrjerwyxttclrzkq.supabase.co/storage/v1/object/public/images/images/1764181629157-ioczwt12x7j.png) --- 3. 타입 호환성 (Type Compatibility) 이제 타입 호환성이라는 개념을 이해할 수 있다. 타입 호환성이란 "A 타입의 값을 B 타입으로 취급해도 괜찮은지"를 판단하는 것이다. 3-1. 업 캐스팅 (Upcasting) : OK ✅ 서브 타입(자식)의 값을 슈퍼 타입(부모)의 값으로 취급하는 것은 가능하다. 이를 업 캐스팅이라고 부르며, 모든 상황에서 안전하게 가능하다. - 예: "정사각형(자식)은 직사각형(부모)이다" (참) - 예: "숫자 10(리터럴)은 숫자(number)이다" (참) ts let num1: number = 10; let num2: 10 = 10; // num2(작은 집합)를 num1(큰 집합)에 넣는 것 num1 = num2; // ✅ 가능 (업 캐스팅) 3-2. 다운 캐스팅 (Downcasting) : NO ❌ 반대로 슈퍼 타입(부모)의 값을 서브 타입(자식)의 값으로 취급하는 것은 불가능하다. 이를 다운 캐스팅이라고 부르며, 대부분의 상황에서 허용되지 않는다. - 예: "직사각형(부모)은 정사각형(자식)이다" (거짓) - 예: "모든 숫자(number)는 10(리터럴)이다" (거짓) ts let num1: number = 10; let num2: 10 = 10; // num1(큰 집합)을 num2(작은 집합)에 넣는 것 // num2 = num1; // ❌ 불가능 (다운 캐스팅 에러) 왜 안 될까?num1은 number 타입이므로 10 외에도 999, -5 같은 다양한 숫자를 가질 수 있다. 그런데 num2는 오직 10만 담을 수 있는 그릇이다. 더 큰 범위의 값을 더 작은 그릇에 억지로 구겨 넣으려고 하면 넘치거나 문제가 생길 수밖에 없다. --- 요약 1. 타입은 집합이다: 타입은 값들의 모음(Set)으로 볼 수 있다. 2. 계층 관계: 더 큰 집합은 슈퍼 타입(부모), 포함되는 작은 집합은 서브 타입(자식)이다. 3. 타입 호환성: - 작은 것을 큰 것에 넣는 것(업 캐스팅)은 가능하다. - 큰 것을 작은 것에 넣는 것(다운 캐스팅)은 불가능하다.

TypeScriptStudyTypeTheory타입호환성