고급 TypeScript - 함수와 제네릭: 오버로드 함수
함수와 제네릭: 오버로드 함수
함수와 제네릭 오버로드 함수는 TypeScript에서 매우 중요한 개념으로, 다양한 입력 타입에 대해 유연하게 동작하는 함수를 정의할 수 있게 해줍니다. 이러한 기능은 특히 복잡한 데이터 구조를 다루거나 특정 조건에 따라 다른 타입의 결과를 반환해야 할 때 유용합니다.
1. 기본 개념 이해하기
-
함수: 프로그램 내에서 특정 작업을 수행하는 코드 블록입니다. 매개변수를 받아들이고, 처리 후 값을 반환할 수 있습니다.
-
제네릭: 여러 데이터 타입을 지원하는 코드를 작성할 수 있도록 도와주는 TypeScript의 기능입니다. 이를 통해 재사용성과 가독성을 높일 수 있습니다.
-
오버로드: 동일한 이름의 함수를 여러 번 정의하여 서로 다른 매개변수 목록을 가질 수 있는 기능입니다. 이는 하나의 함수가 다양한 방식으로 호출될 수 있도록 만듭니다.
2. 제네릭 오버로드 함수 구현하기
제네릭 오버로드 함수를 사용하면 다양한 입력 타입에 대한 처리를 보다 쉽게 관리할 수 있습니다. 아래 예제를 통해 이 개념을 설명하겠습니다.
예제: 두 값 비교하기
function compare<T>(a: T, b: T): boolean;
function compare(a: number, b: number): boolean;
function compare(a: string, b: string): boolean;
function compare<T>(a: T, b: T): boolean {
return a === b; // 동일성 비교
}
// 사용 예시
console.log(compare(5, 5)); // true (number)
console.log(compare('hello', 'world')); // false (string)
console.log(compare(true, true)); // true (boolean)
위의 예제에서는 compare
라는 이름의 세 가지 버전이 정의되어 있습니다:
- 일반적인 제네릭 버전 (
T
를 사용하는) - 숫자 전용 버전
- 문자열 전용 버전
각각의 경우에 대해 올바른 타입이 전달되면 해당 로직이 실행됩니다.
3. 장점과 활용 사례
-
유연성:
- 다양한 데이터 유형을 동시에 처리 가능하므로 코드 중복이 줄어들고 유지보수가 쉬워집니다.
-
타입 안전성:
- 잘못된 타입 인자를 사용할 경우 컴파일 타임에서 오류를 발견할 수 있어 더 안정적인 코드를 작성할 수 있습니다.
-
복잡한 API 설계:
- 라이브러리나 프레임워크 개발 시 사용자에게 친숙하고 직관적인 API를 제공하는 데 큰 도움이 됩니다.
실생활 응용 사례
예를 들어, 사용자의 프로필 정보를 가져오는 API가 있다고 가정해봅시다:
interface UserProfile {
id: number;
name: string;
}
function fetchUser<T extends UserProfile>(idOrName: T | number): Promise<T> {
return new Promise((resolve) => {
const user = { id: 1, name: "John Doe" }; // Mocked data
if (typeof idOrName === "number") {
resolve(user as T); // ID로 조회 후 리턴
} else {
resolve(user as T); // Name으로 조회 후 리턴
}
});
}
// 사용 예시
fetchUser(1).then(user => console.log(user.name));
fetchUser({ id : 1 , name : "John Doe"}).then(user => console.log(user.id));
위 코드에서는 fetchUser
라는 비동기 함수를 만들었습니다. 이 함수는 사용자 ID 또는 이름을 기반으로 프로필 정보를 가져옵니다.
결론적으로, 함수와 제네릭 오버로드 함수를 잘 활용하면 TypeScript로 더욱 강력하고 유연한 코드를 작성할 수 있으며 복잡한 문제도 효과적으로 해결할 수 있습니다!