프로그래밍백엔드 개발자

Rust에서 상수와 정적 변수란 무엇이며, 그 차이점은 무엇인지, 각각 언제 사용하는 것이 더 바람직한지 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

Rust에서는 프로그램 실행 중 불변 데이터를 저장하는 두 가지 주요 방법이 있습니다: conststatic.

**상수 (const)**는 컴파일 타임에 계산되는 불변 값입니다. 항상 명시적으로 타입이 지정되어야 하며, 상수 표현식으로 초기화되어야 합니다(컴파일 타임에 계산될 수 있는 것). 상수는 메모리에서 고정 주소가 없으며, 컴파일러가 사용 위치에 인라인으로 삽입합니다.

const MAX_ATTEMPTS: u32 = 5;

**정적 변수 (static)**는 프로그램이 실행되는 동안 특정 메모리 영역에 값을 저장합니다. 주소가 고정되어 있으며, 변경 가능할 수 있습니다(static mut 사용). 그러나 다중 스레드 시나리오에서 데이터 경합 가능성으로 인해 특별한 주의가 필요합니다.

static APP_NAME: &str = "MyApp"; static mut COUNTER: u32 = 0;
  • 값이 항상 컴파일 타임에 알려져야 하고 전역 저장소가 필요하지 않을 때는 const를 사용하십시오.
  • 메모리에 저장할 단일 장소에 대한 접근이 필요하거나, 값이 컴파일 타임에 계산될 수 없는 경우는 static을 사용하십시오.

트릭 질문

Rust에서 conststatic의 차이는 무엇입니까? 정적 변수가 비상수에 참조할 수 있습니까?

답변: 주요 차이점은 저장 영역(lifetime)입니다: const는 메모리에서 존재를 보장하지 않으며(값을 대체함), static은 고정 주소를 가진 프로그램 전체에 살아 있는 객체입니다.

정적 변수에는 컴파일 타임에 알려진 값만 할당할 수 있습니다:

let a = 42; // static INVALID: i32 = a; // 오류! 오직 상수만 허용됩니다.

주제에 대한 무지로 인한 실제 오류 사례.


이야기

부하 분산 백엔드 서비스 프로젝트에서 한 개발자는 static mut를 사용하여 여러 스레드에서 호출 수를 공유하는 카운터를 다루었지만, 동기화를 사용하지 않았습니다. 이로 인해 데이터 경합 및 예측할 수 없는 결과가 발생했습니다. 일부 호출은 단순히 손실되었습니다. 해결책은 std::sync::atomic의 원자적 유형 또는 Mutex를 사용하는 것입니다.


이야기

한 젊은 개발자는 사용자 인사말 문자열을 const로 상수화하려 했지만, 초기화 중에 계산되는 함수의 결과와 연결하려고 했습니다. 컴파일러는 오류를 발생시켰습니다. 값은 컴파일 타임에 정의되어야 하기 때문입니다. 이유는 상수가 컴파일 타임에 계산 가능해야 하는데 비해 함수는 실행 시간에 값을 반환하기 때문입니다.


이야기

오래된 프로젝트에서 모든 전역 값을 static으로 변경했지만, 문자열 리터럴과 참조가 프로그램의 메모리 영역을 사용한다는 사실을 잊어버렸습니다. 일부 선언은 실제로 값 교체만 필요했습니다: 이로 인해 바이너리 크기가 증가하고 메모리 관리가 복잡해졌습니다. 결과적으로 실행 시간이 증가하고 동적 라이브러리 로딩 시 메모리 누수가 발생했습니다.