13.4 Lifetimes
생명주기는 컴파일러에 의해 생성되어(또한 대여 검사자로 불리는) 모든 대여가 유효한지 확인하고자 사용한다. 특별히, 변수의 생명주기는 그가 생성될 때 시작하고 소멸할 때 끝난다. 생명주기와 범위가 자주 함께 인용되는데, 이들은 같지 않다.
취하기를 예로, 우리가 변수를 &
로 대여하는 상황이다. 대여는 그게 선언되는 곳에 의해 생명주기가 결정된다. 그 결과 대여는 그 대여자가 소멸하기 전 그 끝까지만 유효하다(생명주기). 하지만, 대여의 범위는 참조가 사용되는 곳에 의해 결정된다(범위).
이 섹션의 나머지와 다음의 예제에서, 우리는 생명주기가 범위와 어떻게 연관있고 어떻게 다른지 살펴보게 될 것이다.
// 생명주기는 줄로 표시하여 각 변수들의 생성과 소멸을 주해했다. // `i`는 `borrow1`과 `borrow2`를 모두 포괄하는 범위로 가장 긴 생명주기를 갖는다. // `borrow1`와 `borrow2`의 생명주기의 비교는 서로 분리되어 있기 때문에 부적절하다. fn main() { let i = 3; // Lifetime for `i` starts. ────────────────┐ // │ { // │ let borrow1 = &i; // `borrow1` lifetime starts. ──┐│ // ││ println!("borrow1: {}", borrow1); // ││ } // `borrow1 ends. ──────────────────────────────────┘│ // │ // │ { // │ let borrow2 = &i; // `borrow2` lifetime starts. ──┐│ // ││ println!("borrow2: {}", borrow2); // ││ } // `borrow2` ends. ─────────────────────────────────┘│ // │ } // Lifetime ends. ─────────────────────────────────────┘
주목할 점은 생명주기 꼬리표에는 이름이나 타입이 부여되지 않는다. 이 제약은 앞으로 우리가 살펴보게 되는 것처럼 생명주기가 사용될 수 있게 한다.