C언어에서는 함수 오버로딩을 직접 지원하지 않는다.
동일한 이름의 함수를 여러 번 정의하면 컴파일 오류가 발생한다.
// 매개변수 없음
void func() {
printf("매개변수 없음\n");
}
// 매개변수가 한 개 (C에서는 함수 오버로딩을 지원하지 않으므로 오류 발생)
// void func(int a) {
// printf("%d\n", a + 20);
// }
int main() {
func();
// func(10); // 오류 발생
return 0;
}
TypeScript에서 함수 오버로딩을 구현하려면,
여러 개의 오버로드 시그니처를 선언한 후, 실제 구현부를 작성해야 한다.
funcnumber20을 곱한 값 출력// * 오버로드 시그니처 (함수의 호출 가능 형태 정의)
function func(a: number): void;
function func(a: number, b: number, c: number): void;
// * 구현 시그니처 (실제 함수 구현)
function func(a: number, b?: number, c?: number) {
if (typeof b === "number" && typeof c === "number") {
console.log(a + b + c);
} else {
console.log(a * 20);
}
}
func(); // ❌ 오류 발생 (오버로드 시그니처에 해당하는 형태가 없음)
func(1); // ✅ 정상 실행 → 20 출력
func(1, 2); // ❌ 오류 발생 (정의된 시그니처 없음)
func(1, 2, 3); // ✅ 정상 실행 → 6 출력
오버로드 시그니처는 호출 가능한 함수 형태를 제한하는 역할을 한다.
만약 구현 시그니처에서 모든 매개변수를 필수로 받는다면, 특정 오버로드 시그니처가 무의미해진다.
function func(a: number): void; // ❌ 오류 발생
function func(a: number, b: number, c: number): void;
function func(a: number, b: number, c: number) {
if (typeof b === "number" && typeof c === "number") {
console.log(a + b + c);
} else {
console.log(a * 20);
}
}
func(a: number) 형태를 정의하고 있지만,b와 c를 필수로 받기 때문에 첫 번째 오버로드 시그니처가 의미를 잃어버린다.모든 오버로드 시그니처가 의미를 가지도록 만들려면 선택적 매개변수를 활용하는 것이 좋다.
function func(a: number): void;
function func(a: number, b: number, c: number): void;
// 선택적 매개변수를 사용하여 오버로드 유지
function func(a: number, b?: number, c?: number) {
if (typeof b === "number" && typeof c === "number") {
console.log(a + b + c);
} else {
console.log(a * 20);
}
}
func(1), func(1, 2, 3) 모두 정상적으로 동작한다.💡 하지만, 모든 매개변수를 선택적으로 정의하면 오버로딩 없이도 동일한 기능을 구현할 수 있다.
따라서 함수의 다양한 호출 방식을 명확히 정의할 필요가 있을 때 오버로딩을 활용하는 것이 좋다.