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 |