변수

변수 (Variables)

변수(variable)는 스택 프레임(stack frame)의 구성 요소예요. 이 글에서는 변수가 무엇인지, 그리고 초기화와 가변성에 관한 규칙을 살펴볼게요.

출처: Rust Reference

본문

변수는 스택 프레임의 구성 요소로, 다음 중 하나예요.

  • 이름이 있는 함수 매개변수
  • 익명 임시값(anonymous temporary)
  • 이름이 있는 지역 변수(local variable)

지역 변수 (Local variables)

지역 변수(또는 스택 지역 할당, stack-local allocation)는 값을 직접 보유해요. 스택의 메모리 안에 할당되고, 그 값은 스택 프레임의 일부가 돼요.

가변성 (Mutability)

지역 변수는 다르게 선언되지 않는 한 불변이에요. 예를 들어 let mut x = ....처럼 선언해야 가변이 돼요.

함수 매개변수도 mut로 선언되지 않으면 불변이에요. mut 키워드는 다음에 오는 매개변수 하나에만 적용돼요. 예를 들어 |mut x, y|fn f(mut x: Box<i32>, y: Box<i32>)는 가변 변수 x 하나와 불변 변수 y 하나를 선언해요.

초기화 (Initialization)

지역 변수는 할당될 때 초기화되지 않아요. 대신, 프레임에 진입할 때 해당 프레임의 모든 지역 변수가 초기화되지 않은 상태로 통째로 할당돼요. 함수 안의 이후 문장들이 지역 변수를 초기화할 수도 있고 아닐 수도 있어요. 지역 변수는 도달 가능한 모든 제어 흐름 경로를 통해 초기화된 후에만 사용할 수 있어요.

다음 예시를 볼게요. init_after_ifif 표현식 이후에 초기화되지만, uninit_after_ifelse 분기에서 초기화되지 않기 때문에 초기화된 상태가 아니에요.

#![allow(unused)]
fn main() {
fn random_bool() -> bool { true }
fn initialization_example() {
    let init_after_if: ();
    let uninit_after_if: ();

    if random_bool() {
        init_after_if = ();
        uninit_after_if = ();
    } else {
        init_after_if = ();
    }

    init_after_if; // ok
    // uninit_after_if; // err: use of possibly uninitialized `uninit_after_if`
}
}

if의 두 분기 모두 init_after_if는 초기화하지만, uninit_after_iftrue 분기에서만 초기화해요. 그래서 else 분기를 거쳤다면 초기화되지 않은 상태로 남아 있고, 컴파일러가 이를 잡아서 오류로 알려줘요 ("use of possibly uninitialized").

더 알아보기 (Learn more)