프로그래밍/Typescript

TypeScript의 제네릭 타입: 코드 재사용성과 유연성의 극대화

shimdh 2025. 4. 13. 10:16
728x90

TypeScript는 JavaScript의 상위 집합으로, 정적 타입을 지원하여 개발자들이 더 안전하고 효율적인 코드를 작성할 수 있도록 돕습니다. 그 중에서도 제네릭 타입은 코드의 재사용성을 극대화하고, 다양한 데이터 유형을 처리할 수 있는 유연성을 제공합니다. 이번 포스트에서는 제네릭 타입의 기본 개념부터 시작하여, 제네릭 인터페이스, 제네릭 클래스, 다중 제너릭 파라미터에 이르기까지 다양한 측면을 살펴보겠습니다.

1. 제네릭의 기본 개념

제네릭은 함수나 클래스가 호출될 때 실제로 사용할 데이터 유형에 따라 동적으로 타입이 결정되는 기능입니다. 이는 특히 배열이나 리스트와 같은 컬렉션 구조체를 만들 때 유용하며, 다양한 데이터 유형을 처리할 수 있는 유연성을 제공합니다.

예시: 기본 제네릭 함수

function identity<T>(arg: T): T {
    return arg;
}

let output = identity<string>("Hello World"); // output의 타입은 string
let numberOutput = identity<number>(42); // numberOutput의 타입은 number

위의 예시에서 identity 함수는 입력된 인자의 데이터 유형(T)에 따라 반환되는 값의 데이터 유형도 동일하게 유지됩니다. 이처럼 제네릭을 사용하면 코드의 일관성을 유지하면서도 다양한 데이터 유형을 처리할 수 있는 장점이 있습니다.

2. 제네릭 인터페이스

제네릭 인터페이스는 복잡한 객체 구조에서도 여러 가지 형태를 지원하는 강력한 도구입니다. 이러한 방식으로 작성된 인터페이스는 다양한 상황에서 재사용될 수 있으며, 이는 코드의 유연성을 더욱 높여줍니다.

예시: 제네릭 인터페이스 사용

interface GenericIdentityFn<T> {
    (arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn<number> = identity; // myIdentity는 숫자형만 허용됨

GenericIdentityFn 인터페이스는 어떤 종류의 데이터를 받아들이고 그 데이터를 반환하는 함수를 정의합니다. 이를 통해 개발자는 특정 데이터 유형에 맞춰 인터페이스를 쉽게 정의하고 사용할 수 있습니다.

3. 제네릭 클래스

제네릭 클래스는 객체 지향 프로그래밍 패러다임과 잘 어울리며, 상태(state)와 메서드(method)를 갖춘 클래스를 다양한 데이터 형식으로 생성할 수 있게 합니다. 이를 통해 코드의 재사용성을 높이고 유지보수를 용이하게 합니다.

예시: 제네릭 클래스 사용

class Box<T> {
    private contents: T;

    constructor(value: T) {
        this.contents = value;
    }

    getContents(): T {
        return this.contents;
    }
}

let boxOfStrings = new Box<string>("Hello");
console.log(boxOfStrings.getContents()); // "Hello"

let boxOfNumbers = new Box<number>(123);
console.log(boxOfNumbers.getContents()); // 123

위 예시는 Box라는 클래스를 통해 문자열과 숫자를 각각 저장하고 꺼내오는 방법을 보여줍니다. 제네릭 클래스를 활용하면 다양한 데이터 유형을 처리하는 객체를 쉽게 생성할 수 있습니다.

4. 다중 제너릭 파라미터

때때로 하나 이상의 제너릭 파라미터가 필요할 수도 있습니다. 이 경우에도 간단하게 구현할 수 있으며, 이를 통해 더욱 복잡한 데이터 구조를 처리할 수 있습니다.

예시: 다중 제너릭 파라미터 사용

function pair<K, V>(key: K, value: V): [K, V] {
    return [key, value];
}

const keyValuePair = pair<string, number>('age', 30);
console.log(keyValuePair); // ['age', 30]

여기서는 키와 값을 쌍으로 묶어주는 pair 함수를 만들어 두 개의 서로 다른 타입(K와 V)을 받아들입니다. 이를 통해 개발자는 다양한 데이터 유형을 조합하여 사용할 수 있는 유연한 코드를 작성할 수 있습니다.

결론

제네릭 타이핑 기술은 TypeScript에서 매우 강력하고 유용한 기능입니다. 이를 활용함으로써 개발자는 더욱 견고하고 확장 가능한 코드를 작성할 수 있으며, 코드베이스 내에서 일관성을 유지하면서도 다양한 요구 사항을 충족시키는 것이 가능합니다. 제네릭을 통해 개발자는 코드의 재사용성을 높이고, 다양한 데이터 유형을 처리하는 데 필요한 유연성을 확보할 수 있습니다. 이러한 특성 덕분에 제네릭은 현대 웹 개발에서 필수적인 도구로 자리 잡고 있습니다.

728x90