소유 링크는 Rc, 되돌아보기 링크는 Weak

순환 참조를 피하려면 값의 수명을 결정하는 관계와, 살아 있으면 접근만 하는 관계를 타입으로 분리합니다.

부모 · 생존 주체children: Vec<Rc<Node>>strong 증가 · 자식을 소유
자식 · 관찰자parent: Weak<Node>strong 불변 · upgrade로 생존 확인

트리에서 나누는 방향

branch.children

Vec<Rc<Node>>

부모는 자식을 소유하므로 부모가 살아 있는 동안 자식도 유지됩니다.

leaf.parent

RefCell<Weak<Node>>

자식은 부모를 소유하지 않고, 필요할 때만 부모 접근을 시도합니다.

스코프가 끝날 때 결과

연결 중

branch

strong 1, weak 1로 관찰자를 가집니다.

연결 중

leaf

branch.children 때문에 strong 2가 됩니다.

스코프 종료

None

branch가 버려지면 leaf의 parent.upgrade()는 실패합니다.

소유 링크·역참조 설계

데이터 구조를 그릴 때 먼저 “누가 누구를 소유해야 하는가”를 정하고, 반대 방향 탐색은 Weak로 둡니다. 그러면 탐색성은 남기면서 해제 조건은 Rc의 강한 참조만으로 단순하게 유지됩니다.