안동민 개발노트 아이콘

안동민 개발노트

3장 : 함수와 타입

선택적 매개변수와 기본 매개변수

이번에는 함수를 더욱 유연하게 만들면서도 타입 안전성을 유지할 수 있도록 돕는 두 가지 중요한 개념, 바로 선택적 매개변수(Optional Parameters)기본 매개변수(Default Parameters)에 대해 깊이 있게 다루겠습니다. 이 기능들은 함수 호출 시 인자의 개수나 제공 여부를 조절해야 할 때 매우 유용합니다.


선택적 매개변수 기초 문법

때때로 함수를 호출할 때 모든 매개변수가 항상 필요한 것은 아닐 수 있습니다. 특정 매개변수가 존재할 수도 있고, 없을 수도 있는 상황에서 사용되는 것이 바로 선택적 매개변수입니다. 타입스크립트에서는 매개변수 이름 뒤에 물음표(?)를 붙여 해당 매개변수가 선택적임을 나타냅니다.

// 사용자 정보를 요약하는 함수
function summarizeUser(name: string, email?: string, phone?: string): string {
  let summary = `이름: ${name}`;
  if (email) {
    summary += `, 이메일: ${email}`;
  }
  if (phone) {
    summary += `, 전화번호: ${phone}`;
  }
  return summary;
}

// 다양한 방식으로 함수 호출
console.log(summarizeUser("홍길동"));
// 출력: 이름: 홍길동

console.log(summarizeUser("김철수", "chulsu@example.com"));
// 출력: 이름: 김철수, 이메일: chulsu@example.com

console.log(summarizeUser("이영희", "yh@example.com", "010-1234-5678"));
// 출력: 이름: 이영희, 이메일: yh@example.com, 전화번호: 010-1234-5678

// 오류: 필수 매개변수를 누락할 수 없습니다.
// summarizeUser(); // Error: Expected 1-3 arguments, but got 0.

위 예시에서 emailphone 매개변수는 ?가 붙어 있어 선택적입니다. 함수 내부에서는 이 매개변수들이 undefined일 수 있음을 고려하여 조건문(if (email))으로 존재 여부를 확인하는 것이 일반적입니다.

중요한 규칙: 타입스크립트에서 선택적 매개변수는 항상 필수 매개변수 뒤에 위치해야 합니다. 만약 필수 매개변수 앞에 선택적 매개변수를 배치하려고 하면 컴파일 오류가 발생합니다.

// function invalidOrder(first?: string, second: string): void { // Error: Required parameter cannot follow an optional parameter.
//   // ...
// }

이 규칙은 함수 호출 시 매개변수들의 의미를 명확하게 하고, 타입스크립트 컴파일러가 인자들을 올바르게 매핑할 수 있도록 돕습니다.


기본 매개변수 활용 패턴

ES2015(ES6)부터 자바스크립트에서는 함수 매개변수에 기본 값(Default Value)을 직접 할당하는 문법이 도입되었습니다. 타입스크립트도 이 기능을 완벽하게 지원합니다. 매개변수에 기본 값이 할당되면, 해당 매개변수는 자동으로 선택적 매개변수로 간주됩니다. 함수 호출 시 해당 인자를 제공하지 않으면, 지정된 기본 값이 사용됩니다.

// 메시지를 출력하는 함수 (기본 접두사 지정)
function logWithPrefix(message: string, prefix: string = "[INFO]"): void {
  console.log(`${prefix} ${message}`);
}

// 기본값 사용
logWithPrefix("애플리케이션이 시작되었습니다.");
// 출력: [INFO] 애플리케이션이 시작되었습니다.

// 기본값 재정의
logWithPrefix("데이터베이스 연결 실패!", "[ERROR]");
// 출력: [ERROR] 데이터베이스 연결 실패!

// 다른 예시: 숫자의 거듭제곱 계산
function power(base: number, exponent: number = 2): number {
  return base ** exponent;
}

기본 매개변수의 장점:

  • 코드 간결성: 함수 내부에서 if (arg === undefined)와 같은 기본값 할당 로직을 작성할 필요가 없어 코드가 더 간결해집니다.
  • 가독성: 함수 서명만으로 어떤 매개변수가 선택적이며 어떤 기본 값을 가지는지 명확하게 알 수 있습니다.
  • 런타임 안전성: undefined 값이 의도치 않게 사용되는 것을 줄여줍니다.

선택적 매개변수와 기본 매개변수의 순서

아래 다이어그램은 이 절의 핵심 흐름을 역할과 상태 전환 중심으로 정리한 것입니다.

선택적 매개변수와 마찬가지로, 기본 매개변수 역시 필수 매개변수 뒤에 배치하는 것이 일반적입니다. 하지만, 기본 매개변수는 선택적 매개변수와 달리 필수 매개변수 중간에도 위치할 수 있습니다. 단, 이 경우 해당 기본 매개변수를 생략하려면 undefined를 명시적으로 전달해야 합니다.

// 기본 매개변수 뒤에 필수 매개변수가 오는 경우 (가능은 하지만 권장되지 않음)
function createGreeting(
  name: string = "Unknown",
  message: string, // 필수 매개변수
  salutation: string = "Hello"
): string {
  return `${salutation}, ${name}! ${message}`;
}

// console.log(createGreeting("World")); // Error: 'message' 매개 변수에 대한 인수가 없습니다.
// 필수 매개변수 `message`를 생략할 수 없습니다.

// 기본 매개변수를 생략하려면 undefined를 전달해야 합니다.
console.log(createGreeting(undefined, "Have a great day!"));
// 출력: Hello, Unknown! Have a great day!

console.log(createGreeting("Alice", "Nice to meet you!", "Hi"));
// 출력: Hi, Alice! Nice to meet you!

아래 다이어그램은 호출 인자가 선택적 매개변수와 기본 매개변수를 통과하며 타입 확인과 기본값 적용으로 이어지는 흐름을 압축해서 보여줍니다.

이러한 혼합된 순서는 코드의 가독성을 해칠 수 있으므로, 일반적으로 모든 필수 매개변수를 먼저 배치하고 그 뒤에 선택적/기본 매개변수를 배치하는 것이 좋은 습관입니다.


선택적 매개변수와 기본 매개변수는 함수를 더 유연하게 만들면서도 타입스크립트의 강력한 타입 검사 이점을 유지할 수 있도록 돕는 중요한 기능입니다. 함수를 설계할 때 어떤 인자가 항상 필요한지, 어떤 인자는 선택적이며 기본값이 필요한지 잘 고려하여 이들을 적절히 활용하시길 바랍니다.