Rust Rc와 RefCell은 마지막 수단이다 — 안 써도 되는 구조부터 고민하라
페이지 정보

영삼이
본문
✅ Rc
와 RefCell
은 마지막 수단이다 — 안 써도 되는 구조부터 고민하라
공유와 가변성을 동시에 허용하면 위험하다
Rust는 기본적으로 소유권과 불변성을 강제한다.
그런데 이를 우회하는 방법으로 Rc
와 RefCell
이 있다:
use std::rc::Rc;
use std::cell::RefCell;
let data = Rc::new(RefCell::new(vec![1, 2, 3]));
data.borrow_mut().push(4);
❌ 문제점
-
Rc
는 참조 카운팅 -
RefCell
은 런타임에만 가변성 검사
즉, 컴파일 타임엔 안전하지만
런타임에 패닉이 날 수 있다:
let _a = data.borrow();
let _b = data.borrow_mut(); // ❌ 런타임 에러 발생
✅ 먼저 가능한 구조로 설계하라
-
가변성이 필요 없는 경우 →
Rc
없이&
또는Box
-
가변성은 있지만 공유할 필요 없음 →
&mut
-
둘 다 필요할 때만 →
Rc<RefCell<T>>
고려
대안 구조 예시
struct State {
count: usize,
}
impl State {
fn increment(&mut self) {
self.count += 1;
}
}
-
외부에서
&mut
으로 접근 가능하면RefCell
불필요
✔️ Rc<RefCell<T>>
는 편하지만,
가장 마지막에 고민해야 할 선택지다.
Rust의 안전성과 설계 철학을 유지하려면,
최대한 컴파일 타임에 구조를 고정하라.
- 이전글Cow를 쓰면 복사와 참조를 동시에 유연하게 처리할 수 있다 25.03.28
- 다음글iterator 체인은 길어져도 가독성 유지할 수 있다 25.03.28
댓글목록
등록된 댓글이 없습니다.