라이프타임 (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` 종료. ─────────────────────────────────┘│
// │
} // 라이프타임 종료. ─────────────────────────────────────┘
라이프타임을 레이블하기 위해 이름이나 유형이 할당되지 않았다는 점에 유의하십시오. 이는 우리가 보게 될 것처럼 라이프타임이 사용될 수 있는 방식을 제한합니다.