[TS] - 함수 오버로딩(Overloading)

728x90
반응형

 

먼저 들어가기에 앞서, 

보통 아래와 같이 매개변수나 리턴타입을 Union타입을 이용하여 상황에 맞게 함수를 사용하였을 겁니다.

function coordinate(x: number | string, y: number | string): string | number {
  if (typeof x === "string" && typeof y === "string") {
    return x + y;
  } else {
    return Number(x) + Number(y);
  }
}

console.log(coordinate(1, 2));       // 3
console.log(coordinate("1", "2"));   // 12
console.log(coordinate(1, "2"));     // 3 (의도되지 않은 매개변수)
console.log(coordinate("1", 2));     // 3 (의도되지 않은 매개변수)

 

물론 타입을 잘 맞게 사용하면 되지만, 보통은 매개변수에 number면 number, string이면 string으로 구성된 매개변수를 사용할 텐데

Union타입이다보니 number 타입과 string타입을 같이 사용할 수 있는 의도치 않은 매개변수로 동작 할 수 있는 가능성이 존재합니다.

 

이럴때 필요한 방법이 오버로딩입니다.

 

오버로딩 (Overloading)

함수 이름은 같지만 매개변수 또는 리턴타입의 타입이 다른 함수를 말합니다. 호출할 수 있는 함수의 타입을 미리 여러 개를 만들어두는 기법입니다.

타입스크립트는 다른 언어와 다르게 선언부구현부로 나뉩니다.

 

선언부

가능한 매개변수 타입만 지정

구현부

모든 선언부를 표현할 수 있어야 한다.

function coordinate2(x: number, y: number): number;
function coordinate2(x: string, y: string): string;
function coordinate2(x: any, y: any): any {
  return x + y;
}

console.log(coordinate2(1, 2));
console.log(coordinate2("1", "2"));
console.log(coordinate2(1, "2"));   // 에러
console.log(coordinate2("1", 2));   // 에러

 

 

오버로딩을 사용할때 주의할 점이 있습니다.

타입스크립트는 함수에 오버로딩이 있을 때 위에서부터 순서대로 검사합니다.

function log(a: string): void;
function log(a: number): void;
function log(a: string | number): void {
  console.log(a);
}

function error(a: string | number) {
  log(a); // 에러 발생
}

error함수의 파라미터는 string | number 인데, log함수의 param은 string 이나 number여서 에러가 발생합니다.

 

애초에 오버로딩을할 필요가 없는데 오버로딩을 했다가 문제가 발생하는 경우를 봤는데,

Union타입을 활용할 수 있는 경우라면 먼저 Union타입을 사용 후 오버로딩을 사용하는 편이 좋습니다.

반응형

'Web' 카테고리의 다른 글

리액트 컴포넌트 성능 최적화  (0) 2025.01.11
[Next.js] - Pages Router 기반 SSR  (1) 2024.10.15
반응형 디자인을 위한 개발자 TIP  (0) 2024.08.16
SOP, CORS 개념  (0) 2023.03.02
[React] Redux(리덕스) Concept  (1) 2022.12.31