--- id: P-REINFORCE-AUTO-8C150A category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Structural Typing" --- # [[Structural Typing]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > ꡬ쑰적 타이핑(Structural Typing)은 λͺ…μ‹œμ μΈ νƒ€μž… μ„ μ–Έμ΄λ‚˜ 이름이 μ•„λ‹Œ, 객체가 κ°€μ§„ μ‹€μ œ ν˜•νƒœμ™€ ꡬ쑰(속성 및 λ©”μ„œλ“œ)λ₯Ό κΈ°μ€€μœΌλ‘œ νƒ€μž… ν˜Έν™˜μ„±μ„ κ²°μ •ν•˜λŠ” μ‹œμŠ€ν…œμ΄λ‹€[1, 2]. "였리처럼 κ±·κ³  갉갉거리면 μ˜€λ¦¬λ‹€"λΌλŠ” '덕 타이핑(Duck Typing)' 원리와 λ™μΌν•œ λ§₯락을 κ°€μ§€λ©°, λŒ€μƒ νƒ€μž…μ΄ μš”κ΅¬ν•˜λŠ” μ΅œμ†Œν•œμ˜ 멀버(속성)λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜κ³  μžˆλ‹€λ©΄ ν˜Έν™˜λ˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€[2, 3]. μ΄λŠ” νƒ€μž…μ˜ 이름이 μΌμΉ˜ν•΄μ•Όλ§Œ ν˜Έν™˜μ„±μ„ μΈμ •ν•˜λŠ” λͺ…λͺ©μ  타이핑(Nominal Typing)κ³Ό λŒ€λΉ„λ˜λŠ” TypeScript의 핡심 섀계 철학이닀[2]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized 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)μ™€μ˜ μƒν˜Έμž‘μš©** * ꡬ쑰적 타이핑은 μΆ”κ°€ μ†μ„±μ˜ 쑴재λ₯Ό 근본적으둜 ν—ˆμš©ν•˜μ§€λ§Œ, 개발자의 μ˜€νƒ€λ‚˜ 예기치 μ•Šμ€ 데이터 μœ μž…μ„ 막기 μœ„ν•΄ TypeScriptλŠ” μ˜ˆμ™Έμ μœΌλ‘œ 객체 λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— 직접 ν• λ‹Ήν•˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 인자둜 직접 λ„˜κΈΈ λ•Œ '초과 속성 검사(EPC)'λ₯Ό λ°œλ™μ‹œν‚¨λ‹€[6, 11, 12]. * κ·ΈλŸ¬λ‚˜ 객체λ₯Ό 쀑간 λ³€μˆ˜μ— λ¨Όμ € ν• λ‹Ήν•œ λ’€ μ „λ‹¬ν•˜λŠ” μ‹μ˜ κ°„μ ‘ ν• λ‹Ή 상황이 되면 EPCκ°€ μž‘λ™ν•˜μ§€ μ•Šκ³ , ꡬ쑰적 νƒ€μ΄ν•‘μ˜ "μ΅œμ†Œ μš”κ±΄ μΆ©μ‘±" μ›μΉ™μœΌλ‘œ λ˜λŒμ•„κ°€ 초과 속성을 κ·ΈλŒ€λ‘œ ν—ˆμš©ν•˜κ²Œ λœλ‹€[13, 14]. * 이와 같은 우회 ν˜„μƒμœΌλ‘œ μΈν•œ λŸ°νƒ€μž„ 였λ₯˜λ‚˜ 초과 속성 μœ μž… 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ `satisfies` μ—°μ‚°μžλ₯Ό ν™œμš©ν•˜λ©΄, ꡬ쑰의 ꡬ체성을 μžƒμ§€ μ•ŠμœΌλ©΄μ„œλ„ λŒ€μƒ νƒ€μž…κ³Όμ˜ ꡬ쑰적 계약을 μ—„κ²©νžˆ μ€€μˆ˜ν•˜λ„λ‘ κ°•μ œν•  수 μžˆλ‹€[15, 16]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Duck Typing]], [[Nominal Typing]], [[Excess Property Checking]], [[Branded Types]], [[satisfies Operator]] - **Projects/Contexts:** [[TypeScript Type System]] - **Contradictions/Notes:** ꡬ쑰적 타이핑은 기본적으둜 λŒ€μƒ 객체가 좔가적인 속성을 κ°€μ§€λŠ” 것을 ν—ˆμš©ν•˜μ—¬ μœ μ—°ν•œ ν˜Έν™˜μ„±μ„ λΆ€μ—¬ν•˜μ§€λ§Œ[4], 객체 λ¦¬ν„°λŸ΄μ„ 직접 ν• λ‹Ήν•  λ•ŒλŠ” μ΄λŸ¬ν•œ μœ μ—°μ„± λŒ€μ‹  '초과 속성 검사(Excess Property Checking)'κ°€ κ°œμž…ν•˜μ—¬ μ„ μ–Έλ˜μ§€ μ•Šμ€ μ†μ„±μ˜ 쑴재λ₯Ό μ—„κ²©ν•˜κ²Œ μ—λŸ¬λ‘œ μ²˜λ¦¬ν•œλ‹€λŠ” μƒλ°˜λœ λ™μž‘ κ·œμΉ™μ΄ κ³΅μ‘΄ν•œλ‹€[6, 11, 12]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/Structural Typing.md]] ---