Rust의 변수와 불변성, shadowing, constant를 알아본다.
Variables and Mutability
let num = 5;
Rust
복사
Immutable로 변수에 값을 할당한다.
let mut num = 5;
Rust
복사
Mutable로 변수에 값을 할당한다.
Rust는 안전성과 손쉬운 동시성을 위해 기본적으로 immutable로 변수를 선언한다.
fn main() {
let x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}
Rust
복사
당연한 이야기지만, immutable은 값을 할당하고 변경하면 에러가 발생한다.
Rust의 장점은 이러한 잘못된 syntax를 compile time에 알 수 있다는 점이다.
이렇게 immutable로 선언되면 이 변수 x가 변경되는 것은 bug 라는 것이며, 설계되지 않은 것이다.
Compile에서 이 문제를 찾아주기 때문에 후에 하나씩 추적하면서 확인할 필요가 없다.
Shadowing
이전에 나온 같은 변수 이름을 쓰고 싶을 때 새로운 변수로 이전의 변수를 쓰는 것.
fn main() {
let number = "T-H-R-E-E"; // don't change this line
println!("Spell a Number : {}", number);
{
let number = 3; // don't rename this variable
println!("Number plus two is : {}", number + 2);
}
}
Rust
복사
이 때 첫 번째 변수는 두 번째 변수로 인해 shadowed 되었다고 표현한다.
왜냐하면 compiler에 표시되는 것은 두 번째 변수이기 때문이다.
하지만 shadowing은 mut 와는 다르다.
fn main() {
let spaces = " ";
let spaces = test.len();
}
Rust
복사
이유는 shadowing이 아닐 때 let 없이 reassigned 하면 compiler가 에러를 반환하기 때문이다.
let 을 사용해서 동일한 변수에 값을 할당하는 것은 사실상 새로운 변수를 만드는 것이다.
위 케이스에 대해서 만약 mut 를 사용하면 컴파일 에러를 반환한다.
Constants
Constants는 immutable과 비슷하게 한번 값이 할당되면, 변수에 값이 바뀌는 것을 허용하지 않는다.
하지만, immutable과의 차이점이 있다.
•
Constants에는 mut 이 허용되지 않는다.
◦
Constants는 오로지 immutable만 허용된다. rust에서 실제로 이것을 annotated type이라 하는데 후에 다룬다.
•
Constants는 expression이므로 runtime에서 값이 계산되지 않는다.
특징으로는 어떠한 scope 에서도 선언할 수 있다. (global도 가능하다)
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
Rust
복사
Rust에서 constant는 uppercase, underscore를 사용한다.
컴파일러는 컴파일 타임에 연산 집합을 계산할 수 있기 때문에 코드를 더 읽기 쉽고 명확하게 만들 수 있다.
실제로 은 3시간을 의미하며, compile 이후 10,800초로 셋팅된다.
Constant를 선언한 scope 이면 runtime 에서 언제든지 사용할 수 있다.