Rust, 쉽게 하자!

Rust 입문

[Rust] 변수, 상수 그리고 static

바로크냥 2022. 9. 25. 07:50

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