잡학(雜學)

Rust 2장 - 1. 변수와 상수

쪼랩전사 2021. 6. 15. 19:37
728x90

변수

Rust는 정적 타입(Statically Typed) 언어이다.

Rust의 변수 선언은 let 키워드 사용하며, 기본적으로 불변(immutable)이다.

변수는 변하는 수를 말하는데 불변이라고 하니 뭔가 이상하다. 근데 그냥 그렇다고 치고 넘어가자.


fn main() {
    let x = 10;
    x = x + 1;
    println!("{}", x);
}

위와 같이 변수를 사용할 경우, 아래와 같은 에러가 발생한다.


error[E0384]: cannot assign twice to immutable variable `x`
 --> src/main.rs:3:5
  |
2 |     let x = 10;
  |         -
  |         |
  |         first assignment to `x`
  |         help: make this binding mutable: `mut x`
3 |     x = x + 1;
  |     ^^^^^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.
error: could not compile `itn`

To learn more, run the command again with --verbose.

그리고 rust는 굉장히 친절하다. 만약 문제가 발생하면 help와 함께 어떻게 해야 하는지를 알려준다.

help: make this binding mutable: `mut x`

위의 내용을 보면 mut x를 사용하여 mutable로 바꾸라고 하고 있다.
이대로 따라 하면 아래와 같은 코드가 나온다.


fn main() {
    let mut x = 10;
    x = x + 1;
    println!("{}", x);
}

rust는 mut 키워드를 사용해서 불변의 변수가 아닌 변수를 선언하게 된다.

그리고 자연스럽게 넘어갔는데, 소스 코드를 보면 x 변수의 데이터 타입을 지정하지 않는다.
즉, rust는 가능한 경우 자동으로 변수의 타입을 추론한다.

자, 처음으로 문제를 내겠다.


fn main() {
    let x = 10;
    let x = x + 1;
    println!("{}", x);
}

위의 코드는 과연 동작할까?

동작한다. 에러 혹은 경고도 발생하지 않는다!
이를 shadowing이라고 한다.
그리고 shadowing을 할 경우, 변수의 타입이 같을 필요가 없다.

 

참고로 위의 코드에서 2번째 let을 없애면 당연히 에러가 발생한다.

상수

변수는 불변이고, 상수도 불변이다.
뭐가 다를까?
상수는 let 대신 const 키워드를 사용한다.


const GLOBAL:i32 = 33;
let x = 10;

fn main() {
    println!("global: {}, x: {}", GLOBAL, x);
}

const는 위와 같이 데이터 타입 지정해주어야 한다.
그리고, 함수 밖에 위치해도 된다.
하지만 위의 코드는 에러가 발생한다.
이유는 변수 때문이다.
변수는 함수의 내부에서만 존재할 수 있다.

'잡학(雜學)' 카테고리의 다른 글

Rust 2장 - 3. 문자열  (0) 2021.06.24
Rust 2장 - 2. 기본 데이터 타입  (0) 2021.06.17
억지 기법  (0) 2021.06.13
Rust 1장. Hello World!  (0) 2021.06.12
프로그래밍 언어  (0) 2021.05.23