러스트에서의 데이터는 정적이다. 러스트에는 두 가지 타입이 존재한다: scalar와 compound에 관해 알아보자. 러스트는 정적인 언어이기 때문에, 컴파일 단계에서 타입을 알고 있어야 한다.
scalar
는 하나의 값으로 표현되는 타입이다. Rust는 정수형, 부동소수점 숫자, boolean, 그리고 문자, 네 가지 scalar
타입을 보유하고 있다.
정수형은 소수점이 없는 숫자이다. 각 signed
숫자는 부터 까지 표현이 가능하다. 각 unsigned
숫자는 0에서 까지의 숫자가 표현 가능하다.
Rust에도 부동소수점을 표현하는 두 가지 기본 타입 f32
와 f64
가 있다. 기본 타입은f64
이다. 최신 CPU에서는 32비트와 64비트 연산하는 속도가 별 차이 없지만, 정확도는 훨씬 높아지기 때문이다.
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
대부분의 다른 언어들처럼, true
, false
값을 가질 수 있다.
char
타입은 Unicode Scalar를 표현하는 값이고, 이는 ASCII 보다 많은 표현을 가능하게 한다. "문자"는 Unicode를 위한 개념이 아니기 때문에, 인간적 직관에 따른 "문자"와 동일하지 않을 수 있다.
복합 타입들은 다른 타입의 다양한 값들을 하나의 타입으로 묶을 수 있다. 대표적인 예로 tuples
과 arrays
가 있다.
튜플에 포함되는 각 값이 타입은 동일할 필요 없이 서로 달라도 된다. 타입 명시는 선택 사항이다.
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {}", y); // 6.4
println!("The value of first element is: {}", tup.0); // 500
}
배열을 구성하는 모든 element는 같은 타입을 가져야 하며, 배열의 크기는 고정이다. element의 타입 명시는 선택 사항이다.
// 타입을 명시한 리스트
let a: [i32; 5] = [1, 2, 3, 4, 5];
// 3으로 5개가 채워진 리스트
let a = [3; 5]; // [3, 3, 3, 3, 3]
이 코드는 인덱스를 벗어난 숫자를 입력한 경우 panic이 일어난다.
use std::io;
fn main() {
let a = [1, 2, 3, 4, 5];
println!("Please enter an array index.");
let mut index = String::new();
io::stdin()
.read_line(&mut index)
.expect("Failed to read line");
let index: usize = index
.trim()
.parse()
.expect("Index entered was not a number");
let element = a[index];
println!("The value of the element at index {index} is: {element}");
}