rust의 공식 문서를 참조해 작성함 https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html
변수는 기본적으로 immutable 이지만 그러나 mut
선언을 해주면 바뀔 수 있다.
fn main() { let mut x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); }
러스트에서 상수는 다른 언어와 같이 불변, const
를 통해 선언
선언 시 변수나 다른 컴파일 시에 변할 수 있는 값을 통해서는 선언할 수 없다.
주로 대문자로 변수명을 설정한다.
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
러스트는 변수의 쉐도잉을 지원한다.
fn main() { let x = 5; let x = x + 1; //shadowing x= 5+1= 6 { let x = x * 2; //두번째 shawdowing x = 6*2 =12 println!("The value of x in the inner scope is: {}", x); } // scope안의 x가 밖으로 나가서 x는 다시 6 println!("The value of x is: {}", x); }
Output
The value of x in the inner scope is: 12
The value of x is: 6
Mut
와의 차이점은 변수 타입을 바꿀 수 있다는 점이며 쉐도잉을 통해 변수명을 재사용할 수 있다는 장점이 있다.
러스트는 statically typed language 로 컴파일러는 컴파일을 할 시점에 존재하는 모든 변수의 type을 알아야 한다. 단일 변수를 나타내는 scalar와 다수의 변수들이 묶여있는 compound data type이 있다.
크게 부호가 있는 signed Integer와 없는 unsigned로 나뉘며 각각 i,u로 표현한다. 나타낼 수 있는 범위는 8-bit에서 128-bit까지로 i8
, i128
로 선언한다.
디버그 모드일 때 overflow가 나타난다면 panic과 함께 멈추지만 release 플래그로 컴파일하고 있다면 two’s complement wrapping으로 값이 0부터 다시 시작한다. 예를 들어, 0에서 255까지의 범위를 저장할 수 있는 u8
type에서 256은 0, 257은 1로 바뀐다.
floting type에는 f32
, f64
두 개가 있으며 둘 다 signed이며 둘의 속도 차이는 거의 없다고 한다. 디폴트는 f64
이다.
bool
로 선언되는 true, false를 표현할 수 있는 타입이며 크기는 1바이트이다.
러스트의 char
타입은 아스키가 아닌 Unicode Scalar Value로 표현되며 크기는 4바이트이다.
fn main() { let c = 'z'; let z = 'ℤ'; let heart_eyed_cat = '😻'; }
compound type은 다수의 값들을 한 타입으로 표현할 수 있으며 러스트의 compound 타입에는 tuple과 array가 있다.
fn main() { let tup: (i32, f64, u8) = (500, 6.4, 1); let (x, y, z) = tup; // destructuring, let six_point_four = tup.1; }
tuple은 다양한 타입의 변수들을 묶을 때 사용되며 한번 선언되면 길이가 바뀔 수 없다. Destructing이나 .
을 통한 인덱싱을 통해 변수를 가져올 수 있다.
tuple과 달리 array 타입은 같은 타입의 변수들만 묶을 수 있으며 다른 언어와 달리 길이가 고정되 있는 type이다. array 타입의 데이타는 stack 영역에 저장된다.
fn main() { let a = [1, 2, 3, 4, 5]; let a: [i32; 5] = [1, 2, 3, 4, 5]; //i32타입의 정수 5개 let a = [3; 5]; // [3,3,3,3,3] }
array 안의 각각의 값들은 인덱싱을 통해 얻을 수 있고 만약 범위 밖의 값을 인덱싱하게 되면 panic 에러를 일으킨다.