comnic's Dev&Life

[Rust] 7. 소유권과 대여 본문

Rust

[Rust] 7. 소유권과 대여

comnic 2023. 12. 5. 20:33
반응형

7. 소유권과 대여

Rust의 핵심 개념 중 하나는 소유권(Ownership) 시스템입니다. 이는 메모리 안전성과 경합 상태를 방지하는 기술적인 도구로 사용됩니다.

7. 1 소유권 시스템 소개

  • Rust에서 모든 값은 변수에 소유권(ownership)을 가지고 있습니다. 한 번에 하나의 변수만이 해당 값의 소유권을 갖을 수 있습니다.
  • 소유권은 변수가 스코프 밖으로 벗어날 때 해당 값이 메모리에서 해제되는 것을 의미합니다.

예제:

fn main() {
    let s1 = String::from("Hello"); // s1이 String의 소유권을 가짐
    let s2 = s1; // s2가 소유권을 가져감, s1은 더 이상 유효하지 않음
    // println!("{}", s1); // 컴파일 에러! s1은 더 이상 사용할 수 없음

    println!("{}", s2); // s2는 여전히 유효
}

 

7. 2 빌림과 참조

  • 소유권을 넘기지 않고도 데이터에 접근할 수 있도록 빌림(borrowing)과 참조(reference)를 사용할 수 있습니다.
  • 빌림은 다른 코드에게 데이터의 일부분에 임시로 접근할 수 있는 권한을 부여합니다.

예제:

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

fn main() {
    let s1 = String::from("Hello");
    let len = calculate_length(&s1); // s1에 대한 참조를 전달
    println!("길이: {}", len);
}

 

7. 3 라이프타임

  • 라이프타임(lifetime)은 참조자의 유효 범위를 나타냅니다. Rust는 참조자의 유효성을 검증하기 위해 라이프타임을 사용합니다.
  • 'a와 같이 작성되며, 함수 시그니처에서 표현됩니다.

예제:

// 라이프타임 'a를 갖는 함수
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() > s2.len() {
        s1
    } else {
        s2
    }
}

fn main() {
    let s1 = String::from("Hello");
    let result;
    {
        let s2 = String::from("Rust");
        result = longest(&s1, &s2); // s1, s2 중 더 긴 문자열의 참조를 result에 저장
    }
    println!("가장 긴 문자열: {}", result); // s2의 라이프타임이 끝났으므로 사용 불가능
}

 

이러한 예제를 통해 Rust의 소유권 시스템, 빌림, 참조, 그리고 라이프타임이 어떻게 동작하는지를 이해할 수 있습니다. 

반응형
Comments