[TYPESCRIPT] 선택적 매개변수와 기본값 매개변수 - TypeScript에서 함수 유연성을 높이는 핵심 문법

TypeScript에서 함수는 다양한 형태의 인자를 받을 수 있습니다. 그중에서도 선택적(Optional) 매개변수기본값(Default) 매개변수는 함수를 더 유연하고 직관적으로 설계할 수 있는 중요한 기능입니다.

 

선택적 매개변수(Optional Parameter)란?

선택적 매개변수는 “있어도 되고 없어도 되는 매개변수”입니다. TypeScript에서는 매개변수 이름 뒤에 ?를 붙여 선언합니다.

function greet(name: string, message?: string) {
  console.log(`${name}: ${message ?? "안녕하세요"}`);
}

greet("Alice"); 
// 출력: Alice: 안녕하세요

greet("Bob", "환영합니다");
// 출력: Bob: 환영합니다

선택적 매개변수는 호출 시 생략할 수 있으며, 전달되지 않을 경우 undefined 값을 갖습니다.

선택적 매개변수 규칙

  • 반드시 필수 매개변수 뒤에 위치해야 한다.
  • 타입은 자동으로 string | undefined와 같은 형태가 된다.
  • 값이 없을 때를 처리하는 로직이 필요하다 (nullish coalescing 등).

 

기본값 매개변수(Default Parameter)란?

기본값 매개변수는 “값이 전달되지 않았을 때 사용할 기본값”을 지정하는 문법입니다. JavaScript/ES6 문법을 그대로 지원합니다.

function echo(message: string = "Hello") {
  console.log(message);
}

echo(); 
// 출력: Hello

echo("Hi!");
// 출력: Hi!

기본값 매개변수 특징

  • 값이 전달되지 않으면 기본값이 자동으로 할당된다.
  • 기본값이 있는 매개변수는 사실상 선택적 매개변수와 동일하다.
  • 선택적 매개변수와 달리, 타입이 undefined | T로 자동 확장되지 않는다.

 

선택적 vs 기본값 — 무엇이 다를까?

구분 선택적 매개변수 (message?) 기본값 매개변수 (message = "Hi")
값 전달 여부 생략 가능 생략 가능
타입 string | undefined string (기본값 제공 시 undefined 아님)
undefined 처리 직접 처리 필요 자동 처리됨
사용 추천 전달 여부가 의미 있는 경우 기본 동작이 명확한 경우

 

두 문법을 결합할 수도 있을까?

실제로 선택적 매개변수 ?와 기본값을 함께 사용할 필요는 없습니다. 왜냐하면 기본값이 있으면 TypeScript는 그 매개변수를 선택적으로 취급하기 때문입니다.

// Bad
function greet(name?: string = "guest") {}

// Good
function greet(name: string = "guest") {}

기본값을 사용하는 순간 “있어도 되고 없어도 되는 인자”가 되므로 ?를 붙이는 건 중복이자 불필요한 문법입니다.

 

Rest 파라미터와 선택적 인자

선택적 인자와 기본값은 Rest 파라미터(...args)와 함께 자주 사용됩니다.

function log(level: string = "info", ...messages: string[]) {
  console.log(`[${level}]`, ...messages);
}

log("debug", "A", "B");
log(undefined, "X", "Y");

이 패턴은 로깅, 검증 함수 등 실무에서 자주 활용됩니다.

 

실무에서의 사용 기준

✔ 선택적 매개변수를 사용해야 하는 경우

  • 인자가 제공되었는지 여부 자체가 의미가 있을 때
  • undefined와 값이 들어온 경우를 구분해야 할 때
  • API 설계에서 “값이 없어도 동작하지만 로직이 달라지도록” 기획된 경우

✔ 기본값 매개변수를 사용해야 하는 경우

  • 인자가 생략되더라도 함수가 자연스럽게 동작해야 할 때
  • 기본값이 명확한 상황 (로그 레벨, 초기 설정값 등)
  • undefined를 직접 처리할 필요가 없도록 만들 때

 

실무 예제: API 요청 옵션 처리

interface RequestOptions {
  timeout?: number;
  retry?: number;
}

function request(url: string, options: RequestOptions = {}) {
  const timeout = options.timeout ?? 5000;
  const retry = options.retry ?? 3;

  console.log(`timeout=${timeout}, retry=${retry}`);
}

request("/api/data");
request("/api/data", { timeout: 2000 });

옵션 객체는 선택적 매개변수와 기본값 매개변수를 함께 사용하는 대표적인 패턴입니다.

 


 

선택적 매개변수와 기본값 매개변수는 TypeScript 함수의 유연성과 가독성을 높이는 핵심 기능입니다. 두 문법을 정확히 이해하면 API 설계를 더 명확하게 하고, 실무에서 발생하는 많은 불필요한 조건문을 줄일 수 있습니다.