Rust에 포함되어 있는 타입은 크게 스칼라와 컴파운드로 나눌 수 있습니다. 주의할 점은 Rust는 타입이 고정된 언어라는 점입니다. 모든 변수의 타입이 컴파일 시에 반드시 정해져 있어야 합니다. 보통 컴파일러는 우리가 값을 사용하는 지에 따라 타입을 추측할 수 있습니다.
Chapter2에서 String
을 parse
를 사용해 숫자로 변환했던 경우처럼 타입의 선택 폭이 넓은 경우는 반드시 아래의 코드처럼 타입의 명시를 추가해야 합니다.
let guess: u32 = "42".parse().expect("Not a number!");
스칼라는 하나의 값으로 표현되는 타입입니다. 스칼라 타입에는 정수형, 부동소수점 숫자, boolean, 문자로 총 네 가지 타입을 보유하고 있습니다.
정수형은 소숫점이 없는 숫자입니다. 위의 예시 코드에서 u32
타입인 정수형을 사용한 것을 볼 수 있습니다. u32
는 부호 없는 32비트 변수를 나타냅니다. 부호가 있는 타입은 u 대신 i로 시작합니다.
isize
와 usize
타입은 프로그램이 동작하는 컴퓨터 환경이 64-bit 아키텍처이면 64bit를, 32-bit 아키텍처이면 32bit를 갖게 됩니다.
일반적으로 확실하게 정해진 경우가 아니라면 Rust의 기본 값인 i32
을 선택하는 것이 좋습니다. 일반적으로 가장 빠르기 때문입니다. isize
나 usize
는 주로 일부 콜렉션 타입의 색인에 사용됩니다.
byte 리터럴을 제외한 모든 정수형 리터럴은 57u8
과 같은 타입 접미사와 1_000
과 같이 시각적 구분을 위한 _
의 사용을 허용합니다.
Rust의 부동소수점 타입은 f32
와 f64
가 있습니다. 각각 32bit와 64bit 크기를 갖습니다. 기본타입은 f64
입니다.
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
Rust가 지원하는 더하기, 빼기, 곱하기, 나누기 등의 일반적인 기본 수학적 연산은 모든 숫자 타입에 적용됩니다.
fn main() {
// addition
let sum = 5 + 10;
// subtraction
let difference = 95.5 - 4.3;
// multiplication
let product = 4 * 30;
// division
let quotient = 56.7 / 32.2;
// remainder
let remainder = 43 % 5;
}
boolean 타입은 true
와 false
로 둘 중 하나의 값만 가질 수 있으며 bool
로 명시됩니다.
fn main() {
let t = true;
let f: bool = false; // with explicit type annotation
}
char
는 Unicode Scalar를 표현하는 값이며 ASCII 보다 많은 표현이 가능합니다. 억양 표시가 있는 문자, 한국어/중국어/일본어 표의 문자, 이모티콘, 넓이가 0인 공백문자 모두 Rust에서 char타입으로 사용 가능합니다. Unicode Scalar 값의 범위는 U+000
에서 U+D7FF
그리고 U+E000
에서 U+10FFF
를 포괄합니다.
fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '😻';
}
String
이 큰따옴표를 쓰는 반면 char
는 작은따옴표를 쓰는 점을 유의하여야 합니다.
복합 타입들은 다른 타입의 다양한 값들을 하나의 타입으로 묶을 수 있습니다. 복합 타입에는 튜플과 배열이 있습니다.
튜플은 다양한 타입의 여러 숫자를 집합시켜 하나의 복합 타입으로 만드는 일반적인 방법입니다. 튜플에 포함되는 각 값의 타입이 동일할 필요 없이 서로 달라도 되며, 타입 명시는 선택사항입니다.
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}
개별 값을 튜플의 밖으로 빼내오기 위해서는 패턴 매칭을 사용해 튜플의 값을 구조 해체 또는 마침표(.) 뒤에 원하는 값의 인덱스를 넣는 것을 사용할 수 있습니다.
예제1:
fn main() {
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {}", y);
}
결과 : The value of y is: 6.4
예제2:
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;
}
튜플과 다르게 배열의 모든 요소는 모두 같은 타입이어야 합니다. Rust의 배열이 다른 언어들의 배열과 다른 점은 고정된 길이를 갖는다는 점입니다. 한 번 선언되면 크기가 커지거나 작아지지 않습니다.
fn main() {
let a = [1, 2, 3, 4, 5];
}
fn main() {
let a = [1, 2, 3, 4, 5];
let first = a[0];
let second = a[1];
}