본문 바로가기
Rust - 교육

[Rust 교육] 러스트의 소유권(Ownership) 이해하기

by CodeCrossover 2023. 8. 10.
반응형

"러스트의 핵심 개념인 '소유권(Ownership)'에 대해 깊게 탐구하는 블로그 글입니다. 변수의 이동, 복제, 함수와의 관계, 참조와 빌림 등 소유권의 주요 원칙과 특징을 알아보며, 안전하고 효율적인 코드 작성의 중요성을 강조합니다."

 


 

러스트는 메모리 관리와 관련된 버그와 성능 저하 없이 안전하게 코드를 작성할 수 있도록 도와주는 여러 특징을 가진 언어입니다. 그 중에서도 '소유권(Ownership)'은 러스트의 핵심 개념 중 하나입니다. 이 글에서는 러스트의 소유권에 대해 깊게 알아보겠습니다.

 

1. 소유권(Ownership)이란?

소유권은 메모리 안전성을 보장하기 위한 러스트의 핵심 규칙입니다.

이 규칙은 세 가지 주요 원칙으로 구성되어 있습니다:

 

  • 러스트의 각 값은 하나의 '소유자(Owner)'를 가집니다.
  • 한 번에 하나의 변수만 데이터의 소유권을 가질 수 있습니다.
  • 소유자가 스코프를 벗어나면, 값은 폐기됩니다.

 

2. 변수의 이동(Move)

러스트에서 변수를 다른 변수에 할당하거나 함수의 인자로 전달할 때, 데이터는 복사되지 않고 '이동(Move)'됩니다.

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

위 코드에서 s1의 값은 s2로 이동되었기 때문에, s1은 더 이상 유효하지 않습니다.

 

3. 복제(Clone)

데이터를 복제하려면 clone 메서드를 사용해야 합니다.

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

이제 s1과 s2는 독립적인 두 개의 데이터를 가지게 됩니다.

 

4. 함수와 소유권

함수에 변수를 전달할 때도 소유권이 이동하거나 복제됩니다. 이는 변수를 다른 변수에 할당할 때의 규칙과 동일합니다.

fn take_ownership(s: String) {
    println!("{}", s);
}

let s = String::from("hello");
take_ownership(s);

함수 take_ownership에 s를 전달한 후에는 s를 더 이상 사용할 수 없습니다.

 

5. 참조와 빌림(References and Borrowing)

데이터의 소유권을 이동시키지 않고 참조만 전달하려면 '참조(Reference)'를 사용합니다.

fn calculate_length(s: &String) -> usize {
    s.len()
}

let s = String::from("hello");
let len = calculate_length(&s);

이렇게 하면 s의 소유권은 그대로 유지되면서 함수에 참조만 전달됩니다.

 


 

러스트의 소유권은 처음에는 이해하기 어려울 수 있지만, 이를 통해 메모리 누수나 데이터 경쟁 조건과 같은 문제를 피할 수 있습니다. 러스트의 소유권 개념을 완전히 이해하면, 더 안전하고 효율적인 코드를 작성할 수 있습니다.

반응형