개발_기록용

RUST 스터디[RUST vs C++] 20. Smart Pointers 본문

RUST 스터디

RUST 스터디[RUST vs C++] 20. Smart Pointers

나폴나폴 2024. 6. 18. 12:45
728x90

https://google.github.io/comprehensive-rust/smart-pointers.html

 

Smart Pointers - Comprehensive Rust 🦀

This segment should take about 55 minutes. It contains: SlideDuration Box10 minutes Rc5 minutes Owned Trait Objects10 minutes Exercise: Binary Tree30 minutes

google.github.io

Rust에도 스마트 포인터라는게 존재한다. Box, Rc, Trait Object를 배운다!

20.1 Box<T>

C++에서 스마트 포인터 중 하나인 unique ptr와 똑같다.

어떤 heap에 있는 데이터를 가리키는 데이터 타입!

 

 

우선, Box로 5라는 값을 하나 만들면

5는 Heap에 만들어지고, 이를 가리키는 five는 Stack에 만들어진다.

 

그럼 이 Box는 왜 만들어졌을까?

 

위의 예제는 리스트를 만드는 예제.

우리가 구조체를 만들던지, 열거체를 만들던지 데이터 타입이 몇 바이트인지는 파악을 해야 한다.

 

List<T>의 크기가 몇 바이트인지 모르니까 만든게 Box.

 

일단 몇 바이트인지는 몰라도, 이걸 Box로 포장하면 몇 바이트인지는 모르지만 포인터를 갖게 되고,

우리가 이 포인터의 크기는 아니까 이걸 heap에 보내놓는 용도로 쓴다. 그래서 생각보다 쓸 일이 많다.

 

*Nil은 끝을 처리하고 싶을 때 쓰는 것으로 그냥 빈 것.

 

20.2 Rc

Rc는 Reference Counting의 약자! Rust는 길게 쓰는거 싫어한다.

C++의 shared ptr와 같다.

 

a는 내부적으로 reference count가 1이고, b는 clone한 거니까 reference count가 2이다.

그리고 이 함수가 끝나면, b가 먼저 호출되었으니 사라지면서 reference count가 1이 되고,

그 후 a가 사라지면서 reference count가 0이 되어 메모리에서 해제된다.

위처럼, 값을 참조해서 읽고 싶을 땐, Rc 타입으로 만들면 된다.

 

*참고로, Rc는 읽기 전용이다. (Arc도 읽기 전용.)

근데, 읽기 전용이라면 반쪽 자리이지 않을까? 그래서 쓰기 가능한 Rc가 뒤에 나온다.

 

20.3 Trait Objects

위처럼 pets에서 Pet을 상속받는 Dog와 Cat을 원소로 갖는데,

문제는 Dog와 Cat이 얼마나 올지 모르니 이 pets 입장에서 사이즈를 알 수 없다.

=> 이럴 때, Box를 쓴다. 이렇게 써서 다형성을 보장.

반응형
Comments