이동과 초기화 추적
빌림 검사기가 하는 일 중 하나는 임의의 시점에 어떤 변수가 “초기화“되어 있는지 추적하는 것입니다. 이를 위해서는 이동이 어디에서 일어나는지 파악하고 추적하는 일도 필요합니다.
초기화와 이동
사용자의 관점에서 보면 초기화(변수에 어떤 값을 부여하는 것)와 이동(소유권을 다른 곳으로 넘기는 것)은 별개의 주제처럼 보일 수 있습니다. 실제로 빌림 검사기의 오류 메시지도 이 둘을 서로 다르게 설명하는 경우가 많습니다. 하지만 빌림 검사기 내부에서는 이 둘이 그렇게까지 분리되어 있지 않습니다. 대략적으로 말하면, 빌림 검사기는 소스 코드의 모든 지점에서 “초기화된 위치“의 집합을 추적합니다. 이전에 초기화되지 않았던 지역 변수에 값을 대입하면 그 변수가 이 집합에 추가되고, 지역 변수에서 값을 이동하면 그 변수가 이 집합에서 제거됩니다.
다음 예제를 살펴보십시오.
fn foo() {
let a: Vec<u32>;
// a is not initialized yet
a = vec![22];
// a is initialized here
std::mem::drop(a); // a is moved here
// a is no longer initialized here
let l = a.len(); //~ ERROR
}
여기서 a는 초기화되지 않은 상태로 시작하며, 값이 대입되면 초기화된 상태가 된다는 것을 알 수 있습니다. 하지만 drop(a)가 호출되면 a가 그 호출 안으로 이동하므로, 다시 초기화되지 않은 상태가 됩니다.
하위 절
살펴보기 쉽도록 이 절은 여러 하위 절로 나뉘어 있습니다.
- 이동 경로: 어떤 지역 변수(경우에 따라서는 지역 변수의 일부)가 초기화되어 있는지 추적하는 데 사용하는 이동 경로 개념입니다.
- TODO 나머지는 아직 작성되지 않았습니다 =)