Rust 프로그래밍의 라이프타임 개념

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Rust 의 라이프타임 (lifetimes) 개념과 컴파일러가 이를 사용하여 코드 내 차용 (borrows) 의 유효성을 보장하는 방법을 살펴봅니다. 라이프타임은 변수의 생성부터 소멸까지의 지속 시간을 결정하는 컴파일러의 구성 요소입니다. 라이프타임과 스코프 (scope) 는 관련이 있지만 동일하지는 않습니다. & 연산자를 사용하여 변수를 차용할 때, 차용은 선언에 의해 결정되는 라이프타임을 가지며, 대여자가 소멸되기 전에 종료되는 한 유효합니다. 그러나 차용의 스코프는 참조가 사용되는 위치에 의해 결정됩니다. 제공된 예제 코드는 라이프타임과 스코프가 실제로 어떻게 사용되는지 보여주며, 각 변수는 자체 라이프타임과 스코프를 갖습니다.

참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어, main.rs를 사용하고 rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.

라이프타임 (Lifetimes)

*라이프타임 (lifetime)*은 컴파일러 (또는 더 구체적으로는 차용 검사기 (borrow checker)) 가 모든 차용이 유효한지 확인하기 위해 사용하는 구성 요소입니다. 구체적으로, 변수의 라이프타임은 생성될 때 시작하여 소멸될 때 종료됩니다. 라이프타임과 스코프 (scope) 는 종종 함께 언급되지만, 동일하지 않습니다.

예를 들어, &를 통해 변수를 차용하는 경우를 생각해 봅시다. 차용은 선언된 위치에 의해 결정되는 라이프타임을 갖습니다. 결과적으로, 차용은 대여자가 소멸되기 전에 종료되는 한 유효합니다. 그러나 차용의 스코프는 참조가 사용되는 위치에 의해 결정됩니다.

다음 예제와 이 섹션의 나머지 부분에서 라이프타임이 스코프와 어떻게 관련되는지, 그리고 두 가지가 어떻게 다른지 살펴보겠습니다.

// 아래에 각 변수의 생성과 소멸을 나타내는 선으로 라이프타임이 주석 처리되어 있습니다.
// `i` 는 `borrow1` 과 `borrow2` 를 모두 완전히 포함하는 스코프를 가지므로 가장 긴 라이프타임을 갖습니다.
// `borrow1` 과 비교하여 `borrow2` 의 지속 시간은 서로 분리되어 있으므로 관련이 없습니다.
fn main() {
    let i = 3; // `i` 의 라이프타임 시작. ────────────────┐
    //                                                     │
    { //                                                   │
        let borrow1 = &i; // `borrow1` 라이프타임 시작. ──┐│
        //                                                ││
        println!("borrow1: {}", borrow1); //              ││
    } // `borrow1` 종료. ─────────────────────────────────┘│
    //                                                     │
    //                                                     │
    { //                                                   │
        let borrow2 = &i; // `borrow2` 라이프타임 시작. ──┐│
        //                                                ││
        println!("borrow2: {}", borrow2); //              ││
    } // `borrow2` 종료. ─────────────────────────────────┘│
    //                                                     │
}   // 라이프타임 종료. ─────────────────────────────────────┘

라이프타임을 레이블하기 위해 이름이나 유형이 할당되지 않았다는 점에 유의하십시오. 이는 우리가 보게 될 것처럼 라이프타임이 사용될 수 있는 방식을 제한합니다.

요약

축하합니다! 라이프타임 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.