--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Structural Typing|Structural Typing]] last_updated: 2026-05-02 --- # [[Structural Typing|Structural Typing]] ## πŸ“Œ Brief Summary > ꡬ쑰적 타이핑(Structural Typing)은 λͺ…μ‹œμ μΈ νƒ€μž… μ„ μ–Έμ΄λ‚˜ 이름이 μ•„λ‹Œ, 객체가 κ°€μ§„ μ‹€μ œ ν˜•νƒœμ™€ ꡬ쑰(속성 및 λ©”μ„œλ“œ)λ₯Ό κΈ°μ€€μœΌλ‘œ νƒ€μž… ν˜Έν™˜μ„±μ„ κ²°μ •ν•˜λŠ” μ‹œμŠ€ν…œμ΄λ‹€[1, 2]. "였리처럼 κ±·κ³  갉갉거리면 μ˜€λ¦¬λ‹€"λΌλŠ” '덕 타이핑(Duck Typing)' 원리와 λ™μΌν•œ λ§₯락을 κ°€μ§€λ©°, λŒ€μƒ νƒ€μž…μ΄ μš”κ΅¬ν•˜λŠ” μ΅œμ†Œν•œμ˜ 멀버(속성)λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜κ³  μžˆλ‹€λ©΄ ν˜Έν™˜λ˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€[2, 3]. μ΄λŠ” νƒ€μž…μ˜ 이름이 μΌμΉ˜ν•΄μ•Όλ§Œ ν˜Έν™˜μ„±μ„ μΈμ •ν•˜λŠ” λͺ…λͺ©μ  타이핑(Nominal Typing)κ³Ό λŒ€λΉ„λ˜λŠ” TypeScript의 핡심 섀계 철학이닀[2]. --- > 지식 μš”μ•½ 정보 μΆ”μΆœ 쀑... --- > ꡬ쑰적 타이핑은 TypeScript νƒ€μž… μ‹œμŠ€ν…œμ˜ 근본적인 μ›μΉ™μœΌλ‘œ, νƒ€μž…μ˜ μ΄λ¦„μ΄λ‚˜ λͺ…μ‹œμ  선언이 μ•„λ‹Œ 객체의 μ‹€μ œ ν˜•νƒœ(ꡬ쑰)에 κΈ°λ°˜ν•˜μ—¬ νƒ€μž… ν˜Έν™˜μ„±μ„ κ²°μ •ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€ [1, 2]. μ΄λŠ” "λ§Œμ•½ μ–΄λ–€ 것이 였리처럼 κ±·κ³  갉갉거리면 그것은 μ˜€λ¦¬λ‹€"λΌλŠ” '덕 타이핑(Duck Typing)' κ°œλ…μœΌλ‘œλ„ 뢈리며, λŒ€μƒ νƒ€μž…μ΄ μš”κ΅¬ν•˜λŠ” μ΅œμ†Œν•œμ˜ 속성과 λ©”μ„œλ“œλ₯Ό κ°–μΆ”κ³  μžˆλ‹€λ©΄ μž‰μ—¬ 속성이 μžˆλ”λΌλ„ ν˜Έν™˜λ˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€ [1-3]. 이 μ‹œμŠ€ν…œμ€ μœ μ—°μ„±μ„ μ œκ³΅ν•˜μ§€λ§Œ, 의미둠적 ꡬ뢄이 ν•„μš”ν•œ μƒν™©μ—μ„œλŠ” ν•œκ³„λ₯Ό 보일 수 μžˆμ–΄ 이λ₯Ό λ³΄μ™„ν•˜λŠ” λ‹€μ–‘ν•œ 기법듀이 ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€ [4-6]. ## πŸ“– Core Content * **λ™μž‘ 원리 및 νŠΉμ§•** * ꡬ쑰적 타이핑 ν•˜μ—μ„œλŠ” 두 ν΄λž˜μŠ€λ‚˜ 객체의 이름 및 μΆœμ²˜κ°€ λ‹€λ₯΄λ”라도 λ‚΄λΆ€ μ†μ„±μ˜ ꡬ쑰가 λ™μΌν•˜λ‹€λ©΄ μ„œλ‘œ ν˜Έν™˜ κ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ μ·¨κΈ‰λœλ‹€[2, 4]. * TypeScriptμ—μ„œλŠ” λ³€μˆ˜ `y`의 νƒ€μž…μ— μ •μ˜λœ λͺ¨λ“  멀버λ₯Ό 객체 `x`κ°€ μ΅œμ†Œν•œμœΌλ‘œ ν¬ν•¨ν•˜κ³  μžˆλ‹€λ©΄, `x`λŠ” `y`와 ν˜Έν™˜λ˜μ–΄ 할당이 κ°€λŠ₯ν•˜λ‹€[3]. 즉, λŒ€μƒ νƒ€μž…μ˜ μš”κ΅¬μ‚¬ν•­ 외에 좔가적인 μ—¬λΆ„μ˜ 속성을 더 κ°€μ§€κ³  μžˆλ”λΌλ„ ν˜Έν™˜μ΄ ν—ˆμš©λœλ‹€[4]. * μ§‘ν•©λ‘ μ˜ κ΄€μ μ—μ„œ λ³Ό λ•Œ, ꡬ쑰적 타이핑을 톡해 클래슀의 λͺ…μ‹œμ μΈ 상속 μ„ μ–Έ(`class X extends Y`) 없이도 νŠΉμ • ꡬ쑰λ₯Ό λ§Œμ‘±ν•˜λŠ” κ°μ²΄λŠ” 더 넓은 νƒ€μž…μ˜ λΆ€λΆ„μ§‘ν•©μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ 취급될 수 μžˆλ‹€[5, 6]. * **λͺ…λͺ©μ  타이핑(Nominal Typing)과의 차이 및 ν•œκ³„** * Javaλ‚˜ C#κ³Ό 같은 μ–Έμ–΄λŠ” 신뢄증λͺ…μ²˜λŸΌ νƒ€μž…μ˜ λͺ…μ‹œμ  μ„ μ–Έμ΄λ‚˜ 이름 일치λ₯Ό μš”κ΅¬ν•˜λŠ” λͺ…λͺ©μ  타이핑을 μ‚¬μš©ν•˜μ§€λ§Œ, TypeScript의 λͺ¨λ“  κ°μ²΄λŠ” 본질적으둜 'λΉ„μ •ν™•(inexact)'ν•˜λ©° ꡬ쑰적 νƒ€μ΄ν•‘μ˜ μ§€λ°°λ₯Ό λ°›λŠ”λ‹€[2, 7]. * μ΄λŸ¬ν•œ μœ μ—°ν•¨μ€ 맀우 νŽΈλ¦¬ν•˜μ§€λ§Œ, 의미적으둜 μ—„κ²©νžˆ κ΅¬λΆ„λ˜μ–΄μ•Ό ν•˜λŠ” λ™μΌν•œ ꡬ쑰의 데이터(예: User ID와 Order IDκ°€ λͺ¨λ‘ λ‹¨μˆœ λ¬Έμžμ—΄μΈ 경우)λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ κ΅¬λΆ„ν•˜μ§€ λͺ»ν•˜λŠ” 'κΈ°λ³Έ νƒ€μž…μ—μ˜ μ§‘μ°©(Primitive Obsession)' 문제λ₯Ό μ•ΌκΈ°ν•œλ‹€[8]. * 이λ₯Ό λ°©μ–΄ν•˜κΈ° μœ„ν•΄ κ°œλ°œμžλ“€μ€ λŸ°νƒ€μž„μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ 컴파일 μ‹œμ μ—λ§Œ μ‘΄μž¬ν•˜λŠ” κ³ μœ ν•œ κ°€μƒμ˜ μ‹λ³„μžλ₯Ό λΆ€μ—¬ν•˜λŠ” λΈŒλžœλ””λ“œ νƒ€μž…(Branded Types / Opaque Types) νŒ¨ν„΄μ„ ν™œμš©ν•˜μ—¬ ꡬ쑰적 νƒ€μ΄ν•‘μ˜ ν•œκ³„λ₯Ό λ³΄μ™„ν•œλ‹€[8-10]. * **초과 속성 검사([[Excess Property Checking|Excess Property Checking]])μ™€μ˜ μƒν˜Έμž‘μš©** * ꡬ쑰적 타이핑은 μΆ”κ°€ μ†μ„±μ˜ 쑴재λ₯Ό 근본적으둜 ν—ˆμš©ν•˜μ§€λ§Œ, 개발자의 μ˜€νƒ€λ‚˜ 예기치 μ•Šμ€ 데이터 μœ μž…μ„ 막기 μœ„ν•΄ TypeScriptλŠ” μ˜ˆμ™Έμ μœΌλ‘œ 객체 λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— 직접 ν• λ‹Ήν•˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 인자둜 직접 λ„˜κΈΈ λ•Œ '초과 속성 검사(EPC)'λ₯Ό λ°œλ™μ‹œν‚¨λ‹€[6, 11, 12]. * κ·ΈλŸ¬λ‚˜ 객체λ₯Ό 쀑간 λ³€μˆ˜μ— λ¨Όμ € ν• λ‹Ήν•œ λ’€ μ „λ‹¬ν•˜λŠ” μ‹μ˜ κ°„μ ‘ ν• λ‹Ή 상황이 되면 EPCκ°€ μž‘λ™ν•˜μ§€ μ•Šκ³ , ꡬ쑰적 νƒ€μ΄ν•‘μ˜ "μ΅œμ†Œ μš”κ±΄ μΆ©μ‘±" μ›μΉ™μœΌλ‘œ λ˜λŒμ•„κ°€ 초과 속성을 κ·ΈλŒ€λ‘œ ν—ˆμš©ν•˜κ²Œ λœλ‹€[13, 14]. * 이와 같은 우회 ν˜„μƒμœΌλ‘œ μΈν•œ λŸ°νƒ€μž„ 였λ₯˜λ‚˜ 초과 속성 μœ μž… 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ `satisfies` μ—°μ‚°μžλ₯Ό ν™œμš©ν•˜λ©΄, ꡬ쑰의 ꡬ체성을 μžƒμ§€ μ•ŠμœΌλ©΄μ„œλ„ λŒ€μƒ νƒ€μž…κ³Όμ˜ ꡬ쑰적 계약을 μ—„κ²©νžˆ μ€€μˆ˜ν•˜λ„λ‘ κ°•μ œν•  수 μžˆλ‹€[15, 16]. --- λ³Έλ¬Έ ꡬ쑰화 μž‘μ—… 쀑... --- * **νƒ€μž… ν˜Έν™˜μ„±μ˜ κΈ°λ³Έ κ·œμΉ™:** ꡬ쑰적 타이핑 ν•˜μ—μ„œ ν•œ νƒ€μž…(`y`)이 λ‹€λ₯Έ νƒ€μž…(`x`)κ³Ό ν˜Έν™˜λ˜λ €λ©΄ `y`κ°€ μ΅œμ†Œν•œ `x`κ°€ κ°€μ§„ λͺ¨λ“  멀버λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€ [1]. λ³€μˆ˜ ν• λ‹Ή μ‹œ, μš°λ³€μ˜ 값이 νƒ€κ²Ÿ νƒ€μž…μ˜ 속성을 λͺ¨λ‘ μΆ©μ‘±ν•˜κΈ°λ§Œ ν•œλ‹€λ©΄ λ‹€λ₯Έ μž‰μ—¬ 속성을 κ°€μ§€κ³  μžˆλ”λΌλ„ ꡬ쑰적으둜 ν˜Έν™˜λ˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όλ˜μ–΄ 할당이 ν—ˆμš©λ©λ‹ˆλ‹€ [1]. * **λͺ…λͺ©μ  타이핑(Nominal Typing)과의 차이:** Javaλ‚˜ C#κ³Ό 같은 전톡적인 객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ…λͺ©μ  타이핑은 νƒ€μž…μ˜ μ΄λ¦„μ΄λ‚˜ λͺ…μ‹œμ  상속/κ΅¬ν˜„ 선언이 μΌμΉ˜ν•΄μ•Όλ§Œ ν˜Έν™˜μ„±μ΄ μΈμ •λ©λ‹ˆλ‹€ [2, 7]. 반면, TypeScriptλŠ” 객체의 ꡬ쑰(속성과 λ©”μ„œλ“œμ˜ ν˜•νƒœ)만 μΌμΉ˜ν•˜λ©΄ λ™μΌν•œ νƒ€μž… ν˜Ήμ€ ν˜Έν™˜ κ°€λŠ₯ν•œ νƒ€μž…μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μœ μ—°μ„±μ„ κ°–μŠ΅λ‹ˆλ‹€ [2]. * **κ³Όμž‰ 속성 체크([[Excess Property Checking|Excess Property Checking]])λ₯Ό ν†΅ν•œ λ°©μ–΄:** ꡬ쑰적 νƒ€μ΄ν•‘μ˜ μœ μ—°ν•¨μ€ μ˜€νƒ€(예: `color` λŒ€μ‹  `colour` μž…λ ₯)λ₯Ό λ‚΄κ±°λ‚˜ μ˜λ„μΉ˜ μ•Šμ€ 데이터λ₯Ό μ „λ‹¬ν•˜λŠ” μ‹€μˆ˜λ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8, 9]. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ TypeScriptλŠ” 객체 λ¦¬ν„°λŸ΄μ΄ λ³€μˆ˜μ— 직접 ν• λ‹Ήλ˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 인자둜 전달될 λ•Œ μ˜ˆμ™Έμ μœΌλ‘œ μ—„κ²©ν•˜κ²Œ λ™μž‘ν•˜λŠ” 'κ³Όμž‰ 속성 체크'λ₯Ό λ°œλ™μ‹œν‚΅λ‹ˆλ‹€ [3, 10, 11]. 이λ₯Ό 톡해 νƒ€κ²Ÿ μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λ˜μ§€ μ•Šμ€ μž‰μ—¬ 속성이 ν¬ν•¨λ˜λŠ” 것을 컴파일 μ‹œμ μ— μ°¨λ‹¨ν•©λ‹ˆλ‹€ [3, 10]. * **ꡬ쑰적 νƒ€μ΄ν•‘μ˜ ν•œκ³„μ™€ λΈŒλžœλ””λ“œ νƒ€μž…(Branded Types):** ꡬ쑰적 타이핑은 속성 ꡬ쑰가 λ™μΌν•˜λ©΄ νƒ€μž…μ΄ κ°™λ‹€κ³  κ°„μ£Όν•˜κΈ° λ•Œλ¬Έμ—, λ™μΌν•œ ꡬ쑰λ₯Ό κ°€μ‘Œμ§€λ§Œ μ˜λ―Έκ°€ μ „ν˜€ λ‹€λ₯Έ 데이터(예: IP와 URL, 일반 λ¬Έμžμ—΄κ³Ό λ³΄μ•ˆ 처리된 λ¬Έμžμ—΄, 각기 λ‹€λ₯Έ 톡화 λ“±)λ₯Ό κ΅¬λ³„ν•˜μ§€ λͺ»ν•˜λŠ” 문제λ₯Ό μ•ΌκΈ°ν•©λ‹ˆλ‹€ [4-6, 12-14]. 이λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄, λŸ°νƒ€μž„μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ 컴파일 μ‹œμ μ—λ§Œ μ‘΄μž¬ν•˜λŠ” κ³ μœ ν•œ κ°€μƒμ˜ 속성(λΈŒλžœλ“œ)을 νƒ€μž…μ— λΆ€μ—¬ν•˜μ—¬ λͺ…λͺ©μ  타이핑과 μœ μ‚¬ν•œ κ°•λ ₯ν•œ 격리λ₯Ό μ œκ³΅ν•˜λŠ” λΈŒλžœλ””λ“œ νƒ€μž…(λ˜λŠ” Opaque Types) 기법이 μ‚¬μš©λ©λ‹ˆλ‹€ [6, 14-16]. * **`satisfies` μ—°μ‚°μžμ˜ ν™œμš©:** ν• λ‹Ή μ‹œ 쀑간 λ³€μˆ˜λ₯Ό 거치면 κ³Όμž‰ 속성 체크가 μš°νšŒλ˜λŠ” ꡬ쑰적 νƒ€μ΄ν•‘μ˜ 취약점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ `satisfies` μ—°μ‚°μžλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [17-19]. 이 μ—°μ‚°μžλŠ” 객체가 νŠΉμ • ꡬ쑰λ₯Ό λ§Œμ‘±ν•˜λŠ”μ§€ μ—„κ²©ν•˜κ²Œ 검사(κ³Όμž‰ 속성 λ°©μ§€)ν•˜λ©΄μ„œλ„, ν• λ‹Ήλœ 객체 μ†μ„±μ˜ ꡬ체적인 λ¦¬ν„°λŸ΄ νƒ€μž…κ³Ό μž‰μ—¬ 속성 정보λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€ [19-21]. ## βš–οΈ Trade-offs & Caveats - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Design & Experience λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— Knowledge Connections - **Related Topics:** Duck Typing, Nominal Typing, [[Excess Property Checking|Excess Property Checking]], Branded Types, satisfies Operator - **Projects/Contexts:** TypeScript TypeSystem - **Contradictions/Notes:** ꡬ쑰적 타이핑은 기본적으둜 λŒ€μƒ 객체가 좔가적인 속성을 κ°€μ§€λŠ” 것을 ν—ˆμš©ν•˜μ—¬ μœ μ—°ν•œ ν˜Έν™˜μ„±μ„ λΆ€μ—¬ν•˜μ§€λ§Œ[4], 객체 λ¦¬ν„°λŸ΄μ„ 직접 ν• λ‹Ήν•  λ•ŒλŠ” μ΄λŸ¬ν•œ μœ μ—°μ„± λŒ€μ‹  '초과 속성 검사(Excess Property Checking)'κ°€ κ°œμž…ν•˜μ—¬ μ„ μ–Έλ˜μ§€ μ•Šμ€ μ†μ„±μ˜ 쑴재λ₯Ό μ—„κ²©ν•˜κ²Œ μ—λŸ¬λ‘œ μ²˜λ¦¬ν•œλ‹€λŠ” μƒλ°˜λœ λ™μž‘ κ·œμΉ™μ΄ κ³΅μ‘΄ν•œλ‹€[6, 11, 12]. --- *Last updated: 2026-04-18* --- --- - Raw Source: 00_Raw/2026-04-20/Structural-Typing.md --- --- - **Related Topics:** [[ᄃα…₯ᆨ ᄐᅑ아팡(Duck Typing)|덕 타이핑(Duck Typing]], λͺ…λͺ©μ  타이핑(Nominal Typing), κ³Όμž‰ 속성 체크(Excess Property Checking), λΈŒλžœλ””λ“œ νƒ€μž…(Branded Types), [[satisfies α„‹α…§α†«α„‰α…‘α†«α„Œα…‘|satisfies μ—°μ‚°μž]] - **Projects/Contexts:** TypeScript νƒ€μž… μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 및 도메인 기반 섀계(DDD) - **Contradictions/Notes:** 객체 λ¦¬ν„°λŸ΄μ„ 직접 ν• λ‹Ήν•˜κ±°λ‚˜ 인자둜 λ„˜κΈΈ λ•ŒλŠ” 예기치 μ•Šμ€ μž‰μ—¬ 속성에 λŒ€ν•΄ μ—„κ²©ν•œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λŠ” 반면, 값을 미리 λ³€μˆ˜μ— μ„ μ–Έν•œ λ’€ κ°„μ ‘μ μœΌλ‘œ ν• λ‹Ήν•  λ•ŒλŠ” μ΅œμ†Œ μš”κ±΄λ§Œ μΆ©μ‘±ν•˜λ©΄ μž‰μ—¬ 속성을 λ¬΄μ‹œν•˜κ³  할당을 ν—ˆμš©ν•˜λŠ” λ™μž‘ λ°©μ‹μ˜ 차이가 μ‘΄μž¬ν•©λ‹ˆλ‹€ [8, 10, 17, 18]. --- *Last updated: 2026-04-18* ---