Polymorphism (다형성)
개요
정의
- 'poly' 많은, 다수의 + 'morphos' 형태, 구조
- 여러가지 다른 모양을 가지고 있는 성질
코드 예시
배열의 모든 요소를 프린트하는 함수 생성 (타입 상관 X)
type SuperPrint = {
(arr: number[]): void
(arr: boolean[]): void
}
const superPrint: SuperPrint = (arr) => {
arr.map(v => console.log(v));
}
superPrint([1, 2, 3, 4]);
superPrint([true, false, true]);
superPrint(["1", "2", "3", "4"]);
- 의문점 1
- 위의 코드에서 에러 발생한 부분을 해결하기 위해서
(arr: string[]): void
호출 시그니쳐를 추가하는 것이 좋은 방법일까요?
type SuperPrint = {
(arr: number[]): void
(arr: boolean[]): void
(arr: string[]): void
}
const superPrint: SuperPrint = (arr) => {
arr.map(v => console.log(v));
}
superPrint([1, 2, 3, 4]);
superPrint([true, false, true]);
superPrint(["1", "2", "3", "4"]);
superPrint([1, 2, true, false]);
- 의문점 2
- 위의 코드에서 에러 발생한 부분을 해결하기 위해서
(arr: (number|boolean)[]): void
호출 시그니쳐를 추가하는 것이 좋은 방법일까요?
제네릭 (Generic)
개요
- 함수가 다형성을 가질때 발생할 수 있는 위의 의문점, 문제들을 해결하기 위해 사용합니다.
정의
- C# 이나 Java 와 같은 언어에서 재사용 가능한 컴포넌트 만들기 위해 사용하는 기법입니다.
- 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하는 기법입니다.
- 타입의 placeholder 와 같습니다.
사용하는 이유
- 단일 타입이 아닌 다양한 타입에서 작동할 수 있는 컴포넌트를 생성할 수 있습니다.
call signature
작성할 때 인자의 확실한 타입을 모르는 경우에 사용합니다.
any
를 사용하는 것과는 근본적으로 다르게 동작합니다.
- 제네릭은
call signature
를 추정해서 생서해주지만, any
는 아무것도 하지 않습니다.
사용법 (복수 제네릭 가능)
- 타입스크립트에
generic
을 사용한다고 알려줍니다. (꺽쇠 <> 사용)
- 제네릭을 사용하고 싶은 곳에 제네릭을 선언해줍니다.
- 제네릭에 해당하는 부분은 타입스크립트가 추정한 값으로 자동으로 대체됩니다.