프로그래밍/Typescript

타입스크립트의 제네릭 클래스: 코드 재사용성과 타입 안전성을 높이는 방법

shimdh 2025. 3. 28. 08:25
728x90

타입스크립트는 자바스크립트의 상위 집합으로, 정적 타입을 지원하여 개발자들이 더 안전하고 효율적인 코드를 작성할 수 있도록 돕습니다. 그 중에서도 제네릭 클래스는 코드의 재사용성을 극대화하고 다양한 데이터 타입을 효과적으로 처리할 수 있는 강력한 기능입니다. 이번 포스트에서는 제네릭 클래스의 필요성과 기본 문법, 사용 예시, 제약 조건 추가 방법에 대해 자세히 알아보겠습니다.

제네릭 클래스의 필요성

제네릭 클래스는 다음과 같은 이유로 매우 유용합니다.

  1. 유연성: 제네릭 클래스를 사용하면 여러 가지 데이터 타입에 대해 동일한 로직을 적용할 수 있습니다. 예를 들어, 숫자, 문자열, 객체 등 다양한 타입의 데이터를 처리할 수 있어 코드의 재사용성이 높아집니다.
  2. 타입 안전성: 제네릭을 활용하면 컴파일 시점에 타입 오류를 사전에 잡아낼 수 있어 런타임 에러를 줄일 수 있습니다. 이는 개발자가 더 안전한 코드를 작성할 수 있도록 도와줍니다.
  3. 코드 중복 감소: 비슷한 기능을 가진 여러 클래스를 만들 필요 없이 하나의 제네릭 클래스를 통해 다양한 상황을 처리할 수 있습니다. 이로 인해 코드의 가독성이 향상되고 유지보수가 용이해집니다.

기본 문법

제네릭 클래스를 정의하려면 클래스 이름 뒤에 <T>와 같은 형태로 제네릭 매개변수를 선언해야 합니다. 여기서 T는 임의의 타입을 나타내며, 이는 클래스가 다양한 데이터 타입을 수용할 수 있도록 해줍니다.

class 박스<T> {
    private 내용물: T;

    constructor(내용물: T) {
        this.내용물 = 내용물;
    }

    get 내용(): T {
        return this.내용물;
    }
}

위의 예시에서 박스라는 제네릭 클래스는 어떤 종류의 내용을 담을 수 있는 박스를 생성합니다. 이 클래스는 다양한 데이터 타입을 수용할 수 있는 유연성을 제공합니다.

사용 예시

이제 이 박스 클래스를 사용하여 다양한 데이터 타입으로 객체를 생성해보겠습니다:

// 숫자를 담는 박스
const 숫자박스 = new 박스<number>(123);
console.log(숫자박스.get 내용()); // 123

// 문자열을 담는 박스
const 문자열박스 = new 박스<string>("안녕하세요");
console.log(문자열박스.get 내용()); // 안녕하세요

// 배열을 담는 박스
const 배열박스 = new 박스<Array<number>>([1, 2, 3]);
console.log(배열박스.get 내용()); // [1, 2, 3]

위 코드에서는 number, string, 그리고 배열과 같은 서로 다른 데이터 유형으로 박스 객체를 생성했습니다. 각 경우마다 동일한 로직으로 작동하지만, 서로 다른 데이터를 다룰 수 있다는 점이 중요합니다. 이는 개발자가 다양한 데이터 타입을 처리할 수 있는 유연한 코드를 작성할 수 있게 해줍니다.

제약 조건 추가하기

때때로 특정 조건이나 제한이 필요한 경우가 있을 수 있습니다. 이러한 경우에는 제약 조건(constraining)이라는 개념을 사용할 수 있습니다. 제약 조건을 통해 특정 타입만을 허용하도록 설정할 수 있습니다.

예를 들어, 다음과 같이 인터페이스나 부모 클래스를 지정하여 사용할 수도 있습니다:

interface 길이가_있는 {
    길이: number;
}

class 길이_확인_박스<T extends 길이가_있는> {
    private 내용물: T;

    constructor(내용물: T) {
        this.내용물 = 내용물;
    }

    get 길이(): number {
        return this.내용물.length; 
    }
}

// 사용 예시:
const 문자열길이를담은상자 = new 길이_확인_박스<string>("Hello");
console.log(문자열길이를담은상자길이); // 5

위 예시는 길이가_있는 인터페이스를 구현하는 모든 타입만 허용하도록 설정하였습니다. 따라서 문자열뿐만 아니라 배열 등도 포함될 수 있습니다. 이러한 제약 조건을 통해 개발자는 더욱 안전하고 명확한 코드를 작성할 수 있습니다.

결론

제네릭 클래스는 복잡하고 다양하게 변하는 데이터 구조 속에서도 일관된 방식으로 코드를 작성할 수 있게 도와줍니다. 이를 통해 개발자는 더 효율적이고 유지보수가 용이한 코드를 작성할 수 있으며, 다양한 상황에서도 쉽게 대응 가능하게 됩니다. 제네릭 클래스를 활용함으로써 코드의 재사용성을 높이고, 타입 안전성을 확보하며, 코드 중복을 줄이는 등 여러 가지 이점을 누릴 수 있습니다.

728x90