스마트 포인터는 포인터처럼 행동하면서 능력을 더하는 타입이야 — 소유권, 참조 카운팅, 내부 가변성. 제일 단순한 게 Box<T>: 힙에 사는 값.
Box: 힙 위의 값
Box<T> 는 자기 T 를 힙에 저장하고 스택에 그걸로의 포인터를 들어. 값을 소유하고 (Box 가 drop 될 때 값을 drop) 그 외엔 값 자체처럼 행동해. 대부분은 필요 없어 — 값은 스택에서 행복하게 살거든. Box 엔 세 특정 상황에 손 뻗어.
Box 가 필요할 때
하나: 재귀 타입, 자기 자신을 품는 트리 노드처럼 — 간접 없이는 크기가 무한해지니 Box 가 순환을 끊어. 둘: 싸게 move 하고 싶은 큰 값 (바이트가 아니라 포인터를 move). 셋: 트레잇 객체, Box<dyn Trait>, Traits 트랙에서 만난 — 다른 크기 구체 타입으로의 고정 크기 핸들.
Box 는 제일 단순한 스마트 포인터야: 소유, 힙 할당, 단일 owner. 힙 저장만 더하고 그 외엔 없어 — 평범한 값과 같은 소유권 규칙, 그냥 힙에 사는. 더 화려한 포인터 (Rc, RefCell, Arc) 가 그 위에 짓는 토대야.
재귀 타입의 정석
enum List { Cons(i32, List), Nil } 같은 타입은 컴파일 안 돼 — 영원히 중첩돼서 Rust 가 크기를 못 계산해. 재귀 필드를 Box 로 감싸 — Cons(i32, Box<List>) — 그럼 크기가 'i32 더하기 포인터' 가 돼, 유한하고 알려진. Box 가 존재하는 교과서적 이유야.