관리 메뉴

밤 늦게까지 여는 카페

[rust 공식 문서 14일 공부] 3일차 본문

For Fun

[rust 공식 문서 14일 공부] 3일차

Jㅐ둥이 2024. 12. 8. 01:00
반응형

4. Ownership

이제 rust의 메모리 안전성을 책임지는 ownership에 대해서 공부합니다.

 

rust 컴파일 에러의 상당수가 ownership 때문이라던데 rust는 어려운 언어다 라는 두려움을 퍼뜨리는데 일조한 녀석이 아닐까 싶습니다.

 

4.1. What is Ownership?

ownership이란 rust에서 메모리를 관리하는 규칙입니다.

 

프로그래밍 언어에서 메모리를 관리하는 방법은 대표적으로 다음 2가지가 있습니다.

1) 개발자가 직접 관리하는 것(c, c++의 malloc, free를 생각)

2) 프로그래밍 언어의 garbage collection 기능으로 관리되는 것(java, golang 등)

 

1)은 사용성이 떨어진다는 단점이 2)는 garbage collection으로 인한 성능 저하라는 단점이 있습니다.

 

rust는 ownership이라는 기존과는 다른 방법으로 문제를 해결합니다.

 

ownership에 의해서 컴파일 단계에서부터 메모리의 수명이 결정되고 유효성이 검증되기 때문에

익숙해지기만 한다면 프로그램의 안전성과 효율성이 증가되는 것은 당연하겠죠!

 

Ownership Rules

ownership 규칙은 생각보다 단순합니다.

  • rust의 모든 값은 하나의 owner를 가지고 있습니다.
  • 값은 한번에 하나의 owner만 가질 수 있습니다.
  • owner가 scope에서 벗어나면 해당 값은 메모리에서 해제됩니다.

Variable Scope

scope란 프로그램 상에서 변수가 유효한 범위를 뜻합니다.

가장 간단하게는 {} 안에서 정의된 변수는 {} 안에서만 유효하다. 가 있습니다.

 

rust는 scope가 만료되면 해당 scope에서 사용된 메모리를 해제합니다.

 

Variables and Data Interacting with Move

ownership의 장점을 설명하기 좋은 예제가 있습니다.

let s1 = String::from("hello");
let s2 = s1;

위의 코드에서 s1과 s2 모두 heap에 있는 String 값을 가리키는 pointer입니다.

scope가 만료되면 s1, s2가 가리키고 있는 메모리를 해제하겠죠?

 

그러면 s1과 s2는 같은 메모리를 가리키고 있기 때문에 double free 에러가 발생할 수 있습니다.

rust에서는 어떻게 해결했을까요?

 

rust의 ownership은 let s2 = s1; 줄이 실행될 때, s1 변수를 무효화 시키는 것으로 double free 에러를 막았습니다.

  • 조금 더 정확히는 pointer에 대해서 shallow copy가 일어날 때 source 변수를 무효화시킵니다.

Scope and Assignment

비슷하게, 이미 값이 할당되어 있는 변수에 새로운 값을 할당할 때에도 이전에 사용하던 메모리를 해제합니다.

let mut s = String::from("hello");
s = String::from("ahoy");
println!("{s}, world!");

 

Variables and Data Interacting with Clone

deep copy(clone)을 이용하면 메모리가 해제되지 않습니다.

 

Stack-Only Data: Copy

스택에 저장되는 타입들은 복사의 비용이 저렴하기 때문에 값을 전달하더라도 ownership이 사라지지 않습니다.

  • Copy trait이 있는 타입은 스택에 저장할 수 있습니다!

Ownership and Functions, Return Values and Scope

함수에 파라미터를 전달하고 값을 반환 받을 때도 ownership이 전달됩니다.


으앗 이번에는 다른 작업과 살짝 병행하면서 공부했더니 속도가 느리네요...

오늘은 여기까지 해보겠습니다!

반응형