Rc 는 공유 소유권을 주지만 불변 접근만. RefCell<T> 가 빠진 절반을 줘: borrow 검사를 컴파일 타임에서 런타임 으로 옮겨, 공유 참조로 변형하는 능력. 이게 내부 가변성 이야.
런타임에 검사되는 borrow 규칙
보통 borrow checker 는 aliasing XOR mutation 을 컴파일 타임에 강제해. RefCell 은 대신 런타임 검사로 옵트인하게 해: .borrow() 는 공유 참조를, .borrow_mut() 은 가변을 주고, 런타임에 추적해. 규칙을 어기면 — 가변 borrow 둘 동시 — 컴파일 실패 대신 panic 해. 같은 보장, 나중에 강제.
왜 검사를 런타임으로 옮기냐?
어떤 유효한 패턴은 컴파일 타임에 안전을 증명 못 해 — 공유 구조로 변형되는 값, 테스트에서 호출을 쌓는 mock 객체, 다른 데서 갱신되는 그래프 노드. RefCell 은 '믿어, borrow 규칙 지킬게; 런타임에 검사해' 라고 말해. 컴파일 타임 보장을 유연성과 맞바꿔, 규칙을 어기면 panic 날 수 있음을 받아들이고.
RefCell 은 borrow 에러를 컴파일 타임에서 런타임으로 옮겨. 안전은 같아 — aliasing XOR mutation 은 여전히 성립 — 근데 위반이 컴파일 실패 대신 런타임에 panic 해. 컴파일 타임 검사기를 진짜 만족 못 할 때만 써; 먼저 보통 참조로 손 뻗어.
Rc + RefCell: 공유 & 가변
전형적 콤보는 Rc<RefCell<T>> 야: 여러 owner 엔 Rc, 공유 값 변형엔 RefCell. 노드를 갱신할 수 있는 트리나 단일 스레드 코드의 공유 가변 상태를 짓는 법이야. (멀티스레드 코드에선 동등물이 Arc<Mutex<T>> — 정확한 평행을 새겨.)