면접 준비하면서 그래프 알고리즘을 Rust로 구현해보고 있는데, 노드 간의 참조를 처리하려고 Rc와 RefCell을 사용하고 있습니다.
코드:
use std::rc::Rc;
use std::cell::RefCell;
struct Node {
value: i32,
}
fn main() {
let node = Rc::new(RefCell::new(Node { value: 10 }));
let borrowed = node.borrow();
let mut borrowed_mut = node.borrow_mut();
println!("{}", borrowed_mut.value);
}
오류: thread 'main' panicked at 'already borrowed: BorrowMutError'
시도: RefCell 문서를 읽어보았고, 변수 이름을 바꿔보기도 했지만 여전히 같은 에러가 납니다.
질문: 코드상에서 borrow()와 borrow_mut()를 동시에 호출하면 왜 런타임 에러가 발생하는 건가요?
댓글9
-
빗방울
2026.10.31 14:25
-
빗방울
2026.10.31 15:42
맞아요 ㅋㅋ 아니면 그냥 drop(borrowed) 때려넣어도 해결될듯요
-
빗방울
2026.10.31 18:36
러스트 처음 하면 진짜 킹받는 부분임ㅋㅋ
컴파일 타임에 잡히는 게 아니라 런타임에 터지는 게 RefCell의 빡침 포인트네요ㄷㄷ
-
빗방울
2026.10.31 19:07
ㄹㅇㅋㅋ 컴파일러가 다 잡아줄 줄 알았는데
갑자기 런타임에 펑 터지면 진짜 멘붕 오죠ㄷㄷ
-
빗방울
2026.10.31 20:48
ㄹㅇㅋㅋ 러스트 쓰면서 컴파일러 믿고 있다가 갑자기 런타임 패닉 뜨면 진짜 배신감 오짐ㄷㄷ
-
빗방울
2026.10.31 18:48
이거 결국 러스트의 대원칙인 읽기 전용 여러 개거나 쓰기 전용 하나여야 한다는 룰을 런타임으로 미룬 거라 그렇네요ㅋㅋ 그래프 짜실 거면 나중에 그냥 index 기반으로 관리하는 게 정신건강에 이로울 수도 있음ㄷㄷ
-
빗방울
2026.10.31 19:01
패닉 안 나게 하려면 try_borrow_mut() 써서 에러 핸들링 하는 방법도 있긴 함ㅋㅋ
근데 그냥 웬만하면 스코프 쪼개는 게 제일 편하긴 하네요ㄷㄷ
-
빗방울
2026.10.31 19:50
try_borrow_mut()는 코드가 너무 지저분해져서 잘 안 쓰게 되더라고요ㅋㅋ
그냥 스코프 { }로 확 묶어버리는 게 제일 깔끔한 듯요ㄷㄷ
-
빗방울
2026.10.31 21:53
면접 준비하시는데 이런 거 나오면 진짜 당황스럽겠네요ㅋㅋ
그래프면 나중에 순환 참조 때문에 메모리 누수 생길 수도 있으니 Weak 참조도 한번 찾아보세요ㄷㄷ
모든 이야기1455
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
borrowed 변수가 아직 살아있어서 그런듯요
스코프 { }로 감싸서 borrow() 먼저 끝내보세요 ㅋㅋ