러스트는 모든 값들에 타입이 존재하며, 타입은 불변합니다.
또한 그리고 타입을 크게 스칼라
, 컴파운드
둘로 나눌 수 있습니다.
타입이 명확하지않으면 저번 시간에 했던 if
때처럼 타입에러가 나타납니다.
스칼라는 하나의 값으로 표현되는 타입들입니다.
네, 예를 들어 숫자같은 것들이요
js
에서는 number
, float
python
에서는 int
, float
이렇게 간단하지만, 여기서는 아닙니다.
길이 | Signed | Unsigned |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u 16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
arch | isize | usize |
signed
면 int
의 i
를 따오고
Unsigned
면 unsigned int
의 u
를 따왔네요
그 뒤에 비트수만 붙이면 완성!
이 친구는 사용자의 컴퓨터에 따라 달라집니다!
사용자의 컴퓨터가 32-bit라면 32-bit, 64-bit라면 64-bit!
i32
를 주로 사용합니다.
arch의 경우는 일부 콜렉션 타입의 색인으로 이용된다고 하네요
그러기에 i32
가 가장 빠르고 무난합니다.
정수형 리터럴 | 예시 |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte (u8 only) | b'A' |
Rust에서는 소수를 다루기 위한 부동소수점 숫자를 위한 타입이 존재합니다.
바로 f32
와 f64
인데요.
이름처럼 각기 32bit
와 64bit
입니다.
기본적으로 f64
를 사용하며,
그 이유로는 최신 CPU에서는 둘이 속도가 비슷하면서도 f64
가 더 정밀한 표현을 할 수 있기때문입니다.
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
리터럴을 입력할 때에는 IEEE-754
를 따르며, 단정밀도와 배정밀도와 대응된다고 볼 수 있습니다.
// 더하기
let sum = 5 + 10;
// 빼기
let difference = 95.5 - 4.3;
// 곱하기
let product = 4 * 30;
// 나누기
let quotient = 56.7 / 32.2;
// 나머지
let remainder = 43 % 5;
}
그리고 당신이 기대하는 다섯가지 기본 연산들이 모두 지원됩니다.
더 많은 연산자들은 추후에 다뤄보도록 하겠습니다.
역시나 true
또는 false
인 bool
입니다.
전에 다뤘던 if편에서 사용법을 보실 수 있기도합니다.
문자며, 문자열(string)과 혼동하면 안됩니다.
Unicode Scalar
를 기반으로 만들어졌기에, 표현을 다양하게 할 수 있지만 반면에 못하는 값들도 존재합니다.
아마 우리가 앞으로 사용할 대부분의 문자들은 허용이 될 거라 예상합니다.
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '👍';
문자열도 다루고싶지만, 이는 스칼라 타입이 아니네용
흔히들 말하는 배열, 튜플 뭐 그런 것 들이요.
튜플은 다양한 타입의 숫자들을 집합시켜 하나의 복합 타입으로 만들 수 있습니다.
let tup: (i32, f64, u8) = (500, 6.4, 1);
(i32, f64, u8)
로 타입을 지정해준 걸 볼 수 있습니다.
이는 단일 값들을 위한 복합 타입이기에 변수에는 전체 튜플이 bind
됩니다. 주소 말고요
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {}", y);
다음과 같이 구조해체를 진행 할 수 있습니다.
js
에서의 구조분해할당처럼 말이죠
또한 우리가 흔히 아는 .
을 이용한 체이닝으로도 값을 받아 올 수 있습니다.
let tup = (500, 6.4, 1);
let five_hundred = tup.0;
println!("tup.0 is : {}", five_hundred);
아마 저번에도 말했던거처럼 rust
를 익힐려는 사람이 뉴비는 아닐겁니다.
자세한 설명은 생략할게요
let a = [1, 2, 3, 4, 5];
let first = a[0];
let second = a[1];
대충 음 heap
보단 stack
스럽게 쓰고 싶을 때 추천드립니다.
가변적이지 않은 요소이며, 가변적일려면 벡터
를 추천드립니다.
추후에 다뤄용 ~ ><
대충 벡터는 유사 집합체로써, 표준 라이브러리에서 제공되며 확장 또는 축소가 가능합니다.
그리고 가변적이고요.
다시 배열로 돌아와서 배열의 인덱스보다 큰 값으로 접근을 한다면..
let a = [1, 2, 3, 4, 5];
let index = 5;
let element = a[index];
println!("element : {}", element);
thread '<main>' panicked at 'index out of bounds: the len is 5 but the index is
10', src/main.rs:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.
대충 컴파일 시에는 에러가 안나지만, 런타임 에러가 나타납니다.
인덱스를 이용하여 배열에 접근할 경우
배열 길이와 우선적으로 비교하며, 인덱스가 더 클 경우 오류와 함께 종료됩니다.
우린 이를 전문용어로 panic(패닉)
이라 하기로 했어요!
패닉을 한다. 라고 보면 됩니다.
유효하지않은 메모리를 가져오는 여타 언어에 비해 에러로 종료를 하니 더 안전하다고 볼 수 있죠