💻 프로그래밍

타입

Type

데이터의 종류를 정의. 정적/동적 타이핑. 타입 안전성은 버그 예방에 중요.

📖 상세 설명

타입(Type)은 데이터의 종류를 정의하는 분류 체계입니다. 숫자, 문자열, 불리언, 배열, 객체 등 다양한 타입이 있으며, 각 타입은 해당 데이터에 적용할 수 있는 연산과 저장 방식을 결정합니다. 타입 시스템은 프로그램의 안전성과 정확성을 보장하는 핵심 메커니즘입니다.

정적 타이핑(Static Typing)은 컴파일 시점에 타입을 검사합니다. Java, C++, TypeScript, Rust 등이 이에 해당하며, 타입 오류를 실행 전에 발견할 수 있습니다. 동적 타이핑(Dynamic Typing)은 런타임에 타입을 결정하며, Python, JavaScript, Ruby 등이 대표적입니다. 유연하지만 런타임 오류 가능성이 있습니다.

강한 타이핑(Strong Typing)은 암묵적 타입 변환을 제한합니다(Python, Java). 약한 타이핑(Weak Typing)은 자동 타입 변환이 허용됩니다(JavaScript, PHP). "1" + 2가 JavaScript에서는 "12"가 되지만, Python에서는 에러가 발생합니다.

현대 언어들은 타입 추론(Type Inference)을 지원하여 명시적 타입 선언 없이도 컴파일러가 타입을 유추합니다. TypeScript의 let x = 5는 자동으로 number 타입이 됩니다. 제네릭을 통해 타입 안전성을 유지하면서 재사용 가능한 코드를 작성할 수 있습니다.

💻 코드 예제

// TypeScript 타입 시스템 예제

// 1. 기본 타입
let count: number = 42;
let name: string = "Alice";
let isActive: boolean = true;
let items: number[] = [1, 2, 3];

// 2. 타입 추론
let inferred = "Hello";  // string으로 추론
// inferred = 123;  // Error: Type 'number' is not assignable to type 'string'

// 3. 유니온 타입
type StringOrNumber = string | number;
function display(value: StringOrNumber) {
    if (typeof value === "string") {
        console.log(value.toUpperCase());
    } else {
        console.log(value.toFixed(2));
    }
}

// 4. 인터페이스와 타입 별칭
interface User {
    id: number;
    name: string;
    email?: string;  // optional
}

type Point = {
    x: number;
    y: number;
};

// 5. 제네릭
function first(arr: T[]): T | undefined {
    return arr[0];
}

const firstNum = first([1, 2, 3]);     // number | undefined
const firstStr = first(["a", "b"]);    // string | undefined

// 6. 타입 가드
function isString(value: unknown): value is string {
    return typeof value === "string";
}

🗣️ 실무 대화 예시

시니어: API 응답 타입 정의가 없어서 런타임 에러가 자주 나요. 타입을 추가합시다.

주니어: any로 하면 빠르게 해결되지 않나요?

시니어: any는 타입 안전성을 포기하는 거예요. 최소한 unknown을 쓰고 타입 가드로 좁히거나, API 스키마에서 타입을 자동 생성하세요.

면접관: 정적 타이핑과 동적 타이핑의 장단점은 무엇인가요?

지원자: 정적 타이핑은 컴파일 시점에 오류를 잡아 안전하고, IDE 자동완성이 강력합니다. 하지만 초기 개발 속도가 느릴 수 있어요. 동적 타이핑은 빠른 프로토타이핑이 가능하지만 런타임 오류와 리팩토링 어려움이 있습니다.

면접관: TypeScript에서 any와 unknown의 차이는요?

지원자: any는 모든 타입 검사를 무시하고, unknown은 사용 전에 타입을 좁혀야 합니다. unknown이 더 안전해서 외부 데이터 처리에 권장됩니다.

리뷰어: 이 함수 반환 타입이 any로 되어 있는데, 명시적으로 지정해주세요.

작성자: 복잡해서 추론에 맡겼는데요.

리뷰어: 공개 API의 반환 타입은 명시하는 게 좋아요. 리팩토링할 때 의도치 않은 타입 변경을 방지할 수 있거든요.

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기