English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Rust 기본 문법

변수, 기본 타입, 함수, 주석, 및 제어 흐름, 이들은 거의 모든 프로그래밍 언어가 가지고 있는 프로그래밍 개념입니다.

이 기본 개념들은 모든 Rust 프로그램에 존재하며, 이들을 일찍 배우면 Rust를 가장 빠르게 배울 수 있습니다.

변수

먼저 명확히 해야 할 것은 Rust는 강타입 언어지만, 변수 타입을 자동으로 판단할 수 있는 능력을 가지고 있습니다. 이는 약타입 언어와 혼동하기 쉬우며.

변수를 선언하려면 let 키워드를 사용해야 합니다. 예를 들어:

let a = 123;

JavaScript를 공부한 개발자는 이 문장에 민감하게 반응하며, C 언어를 공부한 개발자는 이 문장을 이해하지 못합니다.

이声明 문장 이후, 다음 세 줄의 코드는 금지됩니다:

a = "abc";
a = 4.56; 
a = 456;

첫 번째 줄의 오류는 a를 123 이제, a는 정수형 숫자로 확정되었으며, 문자열 타입의 값을 할당할 수 없습니다.

두 번째 줄의 오류는 자동 데이터 타입 변환에서 정밀도가 손실되는 것입니다. Rust 언어는 정밀도가 손실되는 자동 데이터 타입 변환을 허용하지 않습니다.

세 번째 줄의 오류는 a가 가변 변수가 아니라는 것입니다.

첫 두 가지 오류는 쉽게 이해할 수 있습니다. 그렇다면 세 번째는 무엇인가요? a가 변수가 아니라는 건 아닌가요?

이는 Rust 언어가 고성능 동기화 안전을 위해 수행한 설계와 관련이 있습니다: 언어层面에서 가능한 한 적게 변수의 값을 변경할 수 있도록 합니다. 따라서 a의 값은 불변합니다. 하지만 이는 a가 "변수"(영어에서는 variable)가 아니라는 것을 의미하지 않습니다. 공식 문서에서 a와 같은 변수를 "불변 변수"라고 합니다.

만약 우리가 작성한 프로그램의 일부가 값이 결코 변하지 않을 것이라고 가정하여 실행되고, 그 코드의 다른 부분이 그 값을 변경하는 경우, 코드의 첫 번째 부분이 설계한 의도대로 작동하지 않을 수 있습니다. 이런 이유로 인한 오류는 이후에 찾아내기 어렵습니다. 이는 Rust 언어가 이러한 메커니즘을 설계한 이유입니다.

물론, 변수를 "가변적인"(mutable)으로 만들기 위해는 단지 mut 키워드만 필요합니다.

let mut a = 123;
a = 456;

이 프로그램은 올바르게 작동합니다.

상수와 불변 변수의 차이

불변 변수는 불변이기 때문에 상수가 아닌가요? 왜 변수라고 부르는 걸까요?

변수와 상수는 차이가 있습니다. Rust에서 다음 프로그램은 합법적입니다:

let a = 123;
let a = 456;

하지만 a가 상수라면 불법입니다:

const a: i32 = 123;
let a = 456;

변수의 값은 "rebinding"이 가능하지만, "rebinding" 이전에는 스스로 변경할 수 없어야 합니다. 이는 "binding" 이후의 영역에서 컴파일러가 프로그램 로직을 충분히 추론할 수 있도록 보장합니다. Rust는 자동 타입 결정 기능이 있지만, 일부 경우 타입을 명시하는 것이 더 편리합니다:

let a: u64 = 123;

a는 무기한으로 선언되었습니다. 64 비트 정수 변수, 타입이 명시되지 않으면 a는 자동으로 부호형으로 판단됩니다. 32 비트 정수 변수, 이는 a의 값 범위에 큰 영향을 미칩니다.

shadowing

shadowing의 개념은 다른 object-oriented 언어에서의 "override"(재정의)이나 "overload"(오버로드)과는 다릅니다. shadowing은 이전에 설명한 "rebinding"을 의미하며, 이를 대체하기 위해 인용호를 사용했습니다.

shadowing은 변수 이름이 다시 사용될 수 있는 메커니즘을 의미합니다:

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("x의 값은: {}", x);
}

이 프로그램의 실행 결과:

x의 값은: 12

shadowing과 변할 수 있는 변수의 할당은 동일한 개념이 아닙니다. shadowing은 동일한 이름으로 다른 변수实体를 다시 대표하는 것을 의미하며, 타입, 변경 가능 속성 및 값이 모두 변경될 수 있습니다. 하지만 변경 가능 변수의 할당은 단순히 값의 변경만 발생합니다.

let mut s = "123";
s = s.len();

이 프로그램은 오류를 발생시킨다: 문자열 변수에 정수 값을 할당할 수 없습니다.