STUDY/Rust

Rust - 19. 스마트 포인터 (2) Rc<T>, RefCell<T>, 순환 참조

sinawi95 2024. 3. 23. 15:02
728x90

Rc까진 얼추 이해가는데 RefCell은 봐도 잘 모르겠음.. 나중에 다시 봐야지


1. Rc<T> Reference Counting

참조 카운트 스마트 포인터

  • 명시적으로 복수 소유권을 갖게함
    • 하나의 값이 여러개의 소유자를 가지는 경우 스코프를 떠나도 정리되지 않도록 함
  • 싱글 스레드에서만 사용 가능
  • Rc::New 로 생성
  • Rc::Clone 으로 참조카운트 증가
  • 스코프 밖을 벗어나면 자동으로 참조카운트 감소

2. RefCell<T>

내부 가변성(interior mutability) 패턴

  • 어떤 데이터에 대한 불변 참조자가 있을 때라도 데이터를 변경할 수 있게 해주는 패턴
  • unsafe 코드를 사용해서 러스트 규칙 우회
    • 러스트 컴파일러가 규칙을 확인하지 않음
    • 컴파일러 에러는 없고 런타임 에러인 panic 발생

RefCell<T>

  • RefCell이 불변이라도 내부 값 변경가능 -> 표면상으로는 불변이지만 데이터를 변경할 필요가 생길때 사용(unsafe한 동작)
  • 싱글 스레드에서만 사용 가능
  • Mock object 로 사용
    • 테스트 더블, 테스트 중 어떤 일이 일어났는지 기록하여 정확한 동작이 일어났음을 단언할 수 있도록 해줌
  • Rc<T>와 조합해서 가변 데이터의 복수 소유자 사용가능

 

3. 순환 참조

Rc<T>와 RefCell<T>를 사용하면 메모리 누수가 발생할 수 있음.

  • 순환 참조를 만들면 참조카운트가 0이 되지 않으므로 지워질수 없음 -> 메모리 누수가 발생됨

Weak<T> 

  • Rc<T> 대신 사용해서 순환 참조를 방지할수있음

https://doc.rust-kr.org/ch15-00-smart-pointers.html

 

 

'STUDY > Rust' 카테고리의 다른 글

Rust - 21. 객체 지향 프로그래밍  (0) 2024.03.25
Rust - 20. 동시성, 병렬성  (1) 2024.03.24
Rust - 18. 스마트 포인터 (1) Box<T>, Deref, Drop  (0) 2024.03.21
Rust - 17. Cargo와 Crates.io  (0) 2024.03.19
Rust - 16. 반복자  (0) 2024.03.14