Rust 변수와 상수

지난 포스트에서 Rust 설치 및 개발환경 설정 방법을 알아보았습니다.

이번 포스트에서는 Rust 언어에서 변수와 상수를 정의하고 사용하는 방법을 알아보겠습니다.

변수와 상수는 프로그래밍에서 데이터를 저장하고 재사용하는 가장 기본적인 방법입니다.

다른 모던 프로그래밍 언어와 비슷한 구조를 가지고 있어 익히기 수월할 것입니다.

Rust 변수

let 키워드로 정의, 대입하는 Rust 변수는 기본적으로 데이터를 변경할 수 없는 immutable 상태입니다.

예를 들어, 아래와 같은 코드를 실행하면,

let x = 100;

x = 200;

다음과 같이, 변경불가능한 변수에 대입 연산을 2번 실행할 수 없으며 mut 키워드를 사용하라는 에러 메시지가 출력됩니다.

3 |     let x = 100;
  |         -
  |         |
  |         first assignment to `x`
  |         help: consider making this binding mutable: `mut x`
4 |     x = 200;
  |     ^^^^^^^ cannot assign twice to immutable variable

이렇게 Rust 변수의 기본값이 immutable 하기 때문에 런타임 에러로 발생할 수 있는 코드를 컴파일 시에 잘아낼수 있는 등 여러 이점을 얻을 수 있습니다.

만약, 데이터 변경이 가능한 mutable 상태의 변수를 정의하려면 mut 키워드를 추가하면 됩니다.

let mut x = 100;

x = 200;

쉐도잉

지금까지 알아본 바에 따르면. Rust에서 한 변수의 값을 변경하기 위해선 언제나 let mut 변수로만 지정해야 할 것 같은데요.

만약 immutable 변수의 값을 바꾸지만, 여전히 immutable 하게 유지할 순 없을까요?

이를 지원하는 기능이 쉐도잉(Shadowing)입니다. 다른 언어에서는 쉽게 찾아볼 수 없는 문법인데요.

let 키워드를 다시 사용하면, 해당 변수값에 새 데이터를 대입하고 여전히 immutable하게 유지할 수 있습니다.

예시입니다.

let x = 100;

let x = 200;

println("{x}");

쉐도잉은 단순히 데이터를 바꾸는 것 뿐만 아니라 타입 변경도 가능합니다.

예를 들어 다음과 같습니다.

let spaces = "     ";
let spaces = spaces.len();

만약, let mut 키워드를 이용한 변수에 다른 타입의 데이터를 대입하면 타입 에러가 발생합니다.

Rust 상수

Rust 상수는 const 키워드로 정의할 수 있는 immutable 값입니다.

그래서 상수가 필요한 시점에 let 키워드로 정의하는 변수를 사용할 수도 있지만, 상수는 좀 더 엄격하게 immutable 원칙을 지키는 2가지 규칙을 갗습니다.

Rust 상수 값에는 우선 숫자, 문자 등 리터럴 값으로만 이루어진 표현식의 결과값만 대입가능합니다.

예를 들어, 4 + 4, "Hello, " + "World" 등의 표현식은 어떤 일이 있어도 값이 일정합니다

그래서, 함수의 리턴값 등은 대입할 수 없습니다. 함수는 파라미터에 따라 값이 변할 수 있기 때문이죠.

Rust 상수의 두번째 원칙은 언제나 타입을 명시해주어야 한다는 점입니다.

이렇게 하면, 개발자가 const NAME: &str = 1 과 같이 표현식을 적을 때 실수를 했어도 컴파일 시 잡아낼 수 있습니다.

상수는 어떠한 scope, 심지어 글로벌하게도 정의해둘 수 있기 때문에 프로젝트 전반에서 사용하는 상수값을 정의하는데에도 유용합니다.

또한, 상수는 언제나 아래와 같이 대문자와 언더스코어(_)로 이름을 짓습니다.

const TWENTY_TWO: u32 = 22

지금까지 Rust에서 변수와 상수를 사용하는 방법을 알아보았습니다.

쉐도잉이라는 부분에서 다른 언어와의 차이점이 있다는 것이 눈에 띕니다.

다음 포스트는 타입에 대한 이야기를 해보도록 하겠습니다.