const MAX_POINTS : u32 = 100_000;
또한 타입을 명시해야 하고 (위 예제는 unsigned int 32) 가독성을 위해 숫자 사이에도 언더바를 넣을 수 있다. ( 천단위를 콤마로 끊는걸생각해보면 쉽다)
let x = 3;
x = 4; // (X) compile error
let mut x =3;
x= 4 //(O) x is mutable
let x = 4;
let x = x+1; // 5
let x = x*2; // 10
위에 선언된 x가 아래쪽에 선언된 x에 의해 가려지고 있다.
마지막줄까지 실행된 후 x의 값은 10이다.
쉐도잉은 이전에 선언한 변수의 내용이 다음에 재정의된 변수로 가려지는 것을 의미한다.
//SHADOWING (O)
let space = " "; // String 타입
let space = space.len(); // u32 타입
//mut variable (X)
let mut space = " ";
space = space.len(); // space의 타입이 변경되었으므로 compile error
크게 scalar type 과 compound type으로 나눈다.
rust에서 정의되는 모든 값은 특정한 data type을 가지고 있다.
rust는 compile time에 data type이 모두 정해져야한다. 이를 statically typed language라고 한다. python 같은 스크립트 언어는 타입을 런타임에 정하니까 dynamically typed language로 생각하면 되겠다.
근데 let x = 32; 처럼 그냥 쓰는 이유는 컴파일러가 값을 통해 타입추론을 하기 때문에 명시하지 않아도 되는 것이다.
아래 예제는 parse함수를 통해 "42"를 u32로 바꾸는 예제이다."42" parse()함수를 통해 다양한 타입으로 변환 될 수 있다. 따라서 어떤 타입으로 변환할건지 명시를 꼭 해주어야한다. 왜냐면 안그러면 컴파일러가 헷갈려서 오류를 발생시킨다.
let guess : u32 = "42".parse().expect("Not a Number");
scalar type 은 rust에서 단일 값(single value)를 나타낸다.
rust는 4가지 primary scalar type 이 있다. (integers/floating-point numbers/Booleans/Characters)
Length | Signed | Unsigned |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
부호있는 정수는 2의 보수를 사용하여 데이터를 저장한다.
arch는 컴퓨터 architecture 에 따른 비트수라서 32비트 컴퓨터 사용하면 32bit 이고 64bit 컴퓨터 사용하면 64bit이다.
Number literals | Example |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte (u8 only) | b'A' |
57u8 처럼 u8이라는 타입 지정자를 사용하거나, 10_000(10000) 같은 visual separator를 사용할 수 있다.
기본적으로는 i32 = int 32bit 를 사용하는걸 권장한다. 가장빠름
-자세한건 부동소수점 방식인 IEEE 754를참고하자.
true / false 로 이루어진 값이다.
1 byte 의 크기를 가진다. =8bit, int가 32 or 64 bit를 가지는것에 비해 대조적으로 작다.
fn main(){
let t = true; // bool true
let f : bool = false; //bool false , : bool 이라고 타입을 명시
character literal 은 single quote로 둘러 싸인다. ' '
String literal 은 double quote로 둘러 싸인다. " "
rust는 char type에 4byte를 할당한다.
rust의 character는 Unicode값을 나타낸다. ASCII 보다 더 넓은 값을 표현 가능하다.
Compound Type(복합 타입) 이라는 말 그대로 여러개의 값을 하나의 타입으로 그룹화 해놓은 것을 의미한다.
Rust에는 2개의 primitive compund type을 제공한다.
이는 튜플 (Tuple) 과 어레이(Array) 이다.
튜플은 여러개의 값을 하나의 타입으로 묶는것이다.
이렇게만 말하면 무슨소린지 모르겠지만 예를들어
1, 'C', "bluebird" 라는 각각 u32, char, String 타입의 자료가 있다고 해보자. 그렇다면 튜플은 이를 ( )안에 묶은
(1, 'C', "bluebir") 로 표현할 수 있다.
러스트는 정적 타입 언어이다. 따라서 튜플로 묶는다면 어떤 타입을 모아 묶어놓은 튜플인지 명시해주어야 한다. 아래코드를 보면
fn main(){
let tup : (i32, f64, u8) = (500, 6.4, 1);
}
과 같은데 tup 이라는 튜플이 i32(int 32bit), f64(float 64bits), u8(unsigned int 8bit) 로 이루어진 튜플임을 명시해주고 있다.
fn main(){
let tup = (500, 6.4, 1);
let (x,y,z) = tup;
println!("y : {}" , y);
}
(500, 6.4, 1) 인 튜플의 값을 각각 x ,y ,z 로 이루어진 튜플에 대응시키고 그 값을 꺼내왔다.
또다른 방법으로는 .(period) 를 사용해서 인덱싱해 꺼내오는 것이다.
fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;
}
스택보다 힙에 데이터를 할당하고 싶을떄 유용하다.
고정된 길이의 요소를 가짐을 보장하고 싶을떄, 가변길이는 vector
let months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
예를들어 1년이 12개의 달로 이루어짐을 알고있고 이는 불변함으로 위와같이 배열에 저장할 수 있다.
[i32; 5]
i32형 5개를 저장하는걸 나타낸다.