본문 바로가기
Rust

Rust 설치부터 실행까지 (섀도어) - 4

by lms0806 2024. 12. 26.
728x90
반응형

오늘은 이전에 살짝 살펴봤던 RUST의 섀도잉(shadowed)에 대해 알아보고자 합니다.

복습

이전에 rust에서 변수를 재선언 할 수 있다. 라고 이야기했었습니다.

 

다음과 같은 코드의 경우 x라는 변수를 중복으로 사용하고 있습니다.

fn main() {
    let x = 5;

    let x = x + 1;

    println!("The value of x is: {x}");
}

그치만 println! 에 기록되는 x의 값은 5 + 1인 6이 됩니다.

섀도잉

그럼 다음과 같은 경우에는 출력값이 어떻게 될까요?

fn main() {
    let x = 5;

    let x = x + 1;

    {
        let x = x * 2;
        println!("The value of x in the inner scope is: {x}");
    }

    println!("The value of x is: {x}");
}

정답부터 말하지만

The value of x in the inner scope is: 12
The value of x is: 6

다음과 같이 출력됩니다.

 

왜 이런 현상이 발생하는 걸까요?

{
    let x = x * 2;
    println!("The value of x in the inner scope is: {x}");
}

rust에서 스코프가 발생하게 된 후의 변수는 스코프가 끝나는 시점에서 더이상 사용되지 않습니다.

 

그래서 이전에 x의 값인 6의 2배인 12를 출력하게 되고, 스코프가 끝난 시전에서 이전 x의 값인 6을 다시 가져와서 사용되어 6을 출력하게 됩니다.

 

해당 코드의 동작 순서를 예시로 들면

1. x에 5를 대입
2. x에 기존 x + 1값 도입
3. 괄호를 열고 x에 x * 2를 도입
4. x * 2한 값을 출력
5. 괄호가 닫힘으로 인하여, 현재 x의 값은 사용하지 않고, 6의 값을 가진 x를 불러옴
6. x를 출력

그런데 여기서 의문점이 생깁니다.


이전에 분명히 rust는 기본 변수가 불변 이라고 하였는데, 왜 x의 값이 변동되는 걸까요?

 

이번에 설명드린 섀도어는 이전 변수의 값 변경이 아닌 재선언에 해당됩니다.

let x = 5;
let x = x + 1;
let mut x = 5;
x = x + 1;

그러하여 다음 2개의 행동은 같은 결과를 가져오게 됩니다.

 

이로 인하여 다음과 같은 상황에서도 활용 가능합니다.


문자열을 선언하고, 문자열의 길이를 출력해야 하는 상황

다음과 같인 선언한 경우는 어떻게 될까요?

fn main() {
    let mut str = "123";
    str = str.len();

    println!("{str}");
}

기존 str의 타입은 mut로 가변타입의 변수로 "123"의 값을 가지고 있습니다.


이후 "123"의 길이를 str에 선언하고자 하였으나, 기존 str의 타입은 문자열이지만 변경할려는 타입은 숫자 입니다.

 

그러므로, 변수 타입을 바꿀 수 없다는 에러가 발생하게 됩니다.

 

그러면 다음과 같은 상황은 어떻게 될까요?

fn main() {
    let str = "123";
    let str = str.len();

    println!("{str}");
}

다음과 같은 경우, 변수 재선언에 해당되어 정상적으로 3이라는 값을 출력하게 됩니다.

정리

  1. 스코프가 시작되는 시점부터 끝나는 시점까지 선언된 변수는 스코프가 끝난 이후에 사용이 불가능하다.
  2. 섀도어는 변수명을 다시 활용할 수 있도록 하는 rust의 방식이다.
  3. 섀도어를 사용함으로써, 변수 타입을 변경할 수 있다.
728x90
반응형

댓글