Rust 튜토리얼 목차

라이프타임: 참조의 유효 기간 이해하기

🎯 Lifetime

라이프타임은 참조가 유효한 기간 동안 해당 값이 메모리에서 해제되지 않도록 보장하는 개념입니다.

이를 통해 Rust에서 참조를 안전하게 사용할 수 있습니다.

여기선 함수 시그니처와 구조체에서 수명을 어떻게 표시하는지 보여줍니다.

수명은 주로 빌림 검사기가 메모리 안전성을 보장하기 위한 도구로 사용되며, 컴파일러에 의해 자주 자동으로 추론된다는 것을 강조합니다.

('hey: lifetime hey로 읽음)

수명이란 무엇인가:

수명은 참조와 빌려진 값 사이의 관계를 표현하는데 사용됩니다.

수명은 참조가 유효한 기간 동안 해당 값이 메모리에서 해제되지 않도록 보장합니다.

함수 시그니처와 구조체에서의 수명 표시:

예제 1: 함수 시그니처에서 수명 표시

// 여기에서 사용된 'a는 수명을 나타내는 표시입니다.
// 이를 통해 입력과 출력의 참조들이 동일한 수명을 가지도록 합니다.
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() > s2.len() {
        s1
    } else {
        s2
    }
}

예제 2: 구조체에서 수명 표시

// Person 구조체는 이름을 문자열 슬라이스로 저장합니다.
// 여기에서 사용된 'a는 구조체의 이름 필드가 참조하는 문자열 슬라이스의 수명을 나타냅니다.
struct Person<'a> {
    name: &'a str,
}

수명과 빌림 검사기:

수명은 빌림 검사기가 참조가 유효한 기간 동안 값이 메모리에서 해제되지 않도록 보장하는 데 사용됩니다.

대부분의 경우, 컴파일러는 수명을 자동으로 추론할 수 있습니다.

그러나 복잡한 상황에서는 개발자가 수명을 명시해야 할 수도 있습니다.

수명을 이해하고 올바르게 사용함으로써 Rust의 빌림 검사기가 메모리 관리를 안전하게 수행할 수 있도록 지원할 수 있습니다.

이는 Rust 프로그램의 성능과 안정성에 크게 기여합니다.

struct Wrapper<'a, T: 'a> {
    value: &'a T,
}

impl<'a, T> Wrapper<'a, T> {
    fn new(value: &'a T) -> Self {
        Wrapper { value }
    }
}

fn main() {
    let x = 42;
    let y = Box::new(7);
    {
        let wrapper = Wrapper::new(&x);
        println!("Wrapper contains: {}", wrapper.value);
        let wrapper2 = Wrapper::new(&y);
        println!("Wrapper2 contains: {}", wrapper2.value);
    } // y가 메모리에서 해제됩니다.
} // x가 메모리에서 해제됩니다.