검수요청.png검수요청.png

타입 (프로그래밍)

위키원
(Type에서 넘어옴)
이동: 둘러보기, 검색

타입(type)은 프로그래밍 언어에서 값의 속성 및 가능한 연산을 정의하는 분류 체계이다. 변수상수, 함수의 인자 및 반환값에 대해 "어떤 종류의 값인가?"를 명시하며, 프로그램의 안정성, 명확성, 성능 등에 큰 영향을 준다. 대부분의 현대 언어는 어떤 형태로든 타입 시스템(type system)을 채택하고 있다.

개요[편집]

타입(Type)은 프로그래밍에서 데이터의 종류와 그 데이터에 적용 가능한 연산을 정의하는 시스템이다. 타입 시스템은 프로그램의 정확성, 안정성, 가독성을 보장하기 위한 핵심 메커니즘으로, 모든 현대 프로그래밍 언어에서 중요한 역할을 한다.

타입은 컴퓨터가 메모리 안의 데이터를 어떻게 해석하고 처리해야 할지를 결정하는 형식 정보이다.

예를 들어, 다음 두 값은 동일한 비트 패턴을 가질 수 있지만 타입이 다르면 해석이 전혀 달라진다:

  • 0x41 → char로 해석하면 'A'
  • 0x41 → int로 해석하면 65

주요 역할[편집]

  • 정적 분석: 컴파일 타임에 오류를 미리 탐지
  • 문서화: 함수 시그니처 등에서 의미를 명확히 전달
  • 성능 향상: 최적화 가능한 코드 생성 유도
  • 안전성 보장: 부적절한 연산 방지
  • 추상화: 복잡한 구조를 추상적인 단위로 다룸

기본 타입 분류[편집]

원시 타입 (Primitive Types)
  • 정수형 (int, short, long)
  • 실수형 (float, double)
  • 문자형 (char, rune)
  • 불리언 (bool)
복합 타입 (Composite Types)
  • 배열 (int[], List<int>)
  • 구조체 (struct)
  • 클래스 (class)
  • 튜플 ((int, string))
추상 타입 (Abstract Types)
  • 인터페이스 (interface)
  • 제네릭 타입 (T, List<T>)
  • 타입 매개변수 (template <typename T>)
사용자 정의 타입
  • typedef, type alias, enum, union 등

정적 vs 동적 타입[편집]

화폐 앞면 뒷면
구분 정적 타이핑 (Static Typing) 동적 타이핑 (Dynamic Typing)
정의 시점 컴파일 시 타입 결정 실행 시 타입 결정
예시 언어 C, C++, Java, Rust, Go Python, JavaScript, Ruby
장점 빠른 실행, 오류 탐지 용이 유연성, 간결한 문법
단점 장황한 문법, 타입 추론 필요 런타임 오류 가능성

== 강타입 vs 약타입

구분 강타입 (Strong Typing) 약타입 (Weak Typing)
정의 암묵적 변환이 제한적 암묵적 변환이 자유로움
예시 Python, Rust, Haskell C, JavaScript
"5" + 1 → 오류 "5" + 1 → "51" (JS)

명시적 vs 암묵적 타입 지정[편집]

명시적(Explicit)
타입을 코드에서 직접 지정
c++

int x = 5;
암묵적(Implicit)
컴파일러가 타입을 추론
rust

let x = 5;  // i32로 추론됨

타입 추론 (Type Inference)[편집]

  • 프로그래머가 타입을 명시하지 않아도, 컴파일러가 문맥을 보고 자동으로 결정
  • 대표 언어: Haskell, OCaml, Rust, Kotlin, Swift
  • 예:
h

add x y = x + y  -- 타입 추론: Num a => a -> a -> a

타입 계층과 상속[편집]

  • 서브타이핑(subtyping): 어떤 타입이 다른 타입의 하위집합일 때
  • 예: Dog는 Animal의 서브타입
  • Liskov 치환 원칙 (LSP): 상위 타입 객체를 하위 타입 객체로 대체할 수 있어야 함

제네릭 타입과 다형성[편집]

  • 제네릭(generic): 하나의 함수나 클래스가 여러 타입에 대해 작동할 수 있음
cpp
 
template <typename T>
T add(T a, T b) { return a + b; }
  • 다형성(polymorphism): 같은 인터페이스에 대해 다양한 구현 가능
  • 매개변수 다형성 (Parametric Polymorphism)
  • 포함 다형성 (Subtype Polymorphism)

타입 시스템의 종류[편집]

1. 명세적 타입 시스템 (Explicit Type System)

타입을 코드에 명확히 지정해야 함

2. 타입 추론 기반 시스템

타입 지정 없이 추론

3. 유니피케이션 기반 (Hindley-Milner 등)

함수형 언어에서 일반적

4. 리플렉션/런타임 타입 정보

Java의 Class<?>, Python의 type(), C++의 RTTI 등

고급 타입 개념[편집]

  • 합집합 타입 (Union Types): 하나 이상의 타입이 될 수 있음 (int | string)
  • 교집합 타입 (Intersection Types): 모든 타입의 속성을 만족해야 함
  • 옵션 타입 (Optional/Nullable): 값이 없을 수도 있는 타입 (Option<T>, T?)
  • 타입 가드 / 좁히기 (Type Narrowing): 조건문을 통해 타입 범위를 좁힘
  • 존재적 타입 (Existential Types): "어떤 타입이긴 한데 정확히는 모름"
  • 의존형 타입 (Dependent Types): 값에 따라 타입이 달라짐 (Idris, Coq 등)

실사용 예시[편집]

타입 안전성 강화
rust

fn divide(x: f64, y: f64) -> Option<f64> {
    if y == 0.0 {
        None
    } else {
        Some(x / y)
    }
}
타입에 의한 오버로딩
cpp

void print(int x);
void print(std::string s);
동적 타입 활용
python

def add(a, b):
    return a + b  # 타입에 따라 의미가 달라짐

타입 관련 오류[편집]

  • 타입 불일치 : 예상된 타입과 실제 타입이 다름
  • 캐스팅 오류 : 잘못된 형 변환
  • 널 포인터 접근 : null 또는 None 값을 잘못 사용
  • 런타임 타입 오류 : 동적 언어에서 많이 발생

타입 설계 원칙[편집]

타입 계층 설계 (LSP 준수)
cpp

// Liskov 치환 원칙
class Bird {
public:
    virtual void fly() = 0;
};

class Penguin : public Bird {  // 위반! 펭귄은 날 수 없음
    void fly() override { /* 문제 발생 */ }
};
불변 타입 활용
java

// Java 불변 클래스
public final class ImmutablePoint {
    private final int x;
    private final int y;
    
    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // getter만 제공
}
타입 좁히기 (Narrowing)
typescript

function process(input: string | number) {
    if (typeof input === 'string') {
        // 여기서 input은 string 타입으로 좁혀짐
        console.log(input.toUpperCase());
    }
}

타입 시스템의 미래[편집]

  • 리퀴드 타입 (Liquid Types)
  • 값의 범위를 타입으로 지정: {v:Int | 0 <= v && v <= 100}
  • 선형 타입 (Linear Types)
  • 리소스 관리에 특화 (Rust의 소유권 시스템 발전형)
  • 타입 메타프로그래밍
  • 컴파일 타임에 타입 계산 수행 (C++ 템플릿 메타프로그래밍의 진화)

같이 보기[편집]


  검수요청.png검수요청.png 이 타입 (프로그래밍) 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.