-한마디 설명-
C++의 RAII와 Move semantics가 기본 동작임
-긴 설명-
Rust의 메모리 관리 방법이 스마트 포인터라는 알못이 있기에 설명하려 함. 스마트 포인터였으면 Rust로 코드작성하는 걸 '컴파일러와 하는 싸움"이라고 자조하지도 않았지.
사실 Rust를 좋아하는 이유는 이 메모리 관리 메커니즘을 C++에서 사용하면 분명하게 안전한 프로그램을 만들 수 있기 때문임. 하지만 C++은 그게 힘들지.

Rust에는 객체(메모리라고 해도 좋음)에 대한 소유권 개념이 존재함. 하지만 기본 타입(정수형 실수형 진위형)에는 이게 희미함. 따라서 기본 제공하는 객체타입인 String을 예로 들겠음.


이라고 하면 String객체 하나가 생성되고 val이 그 소유권을 쥐고 있음. Rust의 모든 객체는 소유권을 진 변수가 살아있는 범위{ }를 벗어나면 해제됨.


함수 func는 String객체를 받음. 이때 func를 호출하면 val이 가진 String객체를 넘겨주고 이 소유권은 func함수에 있는 매개인자 v에개로 넘어감. 따라서 v가 살아있는 범위를 벗어나는 순간, String객체는 해제됨.
함수 func를 호출한 다음 println!룰 통해서 val를 출력하려 하는데, val이 가진 객체는 존재하지 않아. 따라서 컴파일 에러가 뜸(런타임 에러가 아님)


이건 너무 빡빡하지. 따라서 레퍼런스도 있음. 레퍼런스는 객체를 빌린다고 생각하면 됨.


이 경우 함수func를 호출한다 해서 val이 가진 String객체를 주는 게 아니니까 에러가 뜨지 않음.
한편 이 레퍼런스 변수는 객체를 가진 변수보다 오래 살아있을 수 없음.


이 함수는 애초에 컴파일 에러가 나서 컴파일 할 수 없음. 왜냐면 어느 상황에서나 레퍼런스 변수가 객체보다 오래 살아 있기 때문이지.

----

작년 7~8월쯤에 디씨 프갤에 올렸던 거 블로그에다 올렸는데, 다시 여기에 올려봄.