How to Use Runtime-Initialized Variables in Rust

러스트에서 런타임 초기화 변수 사용 방법

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

- 러스트 개발자: conststatic의 한계를 넘어서는 런타임 초기화 변수 구현 방법을 필요한 개발자

- 난이도: 중급~고급 (러스트의 lazy_staticLazyLock 사용법 이해 필요)

핵심 요약

  • conststatic 한계: 비상수 함수 호출(예: Regex::new)을 허용하지 않음
  • lazy_static 활용: 런타임 초기화를 위한 외부 라이브러리 사용 가능
  • LazyLock (Rust 1.80): lazy_static 대체로 내장 지원, 스레드 안전한 초기화 제공

섹션별 세부 요약

1. `const` 및 `static`의 한계

  • const: 상수 함수만 허용, Regex::new 호출 불가
  • static: 메모리 주소 참조 가능, mut 키워드로 값 변경 가능
  • 둘 다 스택/힙 할당이나 비상수 함수 호출을 허용하지 않음

2. `lazy_static` 사용 예시

  • 매크로 사용: lazy_static! { static ref REGEXP_WAREHOUSE_ENDPOINT: Regex = ... }
  • 기능: 런타임 초기화, 힙 할당 가능, 비상수 함수 호출 허용
  • 한계: 외부 라이브러리 의존

3. `LazyLock` (Rust 1.80)

  • 구조체 정의: LazyLock T>
  • 특징:
  • 첫 번째 접근 시 초기화
  • 스레드 안전한 LazyCell 구현
  • static 변수에 직접 사용 가능
  • 사용 예시:

```rust

static REGEXP_WAREHOUSE_ENDPOINT: LazyLock = LazyLock::new(|| Regex::new(...).unwrap());

```

4. 대체 옵션: `OnceLock`

  • 기능: LazyLock과 유사, 단일 스레드에서 사용 가능
  • 사용 시기: 스레드 안전성 필요 없을 때

결론

  • 권장사항: Rust 1.80 이상 사용 시 LazyLocklazy_static 대신 사용
  • 예시: LazyLock::new(|| Regex::new(...).unwrap())
  • 기타: OnceLock은 스레드 안전성이 필요 없는 경우에 유리함