Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

2. 타입 본문

Front/Typescript

2. 타입

Nick_Choi 2025. 7. 17. 17:37

2.1 타입이란

1. 자료형으로서의 타입

  • 컴퓨터 메모리는 유한하기 때문에 값의 크기와 형태를 알려주는 타입이 필요함
  • 자바스크립트는 7가지 데이터 타입 제공:
    • undefined
    • null
    • Boolean
    • String
    • Symbol
    • Numeric(Number/BigInt)
    • Object
  • 타입은 값의 분류 체계이자 메모리 구조와 안전성에 관여함

2. 집합으로서의 타입

  • 타입은 수학적 집합 개념처럼, 유효한 값들의 범위를 제한하는 역할
  • 타입 시스템은 잘못된 값이 사용되지 않도록 런타임 에러를 컴파일 타임에 방지
  • 예) 매개변수에 number 타입을 명시하면 string을 넣을 경우 에러 발생

3. 정적 타입 vs 동적 타입

  • 정적 타입 시스템: 타입이 컴파일 시점에 결정됨 → 타입 안정성 높음
  • 동적 타입 시스템: 런타임에 타입이 결정됨 → 유연하지만 에러 가능성 있음

4. 강타입 vs 약타입

  • 강타입: 타입이 맞지 않으면 연산 불가
  • 약타입: 타입이 달라도 내부적으로 변환하여 연산 가능
  • JS는 약타입, TS는 강타입

5. 명시적 vs 추론적 타입 시스템

  • 명시적: 타입을 직접 지정
  • 추론적: 컴파일러가 문맥을 통해 추론
  • 타입스크립트는 둘 다 지원함

6. 타입스크립트의 컴파일 방식

  • 타입 정보는 컴파일 시 제거되고, 순수 자바스크립트 코드로 변환됨

2.2 타입스크립트의 타입 시스템

1. 타입 애너테이션

  • 변수나 함수 등에 : 타입으로 명시하여 타입 선언

2. 구조적 타이핑

  • 타입 이름이 아닌 구조(속성과 타입)로 타입 호환 여부를 판단함
  • Developer와 BankNote가 속성이 같으면 상호 할당 가능

3. 구조적 서브타이핑

  • 객체가 더 많은 속성을 가지더라도 요구하는 속성을 포함하면 할당 가능

4. 구조적 타이핑 vs 명목적 타이핑

  • 명목적: 타입 이름이 중요 (Java 등)
  • 구조적: 타입 구조가 중요 (TypeScript)
  • TS는 자바스크립트의 덕 타이핑 개념을 수용한 구조적 시스템 채택

5. 구조적 타이핑의 함정

  • 추가 속성이 있는 객체도 호환 가능하기 때문에 예기치 않은 타입 에러 발생 가능
interface Cube {
  width: number;
  height: number;
  depth: number;
}

function addLines(c: Cube) {
  let total = 0;

  for (const axis of Object.keys(c)) {
    // 🚨 Element implicitly has an 'any' type
    // because expression of type 'string' can't be used to index type 'Cube'.
    // 🚨 No index signature with a parameter of type 'string'
    // was found on type 'Cube'
    const length = c[axis];

    total += length;
  }
}

6. 점진적 타입 검사

  • 타입 생략 시 any처럼 취급됨
  • 명시된 타입은 정적으로 검사, 생략된 건 동적 검사됨

7. 값 vs 타입 공간

  • 타입스크립트에서 타입과 값은 별개의 공간 (타입 공간 vs 값 공간)
  • 동일한 이름 사용 가능
    • type Developer, const Developer
  • 클래스, enum은 타입 + 값 공간 모두 사용 가능

8. typeof 연산자

  • 값 공간: JS typeof → "string", "number" 등 문자열 반환
  • 타입 공간: 변수나 값의 타입을 추론함 → type T = typeof person
  • 클래스에서 typeof 클래스는 생성자 타입을 의미함
    • typeof Developer → new (...) => Developer
    • typeof zig → Developer

9. instanceof

  • 특정 클래스의 인스턴스인지 런타임에 검사하는 연산자
  • if (x instanceof Error)처럼 타입 정제 가능

10. 타입 단언

  • as 키워드로 개발자가 타입을 강제 지정
  • 컴파일 타임에서만 유효하며 런타임에는 효과 없음

11. 타입 가드

  • 조건문을 통해 타입을 좁히는 방법
  • in, typeof, instanceof, 사용자 정의 타입가드 등

2.3 원시 타입

  • 타입스크립트는 원시 값과 래퍼 객체를 구분함 (예: boolean vs Boolean)

주요 원시 타입

  • boolean: true/false
  • undefined: 할당되지 않은 값
  • null: 값이 비어있음을 명시
  • number: 숫자 값 (정수, 실수, NaN, Infinity 포함)
  • bigint: 큰 정수 (ES2020)
  • string: 문자열
  • symbol: 유일한 식별자. unique symbol도 존재함

2.4 객체 타입

1. object

  • 객체 타입 (함수, 배열, 클래스, 정규표현식 포함)
  • 원시 타입은 제외됨

2. {}

  • 속성이 없는 타입 (빈 객체)
  • 하지만 Object.prototype 메서드는 사용할 수 있음

3. array

  • 동일 타입 원소로 이루어진 배열
  • 선언법: number[] or Array<number>
  • 튜플과 구분: 튜플은 개수와 타입 고정됨 ([string, number] 등)

4. type과 interface

  • 객체 타입 선언 방식 두 가지
  • 대부분의 경우 호환되며, interface는 확장성과 선언 병합에 강점

5. function

  • 자바스크립트에서 function은 typeof 연산 시 "function"으로 구분됨
  • 타입스크립트에서는 함수 시그니처를 통해 타입 명시
    • 예: (a: number, b: number) => number
  • 이걸 호출 시그니처(call signature)라고 함