Rc and Weak roles

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

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

소유 관계

Rc::clone(&value)

같은 값을 함께 소유하므로 strong_count가 증가합니다. 양방향으로 쓰면 카운트가 0으로 내려가지 않을 수 있습니다.

관찰 관계

Rc::downgrade(&value)

값을 붙잡지 않는 Weak<T>를 만들고, 필요할 때 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의 강한 참조만으로 단순하게 유지됩니다.