Rust 입문

[Rust] RefCell 그리고 Arc, Mutex

바로크냥 2022. 10. 23. 06:42

6. RefCell

앞 장에서 봤듯이, Cell에는 값을 넣었다 뺐다 할 수 있습니다.

그런데 만약 값의 크기가 아주 크다면 부담이 될 수 있습니다.

그래서 넣었다 빼서 사용하지 않고 참조를 통해 값을 빌려 와서 사용할 수 있도록 한 것이 RefCell입니다.

코드를 통해 알아보겠습니다.

use std::borrow::Borrow;
use std::cell::{BorrowError, Cell, Ref, RefCell};

fn main(){
   let r = RefCell::new(10);     // 1
    println!("{:?}", r);
    let r1 = r.replace(100);      // 2
    println!("{:?} {:?}", r, r1);
    println!("{}", r.into_inner());   // 3

    let x = RefCell::new(String::from(“hello”));     // 4
   let x1 = x.borrow();       // 5
    println!("{:?}", x1);
    println!("{:?}", x);

    let x2 = x.try_borrow();      // 6
    match x2 {
        Ok(y) => {
            println!("{}", y);
        }
        Err(_) => {
            println!("Error!!!");
        }
    }
    println!("{:?}",  x.borrow());   // 7
}

// 출력
RefCell { value: 10 }
RefCell { value: 100 } 10
100
"hello"
RefCell { value: "hello" }
hello
"hello"

// 1: RefCell<i32> 타입 변수 r을 만들었습니다.

// 2, 3: RefCell에도 Cell처럼 replace와 into_inner 메서드가 있습니다. // 3에서 into_inner 메서드를 사용하면 소유권이 이동합니다. 그래서 만약 이후에 다시 r 변수를 사용하려고 하면 에러가 발생합니다.

// 4: 다시 새로운 RefCell 타입 변수 x를 만들었습니다.

// 5: RefCell 타입의 독특한 메서드인 borrow를 사용했습니다.

println! 출력을 보면, 값을 빌려 줬기 때문에, 즉 참조만 했기 때문에 x 변수는 여전히 값을 가지고 있습니다. 

// 6: 또 다른 메서드인 try_borrow를 사용했습니다. try_borrow는 borrow와 비슷하지만 반환 타입이 Result입니다.

그래서 다음 라인에서 match 문을 사용해서 출력을 시도했습니다.

try-borrow도 값을 참조만 하기 때문에 x 변수는 여전히 값을 가지고 있습니다.


7. Arc, Mutex

Arc와 Mutex는 스레드 개념을 알아야 사용할 수 있습니다.

그래서 스레드를 다루는 다음 장에서 살펴보겠습니다.

 
 
 
 
 
 
반응형