0Pricing
TypeScript Academy · 강의

재귀 타입 정의

자기 자신을 안전하게 참조하는 타입을 작성합니다.

재귀 타입 정의은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

재귀 타입이란 무엇인가

재귀 타입은 자신의 정의에서 자기 자신을 참조하는 타입입니다. 이를 통해 깊이에 제한이 없는 데이터 구조를 설명할 수 있습니다.

type LinkedList<T> = {
  value: T;
  next: LinkedList<T> | null;
};
// next is the same type again, ending at null.

연결 리스트 타입

대표적인 예로 각 노드는 value와 다른 노드를 가리키는 next 포인터를 보유하며, 연결을 끝내려면 null을 사용합니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const list: LinkedList<number> = {
  value: 1,
  next: { value: 2, next: null }
};
console.log(list.value, list.next?.value);

기본 사례가 중요함

모든 재귀 타입에는 재귀를 끝낼 수 있도록 종료 조건이 필요하며, 여기서는 null이 그 역할을 합니다. 이것이 없으면 타입이 무한히 깊어집니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const single: LinkedList<string> = { value: "only", next: null };
console.log(single.next);

더 긴 연결 만들기

next 자체가 리스트 또는 null이므로 원하는 만큼 깊게 중첩할 수 있습니다. 타입이 어떤 길이든 허용하기 때문입니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const chain: LinkedList<number> = {
  value: 10,
  next: { value: 20, next: { value: 30, next: null } }
};
console.log(chain.next?.next?.value);

연결 리스트 순회하기

함수는 next를 따라가며 null에 도달할 때까지 연결을 순회할 수 있습니다. 재귀 타입 덕분에 이 과정은 완전히 타입 안전합니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function toArray<T>(list: LinkedList<T> | null): T[] {
  const out: T[] = [];
  let cur = list;
  while (cur) { out.push(cur.value); cur = cur.next; }
  return out;
}
const l: LinkedList<number> = { value: 1, next: { value: 2, next: null } };
console.log(toArray(l));

재귀 타입에 대한 재귀 함수

재귀 타입은 재귀 함수와 자연스럽게 결합됩니다. 여기서는 next에 대해 재귀 호출을 하여 길이를 계산합니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function length<T>(list: LinkedList<T> | null): number {
  return list === null ? 0 : 1 + length(list.next);
}
const l: LinkedList<string> = { value: "a", next: { value: "b", next: null } };
console.log(length(l));

리스트 앞에 추가하기

타입이 일관되므로 새 리스트를 쉽게 만들 수 있습니다. 기존 리스트를 새 머리 노드의 next로 감싸면 됩니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function prepend<T>(value: T, list: LinkedList<T> | null): LinkedList<T> {
  return { value, next: list };
}
const l = prepend(1, prepend(2, null));
console.log(l.value, l.next?.value);

선택적 종료 조건과 null 종료 조건

null로 종료하거나 next를 선택 사항으로 만들 수 있습니다. 둘 다 재귀를 끝내므로 끝을 어떻게 표현할지에 따라 선택하십시오.

type ListA<T> = { value: T; next: ListA<T> | null };
type ListB<T> = { value: T; next?: ListB<T> };
const a: ListA<number> = { value: 1, next: null };
const b: ListB<number> = { value: 1 };
console.log(a.value, b.value);

재귀 타입은 지연 평가됨

TypeScript는 실제로 사용하는 만큼만 재귀 타입을 확장합니다. 정의가 자기 자신을 참조하더라도 무한한 작업이 발생하지 않습니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
// Using two levels only expands two levels.
const l: LinkedList<number> = { value: 1, next: { value: 2, next: null } };
console.log(l.next?.value);

리스트에 매핑하기

재귀적인 매핑은 구조를 유지하면서 각 값을 변환하여 같은 형태의 새 리스트를 반환합니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function mapList<T, U>(list: LinkedList<T> | null, fn: (v: T) => U): LinkedList<U> | null {
  if (list === null) return null;
  return { value: fn(list.value), next: mapList(list.next, fn) };
}
const l: LinkedList<number> = { value: 1, next: { value: 2, next: null } };
console.log(mapList(l, x => x * 10)?.value);

재귀 타입이 강력한 이유

자기 참조 타입을 사용하면 임의로 중첩된 데이터, 리스트, 트리, JSON을 설계에서 깊이 제한 없이 완전한 타입 안전성과 함께 모델링할 수 있습니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const l: LinkedList<boolean> = { value: true, next: { value: false, next: null } };
console.log(l.value, l.next?.value);

빠른 확인: 재귀 타입

재귀 타입 정의를 얼마나 이해했는지 확인해 보십시오.

복습: 재귀 타입 정의

재귀 타입은 자기 자신을 참조하고, 종료하려면 null과 같은 기본 사례가 필요하며, 연결 리스트를 순회하고 매핑하고 만드는 데 재귀 함수와 자연스럽게 결합된다는 것을 배웠습니다.

type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const l: LinkedList<number> = { value: 1, next: null };
console.log(l.value);

자주 묻는 질문

“재귀 타입 정의” 강의는 무료인가요?

네 — “재귀 타입 정의” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“재귀 타입 정의”에서 뭘 배우나요?

자기 자신을 안전하게 참조하는 타입을 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“재귀 타입 정의” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 재귀 타입 정의
  2. 트리 구조에 타입 지정하기
  3. JSON 값 타입
  4. 재귀 깊이와 제한
← TypeScript Academy(으)로 돌아가기