Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rc

다중 소유권이 필요한 경우, Rc(참조 횟수 계산, Reference Counting)를 사용할 수 있습니다. Rc는 참조의 개수를 추적하며, 이는 Rc 내부에 감싸진 값의 소유자 수를 의미합니다.

Rc의 참조 횟수는 Rc가 클론될 때마다 1씩 증가하고, 클론된 Rc가 스코프를 벗어날 때마다 1씩 감소합니다. Rc의 참조 횟수가 0이 되면 (즉, 남은 소유자가 없으면), Rc와 그 내부의 값 모두 해제됩니다.

Rc를 클론하는 것은 결코 깊은 복사(deep copy)를 수행하지 않습니다. 클론은 단지 감싸진 값을 가리키는 또 다른 포인터를 생성하고, 횟수를 증가시킬 뿐입니다.

use std::rc::Rc;

fn main() {
    let rc_examples = "Rc 예제".to_string();
    {
        println!("--- rc_a가 생성됨 ---");

        let rc_a: Rc<String> = Rc::new(rc_examples);
        println!("rc_a의 참조 횟수: {}", Rc::strong_count(&rc_a));

        {
            println!("--- rc_a가 rc_b로 클론됨 ---");

            let rc_b: Rc<String> = Rc::clone(&rc_a);
            println!("rc_b의 참조 횟수: {}", Rc::strong_count(&rc_b));
            println!("rc_a의 참조 횟수: {}", Rc::strong_count(&rc_a));

            // 두 `Rc`는 내부 값이 같으면 같습니다
            println!("rc_a와 rc_b는 같음: {}", rc_a.eq(&rc_b));

            // 값의 메서드들을 직접 사용할 수 있습니다
            println!("rc_a 내부 값의 길이: {}", rc_a.len());
            println!("rc_b의 값: {}", rc_b);

            println!("--- rc_b가 스코프를 벗어나 해제됨 ---");
        }

        println!("rc_a의 참조 횟수: {}", Rc::strong_count(&rc_a));

        println!("--- rc_a가 스코프를 벗어나 해제됨 ---");
    }

    // 에러! `rc_examples`는 이미 `rc_a`로 이동되었습니다
    // 그리고 `rc_a`가 해제될 때, `rc_examples`도 함께 해제됩니다
    // println!("rc_examples: {}", rc_examples);
    // TODO ^ 이 줄의 주석을 해제해 보세요
}

참고:

std::rcstd::sync::arc.