본문 바로가기
학습 내용/Rust

[일반 프로그래밍 개념] 변수

by yein 2022. 5. 23.
  • 러스트에서 변수는 기본적으로 변경이 불가능
    • 러스트는 불변성을 기본으로 하기 때문
    • 필요한 경우에는 변경 가능한 변수로 선언할 수 있음.
  • 예제
fn main() {
    let x = 5;
    println!("x의 값: {}", x);
}

터미널에서 cargo run을 실행하면, x의 값: 5이라고 정상적으로 출력된다.

fn main() {
    let x = 5;
    println!("x의 값: {}", x);

    x = 6;
    println!("변경된 x의 값: {}", x);
}

터미널에서 cargo run을 실행하면, 다음과 같은 에러 메시지와 함께 컴파일을 할 수 없다는 컴파일러 에러가 발생한다.

 

러스트는 컴파일러 차원에서 이와 같이 친절하게 에러의 원인과 해결을 위한 도움말까지 제공해준다.

 

error[E0384]: 불변 변수 x에 두번 할당할 수 없다.

도움말: 재할당을 하고 싶으면 변수 x에 첫 번째 할당을 할 때 x를 가변 변수로 선언하라. - mut x

 

도움말에 따라 코드를 수정해보자.

fn main() {
    let mut x = 5;
    println!("x의 값: {}", x);

    x = 6;
    println!("변경된 x의 값: {}", x);
}

다시 터미널에서 cargo run을 실행하면,

x의 값: 5

변경된 x의 값: 6

이라고 정상적으로 출력된다.

 

  • 상수
    • 상수는 선언된 범위 내에서 항상 유효함.
    • 하드코드된 값에 상수로 이름을 지정하여 해당 값의 의미를 표시하기 위한 용도로 사용할 수 있음.
    • 상수에는 mut 키워드를 사용할 수 없음. 즉 항상 불변임.
    • 변수는 let 키워드를 통해 선언하는 반면, 상수는 const 키워드를 사용하여 선언해야 하고 타입도 반드시 지정해줘야 함.
    • 상수에는 함수 호출의 결과나, 런타임 연산을 통해 얻은 값을 할당할 수 없음. 반드시 상수 표현식을 사용하여 할당해야 함.
    • 러스트에서 상수 이름을 지을 땐 대문자를 사용하며, 언더바(_)를 통해 구분함.
const HAPPY_MONDAY: bool = false;
  • 변수 가리기
    • 이미 선언한 변수와 똑같은 이름의 변수를 let 키워드를 이용하여 다시 선언할 수 있음.
    • 이전에 선언한 변수는 이후에 선언한 변수에 가려짐. (shadowed)
    • cf.) mut 키워드를 이용하는 방법
      • mut 키워드를 이용하는 방법과 달리, 변수 가리기를 통해 새로 변경된 값은 여전히 불변임.
      • 변수 가리기를 사용하면 이전에 선언한 변수와 다른 타입의 변수를 선언할 수 있지만, mut 키워드를 이용할 경우에는 처음 선언한 값과 동일한 타입의 값만 재할당할 수 있음.
fn main() {
    let a = 1;
    let a = a * 2;
    let a = a * 10;
    println!("a의 값은 ... {}", a); // a의 값은 ... 20
    
    let a = "hi";
    println!("a의 값은 ... {}", a); // a의 값은 ... hi
}
fn main() {
    let mut x = 5;
    println!("x의 값: {}", x);

    x = 6;
    println!("변경된 x의 값: {}", x);

    // x = "hi";
    // mismatched types - expected integer, found `&str` - rustc(E0308)
}

 


참고

https://rinthel.github.io/rust-lang-book-ko/ch02-00-guessing-game-tutorial.html