Rust/Basic
[Rust Tutorial] 3 - Variables
tyoon9781
2024. 11. 14. 20:48
Intro
Rust language에서 Variable에 대한 간단한 설명을 하고자 합니다.
- Immutable : Rust 변수는 기본적으로 불변(Immutable)입니다.
가변(mutable) 변수로 선언하려면 mut 키워드를 사용해야 합니다. - Static Type : Rust는 static type language입니다. 모든 변수의 Type이 Compile time에 결정됩니다.
Type은 명시적으로 지정할 수 있지만 대부분의 경우 Compiler가 스스로 추론합니다.
Rust는 변수를 초기화 하지 않으면 사용할 수 없습니다. (let x; 같은 표현은 불가) - Shadowing : 동일한 이름의 변수를 재 선언하여 이전 변수를 "감출 수"(Shadowing) 있습니다.
- Ownership and Lifetimes : Rust 변수는 소유권 규칙을 따릅니다. 이번 글에서는 다루지 않습니다.
Code Example
Rust 1.79.0 (released 2024-06-13)
fn main(){
println!("Hello, world!");
/* variables with print */
// [Error] 변수를 값으로 초기화 해야만 한다.
// let x;
// Rust는 null이 없는 대신에 None과 None을 포함하는 Type인 Option<T>가 존재한다.
// 이 None을 다루는 것은 나중에 알아본다.
let _x: Option<i32> = None;
let x1: i32 = 1; // let과 type을 통해 변수를 선언
let x2 = 2; // compiler가 추측가능한 값이면 type을 선언하지 않아도 됨
println!("{}, {}", x1, x2); // 전통적인 format string
println!("{x1}, {x2}"); // field formating. rust 1.58부터 사용 가능
// [Error] 이런 방식은 지원하지 않음
// println!("{x1+x2}");
println!("{result}", result=x1+x2); // 대신 이런 방식은 지원함.
/* not used variable */
// 사용하지 않는 값이면 underscore를 변수앞에 붙여 warning을 방지할 수 있음.
let _x3 = 3;
/* mutable */
let _x4 = 4; // let으로 선언한 변수
// _x4 = 14; // [Error] rust는 let으로 선언한 것은 기본적으로 값 수정이 불가능하다.
let _x4 = 14; // 하지만 let으로 새로 선언하는 것은 가능.
let mut _x5 = 5; // let mut로 선언한 변수는 수정할 수 있다.
_x5 = 15;
/* const */
// const는 UPPER_SNAKE_CASE로 작성되어야 함. Type도 반드시 명시해야 함.
const _THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
// [Error] const는 mut로 선언할 수 없다.
// const mut _THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
// [Error] const 변수는 재 선언할 수 없다.
// const _THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
// [Error] runtime에 결정되는 변수는 const 변수로 선언할 수 없다.
// const DATA: u32 = get_data();
/* static */
// static 는 const와 비슷.
static _STATIC_VALUE: u32 = 0;
// static mut로 선언할 수 있다. (하지만 그냥 수정할 수는 없다)
static mut _MUT_STATIC_VALUE: u32 = 0;
/* shadowing : scope로 인해 같은 이름의 variable이 가려지는 현상. */
let _x6 = 6;
// rust는 여러 목적으로 code 중간에 이런 block을 생성할 수 있다. 이를 scope라 한다.
{
// let _x6과 _x6 + 10에서 사용된 _x6은 서로 다른 메모리 주소를 가진다.
let _x6 = _x6 + 10;
// 이 이후로 scope 내에서는 밖의 _x6에 접근할 수 없다.
println!("_x6 : {_x6}"); // 16
// scope가 종료. scope안의 _x6은 소멸하고 외부에 있던 _x6에 다시 접근할 수 있다.
}
println!("_x6 : {_x6}"); // 6
// shadowing의 또 다른 예제. let _spaces = _spaces.len(); 에서 좌우 _spaces는 서로 다른 변수임.
let _spaces = " ";
let _spaces = _spaces.len();
}
* reference