--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Discriminated Unions|Discriminated Unions]] last_updated: 2026-05-02 --- # [[Discriminated Unions|Discriminated Unions]] ## πŸ“Œ Brief Summary > Discriminated Unions(λ˜λŠ” 식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨, νƒœκ·Έλœ μœ λ‹ˆμ˜¨)은 μ„œλ‘œ λ‹€λ₯Έ 데이터 ν˜•νƒœλ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ κ³΅ν†΅λœ λ¦¬ν„°λŸ΄ 속성(νŒλ³„μž, Discriminant)을 μ‚¬μš©ν•˜λŠ” TypeScript의 νŒ¨ν„΄μž…λ‹ˆλ‹€ [1-3]. 일반적인 μœ λ‹ˆμ˜¨ νƒ€μž…κ³Ό 달리, μ»΄νŒŒμΌλŸ¬κ°€ νŒλ³„μž 속성을 ν™•μΈν•˜μ—¬ νƒ€μž…μ„ μžλ™μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ 쒁힐 수(Narrowing) 있게 ν•΄μ€λ‹ˆλ‹€ [4-6]. 이λ₯Ό 톡해 μœ νš¨ν•˜μ§€ μ•Šμ€ μƒνƒœμ˜ ν‘œν˜„μ„ μ›μ²œμ μœΌλ‘œ μ°¨λ‹¨ν•˜κ³ , λͺ¨λ“  κ°€λŠ₯ν•œ 경우λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ κ°•μ œν•˜λŠ” μ™„μ „μ„± 검사(Exhaustiveness checking)λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [3, 7, 8]. --- > "νƒ€μž…μ˜ ν™•μ‹€ν•œ μ΄λ¦„ν‘œ: μ—¬λŸ¬ κ°€λŠ₯ν•œ 데이터 ν˜•νƒœ 쀑 'ν˜„μž¬ μ–΄λ–€ ν˜•νƒœμΈμ§€'λ₯Ό λͺ…ν™•ν•œ κ΅¬λΆ„μž(Tag)둜 λ°•μ œν•˜μ—¬, 쑰건문 μ•ˆμ—μ„œ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μ™„λ²½ν•˜κ²Œ μΆ”λ‘ ν•˜κ²Œ λ§Œλ“€κ³  λŸ°νƒ€μž„ μ—λŸ¬μ˜ κ°€λŠ₯성을 μ›μ²œ λ΄‰μ‡„ν•˜λŠ” κ²¬κ³ ν•œ 방패." ## πŸ“– Core Content * **μž‘λ™ 원리 및 νŠΉμ§•** Discriminated Union은 객체듀이 κ³΅ν†΅μœΌλ‘œ κ°€μ§€λŠ” μ‹λ³„μž ν•„λ“œ(주둜 `kind`, `type`, `status` 같은 λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄)λ₯Ό ν™œμš©ν•˜μ—¬ κ΅¬μ„±λ©λ‹ˆλ‹€ [2-4]. 이 곡톡 속성을 기반으둜 TypeScript의 μ½”λ“œ 흐름 뢄석이 μ§„ν–‰λ˜λ©°, νŠΉμ • λΈŒλžœμΉ˜μ—μ„œ νƒ€μž…μ„ λͺ…ν™•ν•˜κ²Œ μ’ν˜€μ€λ‹ˆλ‹€ [3, 4, 9]. μ΄λŠ” λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œκ°€ μ „ν˜€ μΆ”κ°€λ˜μ§€ μ•ŠλŠ” 컴파일 νƒ€μž„ μ „μš© κ΅¬μ‘°μž…λ‹ˆλ‹€ [10]. * **μ£Όμš” μž₯점** κ°€μž₯ 큰 μž₯점은 μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ μ‘°ν•©μ˜ μƒνƒœ(Invalid [[State|State]]s)λ₯Ό μ½”λ“œλ‘œ ν‘œν˜„ν•  수 μ—†κ²Œ λ§Œλ“€μ–΄ ꡬ쑰적으둜 버그λ₯Ό λ°©μ§€ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ [1, 7, 11]. λ˜ν•œ `switch` λ¬Έκ³Ό `never` νƒ€μž…μ„ κ²°ν•©ν•˜λ©΄ λͺ¨λ“  μœ λ‹ˆμ˜¨ μΌ€μ΄μŠ€κ°€ μ²˜λ¦¬λ˜μ—ˆλŠ”μ§€ μ»΄νŒŒμΌλŸ¬κ°€ ν™•μΈν•˜λŠ” 'μ™„μ „μ„± 검사(Exhaustive checking)'κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€ [3, 12-14]. μœ λ‹ˆμ˜¨μ— μƒˆλ‘œμš΄ νƒ€μž… 멀버가 μΆ”κ°€λ˜μ—ˆμ„ λ•Œ 이λ₯Ό λˆ„λ½ν•œ μ½”λ“œλ₯Ό 즉각적인 컴파일 μ—λŸ¬λ‘œ 포착해 λ‚΄λ―€λ‘œ μœ μ§€λ³΄μˆ˜μ„±μ΄ 크게 ν–₯μƒλ©λ‹ˆλ‹€ [3, 8]. * **μ‚¬μš© 사둀 (Use Cases)** API 응닡 데이터 처리, 폼(Form) 핸듀링, Redux μŠ€νƒ€μΌμ˜ λ¦¬λ“€μ„œ(Reducer), λΌμš°ν„° μƒνƒœ 관리, 그리고 μƒνƒœ λ¨Έμ‹ (State Machine) νŒ¨ν„΄μ„ λͺ¨λΈλ§ν•˜λŠ” 데 맀우 μ ν•©ν•©λ‹ˆλ‹€ [7, 15-17]. λ³΅μž‘ν•œ μƒνƒœλ₯Ό ν‘œν˜„ν•΄μ•Ό ν•  λ•ŒλŠ” 닀쀑 νŒλ³„μž(Multiple Discriminants)λ₯Ό λ‘κ±°λ‚˜ μœ λ‹ˆμ˜¨μ„ 쀑첩(Nested)ν•˜λŠ” λ°©μ‹μœΌλ‘œλ„ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [15, 16]. * **μ£Όμ˜μ‚¬ν•­ 및 베슀트 ν”„λž™ν‹°μŠ€** νŒλ³„μžλ‘œλŠ” 항상 λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯되며, λͺ¨λ“  λΈŒλžœμΉ˜μ— 걸쳐 μΌκ΄€λœ νŒλ³„μž 속성을 포함해야 ν•©λ‹ˆλ‹€ [12, 16, 18]. νƒ€μž…μ„ 쒁힐 λ•ŒλŠ” `instanceof` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  λ°˜λ“œμ‹œ νŒλ³„μž 속성을 확인해야 ν•©λ‹ˆλ‹€ [18]. 단, μ•„μ£Ό κ±°λŒ€ν•œ μ½”λ“œλ² μ΄μŠ€μ—μ„œ κ³Όλ„ν•˜κ²Œ λ³΅μž‘ν•œ μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ TypeScript의 컴파일 속도가 느렀질 수 있으며, 깊게 쀑첩될 경우 μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό νŒŒμ•…ν•˜κΈ° μ–΄λ €μ›Œμ§ˆ 수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€ [10]. --- κ΅¬λ³„λœ 곡용체(Discriminated-Unions, Tagged Unions)λŠ” κ³΅ν†΅λœ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ 속성(Discriminant)을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ νƒ€μž… 쀑 ν•˜λ‚˜λ₯Ό μ•ˆμ „ν•˜κ²Œ μ„ νƒν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€. 1. **3λŒ€ 쑰건**: * **Union of Types**: μ—¬λŸ¬ νƒ€μž…μ΄ κ²°ν•©λœ ν•©μ§‘ν•© νƒ€μž…. * **Discriminant Property**: 각 νƒ€μž…μ— κ³΅ν†΅μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” λ¦¬ν„°λŸ΄ 속성 (예: `type: 'success' | 'error'`). * **Type Guarding**: `switch`λ‚˜ `if` 문을 톡해 ν•΄λ‹Ή 속성을 κ²€μ‚¬ν•˜λ©΄, 블둝 λ‚΄λΆ€μ—μ„œ ν•΄λ‹Ή νƒ€μž…μœΌλ‘œλ§Œ μžλ™ μΆ•μ†Œ(Narrowing). 2. **μ™œ μ€‘μš”ν•œκ°€?**: * μ—λŸ¬ 핸듀링 μ‹œ `status` 값에 따라 `data`κ°€ μžˆμ„μ§€ `error`κ°€ μžˆμ„μ§€ μ»΄νŒŒμΌλŸ¬κ°€ μ •ν™•νžˆ μ•Œκ²Œ ν•˜μ—¬, μ •μ˜λ˜μ§€ μ•Šμ€ 속성 μ ‘κ·Ό μ •μ±…(Undefined errors)을 막기 λ•Œλ¬Έμž„. ([[Reliability|Reliability]]와 μ—°κ²°) ## βš–οΈ Trade-offs & Caveats - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌**: κ³Όκ±° μžλ°”μŠ€ν¬λ¦½νŠΈ 정책은 'duck typing'에 μ˜μ‘΄ν•˜μ—¬ λŸ°νƒ€μž„μ— 일일이 `if(data)` 등을 체크해야 ν–ˆμœΌλ‚˜, TS 정책은 κ΅¬λ³„λœ 곡용체 정책을 톡해 '컴파일 νƒ€μž„'에 λͺ¨λ“  경둜 정책을 검증함(RL Update). - **μ •μ±… λ³€ν™”(RL Update)**: μ΄μ œλŠ” λ‹¨μˆœ μ—λŸ¬ 처리λ₯Ό λ„˜μ–΄, λ³΅μž‘ν•œ μƒνƒœ λ¨Έμ‹  μ •μ±…(FSM)μ΄λ‚˜ Redux μ•‘μ…˜ νƒ€μž… μ •μ±… 등을 μ •μ˜ν•˜λŠ” ν‘œμ€€ μ•„ν‚€ν…μ²˜ νŒ¨ν„΄ μ •μ±…μœΌλ‘œ 자리 작음. ([[State-Space|State-Space]]와 μ—°κ²°) ## πŸ”— Knowledge Connections - **Related Topics:** [[Union Types|Union Types]], Type Narrowing, Exhaustiveness Checking, Literal Types, never type - **Projects/Contexts:** React State [[Management|Management]], State Machine Pattern, API Response Handling, Redux Reducers - **Contradictions/Notes:** Discriminated Union νŒ¨ν„΄μ€ νƒ€μž… μ•ˆμ •μ„±κ³Ό 예츑 κ°€λŠ₯성을 크게 λ†’μ—¬μ£Όμ§€λ§Œ, μœ λ‹ˆμ˜¨ νƒ€μž…μ΄ μ§€λ‚˜μΉ˜κ²Œ λ³΅μž‘ν•΄μ§€κ±°λ‚˜ κΉŠμ€ 쀑첩 ꡬ쑰λ₯Ό κ°€μ§€κ²Œ 되면 였히렀 TypeScript의 컴파일 μ„±λŠ₯을 μ €ν•˜μ‹œν‚€κ³  μ—λŸ¬ λ©”μ‹œμ§€μ˜ 가독성을 λ–¨μ–΄λœ¨λ¦¬λŠ” λΆ€μž‘μš©(단점)을 μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [10]. --- *Last updated: 2026-04-18* --- --- - [[Reliability|Reliability]], [[State-Space|State-Space]], [[Technical-Architecture|Technical-Architecture]], [[Logic|Logic]], [[Complexity-Theory|Complexity-Theory]] - **Key Concept**: Algebraic Data Types (ADT). ---