Files
2nd/10_Wiki/Topics/Architecture/Generics-and-Polymorphism.md
T
Antigravity Agent f8b21af4be Wiki cleanup: error-doc removal, dedup merge, link normalization
10_Wiki/Topics 대규모 정리:
- 오류 캡처/미완성 stub 문서 227개 제거
- 교차폴더 중복 43클러스터 병합 (63파일 → redirect)
- 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건
- 카테고리 MOC 6개 신규 생성
- Graph 섹션 미해결 related-keyword 링크 10,058건 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:52:15 +09:00

147 lines
4.7 KiB
Markdown

---
id: wiki-2026-0508-generics-and-polymorphism
title: Generics and Polymorphism
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Parametric Polymorphism, 제네릭]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [type-system, generics, polymorphism]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: typescript
framework: type-system
---
# Generics and Polymorphism
## 매 한 줄
> **"매 한 번 작성, 매 여러 type 에 작동"**. 매 parametric polymorphism (generics) + ad-hoc polymorphism (overloading / traits) + subtype polymorphism (inheritance) 의 셋이 modern type system 의 backbone. 2026 시점 TS 5.x conditional types, Rust trait + GAT, Go 1.21+ generics 가 매 mainstream.
## 매 핵심
### 매 polymorphism 의 종류
- **Parametric**: type parameter `<T>` — 매 List<T>, Vec<T>, []T.
- **Ad-hoc**: overloading, type classes, traits, interfaces with default impl.
- **Subtype**: 매 Liskov — Cat extends Animal.
- **Row / Structural**: TS object shape, OCaml row polymorphism.
### 매 dispatch
- **Static (monomorphization)**: Rust, C++ template — 매 compile-time 에 specialize → zero overhead.
- **Dynamic (vtable)**: Java interface, Go interface, Rust dyn Trait — 매 runtime indirection.
### 매 응용
1. Collection / container 의 reuse.
2. Algorithm 의 generic write (sort, map).
3. API design 의 type-safe abstraction.
4. Dependency injection 의 decoupling.
## 💻 패턴
### TypeScript — generic constraint
```ts
function pluck<T, K extends keyof T>(items: T[], key: K): T[K][] {
return items.map(i => i[key]);
}
const names = pluck([{ id: 1, name: "Ada" }], "name"); // string[]
```
### TS — conditional + infer
```ts
type ReturnT<F> = F extends (...a: any[]) => infer R ? R : never;
type X = ReturnT<() => Promise<number>>; // Promise<number>
```
### Rust — trait + generic
```rust
trait Summable: Copy + std::ops::Add<Output = Self> + Default {}
impl<T: Copy + std::ops::Add<Output = T> + Default> Summable for T {}
fn sum<T: Summable>(xs: &[T]) -> T {
xs.iter().copied().fold(T::default(), |a, b| a + b)
}
```
### Rust — GAT (Generic Associated Type)
```rust
trait LendingIterator {
type Item<'a> where Self: 'a;
fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>;
}
```
### Rust — dyn vs impl Trait
```rust
fn make_static() -> impl Iterator<Item = i32> { (0..10).filter(|x| x % 2 == 0) } // monomorphized
fn make_dyn() -> Box<dyn Iterator<Item = i32>> { Box::new(0..10) } // vtable
```
### Go — generics (1.21+)
```go
type Number interface { ~int | ~int64 | ~float64 }
func Sum[T Number](xs []T) T {
var total T
for _, x := range xs { total += x }
return total
}
```
### Java — bounded wildcard (PECS)
```java
// Producer Extends, Consumer Super
static double sum(List<? extends Number> xs) {
double s = 0; for (Number n : xs) s += n.doubleValue(); return s;
}
static void fillWithOnes(List<? super Integer> xs) { xs.add(1); }
```
### Haskell — type class (ad-hoc)
```haskell
class Eq a where
(==) :: a -> a -> Bool
instance Eq Int where x == y = primEqInt x y
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| Container reuse | parametric `<T>` |
| Multiple impl 의 한 interface | trait / interface |
| Hot path, type set 작음 | monomorphization (Rust, C++ template) |
| Heterogeneous collection | dyn Trait / interface{} / Box<dyn> |
| Known finite variants | sum type (enum / discriminated union) — 매 generic 보다 simple |
**기본값**: TS / Java 는 generics + interface, Rust 는 generic + trait (static dispatch).
## 🔗 Graph
- 부모: [[TypeScript 타입 시스템 (TypeScript Type System)|Type Systems]] · [[Polymorphism]]
- 변형: [[Subtype Polymorphism]]
- Adjacent: [[Variance]] · [[Sum Types]]
## 🤖 LLM 활용
**언제**: API surface design / type signature 의 reasoning / variance bug 진단.
**언제 X**: 매 simple concrete type 만 쓰는 곳에 generic 강제 — 매 over-abstraction.
## ❌ 안티패턴
- **Generic for one caller**: 매 YAGNI — 매 concrete 부터.
- **Unbounded `<T>` 의 남용**: 매 actually 필요한 constraint 누락.
- **Variance 무시 (Java)**: `List<Cat>``List<Animal>` 자리에 — covariance bug.
- **dyn Trait everywhere (Rust)**: 매 hot path 에서 vtable cost 누적.
- **Type erasure 의 망각 (Java)**: runtime 에 `T` 의 reflection 시도.
## 🧪 검증 / 중복
- Verified (Pierce *TAPL* 2002, Rust Reference, TS Handbook 5.x, Go spec 1.21).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — TS/Rust/Go/Java generics + polymorphism 종류 정리 |