SEMONAN
이번 시간에는 Rust에서 Ownership이라는 개념에 대해서 이야기를 해 보려고 합니다.
Ownership라는 개념이 Rust에서 처음 생긴것 같은데요. 한번 알아보시죠.
Ownership이라는 것은 결국은 Memory를 어떻게 관리 할 것인가에 대한 것입니다. 메모리의 종류로 Stack 과 Heap이 있는데 Stack과 Heap의 개념을 알고 있어야 Ownership을 이해하기 좋습니다.
모른다면, 잠시 알아보고 오시는 것을 추천 드립니다.
Ownership Rules이 핵심인데 이 부분은 나중에 하겠습니다.

Local variable Scope은 {} 안에서 유효하다는 것을 의미합니다. {} 밖에서 s는 유효하지 않습니다.

string type을 다루는 다른 코드를 봅시다.
String::from 함수를 통해서 "hello" 문자열을 s라는 변수에 담습니다. String::from 함수를 통해서 문자열을 만들면 는 heap 메모리를 사용합니다. C++의 std::string과 유사합니다.

다음 예제 코드를 보겠습니다.
String::from 함수를 통해서 "hello"을 heap 메모리에 생성 후 s라는 변수에 담았습니다. {} Scope을 벗어나면 자동으로 해제 됩니다.
Rust에서 Heap을 할당하여 사용하더라도 Scope을 벗어나면서 자동으로 해제됩니다. C++에서는 Heap메모리를 사용시 자동으로 해제하지 않습니다. 자바나 C# 같은 경우에도 Heap메모리를 사용시 Scope을 벗어나도 바로 해제하는게 아니라 가비지 컬렉터를 통해서 참조되지 않는게 확인이 되었을때 메모리에서 해제 됩니다.
Rust에서는 Scope을 벗어나면 바로 heap 메모리를 해제해 버립니다. 따라서 Memory leak이나 free()를 중복하는 버그를 방지할 수 있습니다.

다음은 Move라는 개념을 살펴봅시다.
숫자 5를 x에 담았고, x를 다시 y에 담았습니다. 이 x,y는 스택 메모리를 사용하겠죠. y라는 변수에는 5가 들어갑니다.

힙 메모리를 사용하는 String::from 함수를 통해서 "hello"를 s1에 담았고, s1을 s2에 담았습니다.

s1은 "hello" 의 주소값이 들어가 있습니다. s1의 주소값을 s2에 넣었으니 s1,s2는 같은 곳의 주소값을 가지고 있습니다.

여기서 집중!!
s1을 print 했더니 에러가 발생합니다. 다른 언어에서는 에러가 발생하지 않습니다.

Rust에서는 s1의 Ownership이 s2로 Move되면, s1은 더이상 사용할 수 없습니다. (Heap을 참조하는 Variable은 =연산자에서 Move됩니다.) 그래서 s2를 활용해야 됩니다. 더 이상 s1은 활용할 수가 없습니다. 이 부분은 간단한 예제이지만 Rust의 Ownership을 설명하는 좋은 예시입니다.

s1은 더 이상 유효하지 않습니다. s2만 유효합니다.

다음 예제를 살펴보겠습니다.
Stack을 사용하는 Variable은 =연산자에서 Copy가 됩니다.

copy가 되는 type 입니다.

이번 예제를 통해서 Ownership을 깊게 들어가 봅시다.
집중! 집중!
Heap 메모리를 사용하는 String::from 함수를 통해 "hello"를 s변수에 담아서 takes_ownership 함수에 인자값으로 넘겼습니다.
그럼 조금전에 배운 Move가 됩니다. s라는 변수는 takes_ownership 함수의 인자값으로 넘겼기 때문에 takes_ownership 이후에는 사용할 수 없습니다.
다음 부분은 x에 5를 담고 makes_copy함수에 인자값으로 넘겼습니다. 이 부분는 stack을 사용하기 때문에 copy가 됩니다. makes_copy함수 이후에도 사용할 수 있습니다.

takes_ownership, makes_copy 함수의
{} Scope을 벗어 날 때, Heap은 자동으로 Drop(해제) 됩니다.
이제 Ownership Rules을 살펴봅시다.

첫번째는 Rust에서는 각각의 변수들은 owner 라 불리는 변수를 가지고 있다.
Each value in Rust has a variable that's called its owner.
두번째는 한번에 딱 하나의 owner만 존재할 수 있다 라는 겁니다.
There can only be one owner at a time
그리고 마지막으로 Scope을 벗어날때, 변수는 자동적으로 drop 된다 라는 겁니다.
When the owner goes out of scope, the value will be dropped.
이렇게 3가지 Ownership Rule이 있구요.
이 Ownership Rule 덕분에 Bug 발생 가능성을 낮추어 줍니다.
도움 되시길 바랍니다.
Reference
https://www.youtube.com/watch?v=hZJh3cdNGvI&list=PLdvEO-IMMcPvfiBkVwgIwDf4AuTjI2aeG&index=6
'2. Back-end > >> Rust' 카테고리의 다른 글
| if/loop/while/for에 편리한 문법이 생겼다 (2) | 2023.01.19 |
|---|---|
| 반드시 알아야 하는 Data types! 오잉? Tuple type 있네? (0) | 2023.01.18 |
| Rust 함수 사용법. 세미콜론 활용법이 독특하다! (0) | 2023.01.18 |
| Rust 변수 사용법, C++과 다르네? (0) | 2023.01.18 |
| Rust언어 배우고 싶은 이유, 환경구축 방법 (0) | 2023.01.18 |
댓글