Shadowing

Rust

목록 보기
3/5
post-thumbnail

Rust의 변수 섀도잉(Shadowing)을 알아봅시다

오늘은 Rust의 독특한 변수 섀도잉(Shadowing) 기능에 대해 알아보도록 하겠습니다. 다른 언어들과는 조금 다른 Rust만의 특별한 기능이라고 합니다.

섀도잉이란?

섀도잉은 같은 이름의 변수를 새로 선언하여 이전 변수를 가리는 것을 말합니다. 다른 언어에서는 이런 것이 불가능하거나 경고를 발생시키지만, Rust에서는 의도적으로 설계된 기능입니다.

fn main() {
    let x = 5;
    println!("첫 번째 x: {}", x);  // 5 출력

    let x = x + 1;
    println!("두 번째 x: {}", x);  // 6 출력

    let x = x * 2;
    println!("세 번째 x: {}", x);  // 12 출력
}

다른 언어들과의 비교

JavaScript

JavaScript에서는 같은 이름의 변수를 재선언하면 경고가 발생합니다:

let x = 5;
let x = 6; // SyntaxError: Identifier 'x' has already been declared

Python

Python에서는 변수 재할당은 가능하지만, 같은 스코프에서 같은 이름의 변수를 재선언하는 것은 불가능합니다:

x = 5
x = 6  # 가능
x = 7  # 가능

Rust

Rust에서는 같은 이름의 변수를 자유롭게 재선언할 수 있습니다:

let x = 5;
let x = 6;  // 가능!
let x = 7;  // 가능!

섀도잉의 장점

1. 변수 타입 변경 가능

섀도잉을 사용하면 같은 이름의 변수에 다른 타입을 할당할 수 있습니다:

fn main() {
    let spaces = "   ";  // 문자열 타입
    let spaces = spaces.len();  // 숫자 타입으로 변경
    println!("공백의 개수: {}", spaces);  // 3 출력
}

2. 코드 가독성 향상

변수의 의미는 유지하면서 값만 변경하고 싶을 때 유용합니다. 임시 변수를 사용하고 싶을 때도 좋고, 특정 변수에 많은 작업을 반복하지만 그 사이에 변수 자체에 대해서 신경쓰고 싶지 않을때도 유리합니다.

fn calculate_price(quantity: i32) -> i32 {
    let price = quantity * 100;  // 기본 가격
    let price = price - (price / 10);  // 10% 할인
    let price = price + 1000;  // 배송비 추가
    price
}

3. 불변성 유지

Rust의 변수는 기본적으로 불변(immutable)입니다. 섀도잉을 사용하면 불변성을 유지하면서도 값을 변경할 수 있습니다:

fn main() {
    let x = 5;  // 불변 변수
    let x = x + 1;  // 새로운 불변 변수로 섀도잉
    println!("x의 값: {}", x);  // 6 출력
}

섀도잉 vs 재할당

섀도잉과 재할당은 비슷해 보이지만 중요한 차이가 있습니다:

fn main() {
    // 섀도잉 사용
    let x = 5;
    let x = x + 1;  // 새로운 변수 생성

    // 재할당 사용
    let mut y = 5;
    y = y + 1;  // 기존 변수 값 변경
}

주요 차이점:

  1. 섀도잉은 새로운 변수를 생성합니다
  2. 재할당은 기존 변수의 값을 변경합니다
  3. 섀도잉은 타입을 변경할 수 있습니다
  4. 재할당은 같은 타입만 가능합니다

실제 사용 예시

사용자 입력 처리

fn process_user_input() {
    let input = "42";
    let input: i32 = input.parse().unwrap();  // 문자열을 숫자로 변환
    println!("입력된 숫자: {}", input);
}

단계별 계산

fn calculate_final_price(original_price: f64) -> f64 {
    let price = original_price;
    let price = price * 1.1;  // 10% 세금 추가
    let price = price - 1000.0;  // 1000원 할인
    price
}

주의사항

섀도잉은 강력한 기능이지만, 과도한 사용은 코드를 이해하기 어렵게 만들 수 있습니다:

// 좋지 않은 예시 - shadowing 남발로 인한 가독성 저하
fn bad_example() {
    let x = 1;
    let x = 2;
    let x = 3;
    let x = 4;
    println!("x: {}", x);  // x가 무엇인지 추적하기 어려움
}

// 좋은 예시 - 굳이 shadowing을 사용하지 않아도 될 때
fn good_example() {
    let initial_value = 1;
    let calculated_value = initial_value * 2;
    let final_value = calculated_value + 1;
    println!("최종 값: {}", final_value);
}

결론

Rust의 섀도잉은 다른 언어에서는 찾아볼 수 없는 독특한 기능입니다. 이는 Rust의 설계 철학을 잘 보여주는 예시이기도 합니다. 섀도잉을 적절히 사용하면 코드를 더 깔끔하고 안전하게 작성할 수 있습니다.
하지만 모든 도구가 그렇듯이, 섀도잉도 적절한 상황에서 적절히 사용해야 합니다. 과도한 섀도잉은 코드의 가독성을 해칠 수 있으니 주의해서 사용해주세요!

0개의 댓글