Rc::clone(&value)
같은 값을 함께 소유하므로 strong_count가 증가합니다.
양방향으로 쓰면 카운트가 0으로 내려가지 않을 수 있습니다.
Rc, 되돌아보기 링크는 Weak
순환 참조를 피하려면 값의 수명을 결정하는 관계와, 살아 있으면 접근만 하는 관계를 타입으로 분리합니다.
Rc::clone(&value)
같은 값을 함께 소유하므로 strong_count가 증가합니다.
양방향으로 쓰면 카운트가 0으로 내려가지 않을 수 있습니다.
Rc::downgrade(&value)
값을 붙잡지 않는 Weak<T>를 만들고,
필요할 때 upgrade로 아직 살아 있는지 확인합니다.
Vec<Rc<Node>>부모는 자식을 소유하므로 부모가 살아 있는 동안 자식도 유지됩니다.
RefCell<Weak<Node>>자식은 부모를 소유하지 않고, 필요할 때만 부모 접근을 시도합니다.
strong 1, weak 1로 관찰자를 가집니다.
branch.children 때문에 strong 2가 됩니다.
Nonebranch가 버려지면 leaf의 parent.upgrade()는 실패합니다.
데이터 구조를 그릴 때 먼저 “누가 누구를 소유해야 하는가”를 정하고,
반대 방향 탐색은 Weak로 둡니다. 그러면 탐색성은 남기면서
해제 조건은 Rc의 강한 참조만으로 단순하게 유지됩니다.