📦

Box, Rc, Arc, RefCell — 스마트 포인터 가이드

소유권 규칙을 유연하게 우회하는 도구들

소유권 규칙은 강력하지만, 모든 패턴을 커버하지 못한다.

Box<T> — 힙에 값을 할당한다. 재귀적 타입(링크드 리스트 등)을 만들 때 필수. 크기를 컴파일 타임에 알 수 없는 타입을 다룰 때도 쓴다.

Rc<T> — Reference Counted. 소유자가 여럿 필요할 때. 마지막 Rc가 drop되면 값이 해제된다. 싱글 스레드 전용.

Arc<T> — Atomic Rc. 멀티 스레드에서 공유 소유권이 필요할 때. Rc의 스레드 안전 버전.

RefCell<T> — 런타임에 빌림 규칙을 검사한다. 컴파일 타임에 안전성이 증명 안 되는 패턴에서 사용. 잘못 쓰면 런타임 패닉.

실전에서는 Arc<Mutex<T>>를 많이 쓴다 — 멀티 스레드에서 공유 가변 데이터를 다루는 표준 패턴.

핵심 포인트

1

Box<T> — 힙 할당 + 소유권 이동 (재귀 타입, trait object)

2

Rc<T> / Arc<T> — 참조 카운트 공유 소유권 (싱글/멀티 스레드)

3

RefCell<T> — 런타임 빌림 검사 (Interior Mutability 패턴)

4

Arc<Mutex<T>> — 멀티 스레드 공유 가변 데이터의 표준 패턴

장점

  • 소유권 규칙이 허용하지 않는 패턴을 안전하게 구현
  • Rc/Arc는 GC 없이 자동 메모리 해제

단점

  • Rc/Arc는 순환 참조 시 메모리 누수 (Weak로 해결)
  • RefCell은 런타임 패닉 가능 — 컴파일 타임 안전성 포기

사용 사례

트리/그래프 자료구조 — 노드 간 공유 참조 동시성 서버 — Arc<Mutex<State>>로 요청 간 상태 공유