본문 바로가기
개발/러스트 (Rust)

Rust 기본, 상수와 정적 변수 (Constants, Statics) 비교.

by 레조 2024. 7. 6.

https://rustacean.net/

 

Rust 기본, 상수와 정적 변수 (Constants, Statics) 비교.

상수(const)와 정적(static)은 어떤 범위(scope)에서도 사용할 수 있다.

두 경우 모두 명시적으로 타입을 선언해야한다.

 

const는 인라인 처리됩니다.

이는 컴파일 타임에 상수를 사용하는 부분에 직접 값이 대체됩니다.

 

static은 메모리에 존재하므로 주소를 가집니다. (프로그램과 같은 수명을 가집니다.)

또한 프로그램의 모든 스레드에서 접근 가능하므로, static mut 사용할 경우 스레드 안전성을 확보하기 위해 unsafe 키워드 혹은 Mutex를 통해 값을 변경할 수 있습니다.

 


 

CODE

const MAX_PLAYER: u8 = 10;
static SNOWOODS_NAME: &str = "Rusty Snowoods";

fn main() {
    // 컴파일러는 컴파일 시점에 const 이름을 해당 값으로 대체합니다.
    let a = MAX_PLAYER;
    let b = MAX_PLAYER;

    let c = SNOWOODS_NAME;
    let d = SNOWOODS_NAME;
}

 

정적 변수 수정하기. (static mut, unsafe)

static mut COUNTER: i32 = 0;

fn increment_counter() {
    unsafe {
        COUNTER += 1;
    }
}

fn main() {
    unsafe {
        println!("Initial COUNTER: {}", COUNTER);
    }

    increment_counter();

    unsafe {
        println!("Updated COUNTER: {}", COUNTER);
    }
}

 

정적 변수 수정하기. (static mutex)

use std::sync::Mutex;
use std::sync::Arc;
use std::thread;

static COUNTER: Mutex<i32> = Mutex::new(0);

fn main() {
    let counter = Arc::new(COUNTER);

    let handles: Vec<_> = (0..10).map(|_| {
        let counter = Arc::clone(&counter);
        thread::spawn(move || {
            let mut num = counter.lock().unwrap();
            *num += 1;
        })
    }).collect();

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Final COUNTER: {:?}", *counter.lock().unwrap());
}