2. 변수, 상수 그리고 static
Rust의 변수는 ‘let’을 사용해서 선언합니다.
let a = 12;
데이터 타입을 명시할 수도 있습니다.
let b:i32 = 12;
Rust의 변수는 기본적으로 불변입니다.
그래서 다음과 같이 하면 에러가 납니다.
let a = 100;
a = 5;
// 출력
..에러
a=5;
| ^^^ cannot assign twice to immutable variable
명칭은 변수인데 변할 수 없습니다. 불변입니다.
대신 이렇게는 할 수 있습니다.
let a = 100;
let a = 5;
다른 언어에서는 볼 수 없는 사용법입니다. 즁복해서 선언한 것처럼 보입니다.
이 방법을 쉐도잉(Shadowng)이라고 합니다. 변수의 불변성을 유지하면서 값을 변경합니다.
만약 변수를 정말로 변할 수 있도록 선언하려면 ‘mut’ 키워드를 함께 사용합니다. ‘mut’는 ‘mutable’에서 왔습니다.
let mut a = 1;
a = 2;
다른 언어의 변수처럼 사용하고 싶다면 'let mut'로 선언해야 합니다.
Rust에는 상수도 있습니다.
선언은 ‘const’ 키워드로 합니다.
const a:i32 = 1;
const를 사용할 때는 데이터 타입을 반드시 지정해 주어야 합니다.
상수기 때문에 이름 그대로 불변입니다.
그런데 변수를 선언하는 ‘let’을 사용해도 이름만 변수일 뿐 불변으로 선언되는데 왜 굳이 const를 사용할까요?
둘의 차이는 뭘까요?
const는 런타임에 바뀌지 않는 데이터여야 합니다.
예를 들어서 함수의 반환값처럼 런타임에 결정되는 값은 const가 될 수 없습니다.
참고로, 프로그래밍을 하다 보면 자주 접하게 되는 런타임과 컴파일타임에 대해서 간략하게 알려 드립니다.
런타임은 빌드 된 실행 파일을 실행할 때를 의미한다고 생각하시면 됩니다.
컴파일타임은 작성한 코드를 빌드할 때 입니다.
빌드는 우리가 작성한 코드를 컴퓨터가 이해 가능한 기계어 또는 그 중간 단계로 번역하는 과정 입니다.
const를 사용 할 때 주의 할 점이 있습니다.
const a:i32 = 1;
const a:i32 = 2;
이렇게 사용하면 에러가 발생합니다. 즉 쉐도잉을 사용할 수 없습니다. 한 번 선언하면 절대 바꿀 수 없습니다.
Rust에는 static 변수도 있습니다.
Rust에서 static 변수는 잘 사용 되지 않는다고 합니다.
Rust는 static 변수를 안전하지 않다고 여기기 때문입니다.
그래서 static 변수를 사용하려면 unsafe 키워드를 사용해서 프로그래머가 static 변수를 사용하는 것이 위험함을 충분히 인지하고 있으며 그 위험을 감수할 것임을 알려야 합니다.
특히 static 변수가 가변형일 때는 필수적으로 unsafe 키워드를 사용해야 합니다.
static mut IS_OK: bool = false;
static MY_NUMBER: u32 = 100;
fn main() {
unsafe { // 1
if IS_OK {
IS_OK = true;
}
}
println!("{}", MY_NUMBER); // 2
}
// 출력
100
관습적으로 static 변수는 대문자로 표기 합니다.
두 개의 static 변수 중에서 IS_OK는 static mut 키워드를 사용 해서 변화가 가능하도록 정의 했습니다. MY_NUMBER는 불변형입니다.
// 1: 가변형인 ISOK를 사용 하려면 unsafe 블록을 지정해 주어야 합니다.
// 2: 불변형인 MYNUMBER를 사용할 때는 unsafe 블록을 사용하지 않아도 됩니다.
만약 다음처럼 unsafe 블록을 사용하면
unsafe { println!("{}", MY_NUMBER);}
에러는 나지 않지만 경고 메시지가 출력됩니다.
11 | unsafe { println!("{}", MY_NUMBER);}
| ^^^^^^ unnecessary `unsafe` block₩
|
불필요한 unsafe 블록이라고 알려 줍니다. Rust 컴파일러는 친절합니다.
unsafe 블록은 가변형 static 변수를 사용 할 때만 필요합니다.
'Rust 입문' 카테고리의 다른 글
[Rust] String과 &str (0) | 2022.09.25 |
---|---|
[Rust] 데이터 타입 변환과 유추 (0) | 2022.09.25 |
[Rust] 데이터 타입 (0) | 2022.09.25 |
[Rust] println! 매크로 (1) | 2022.09.23 |
[Rust] 주석 달기 (1) | 2022.09.23 |