이 시리즈는 Rust Book을 공부하고 정리한 문서입니다. 댓글로 많은 조언 부탁드립니다.
Rust Book: https://doc.rust-lang.org/book/
Rust 는 컴파일 타임에 모든 변수의 타입이 결정되어 있어야만 하는 정적 타입(Statically Typed) 언어이다. 만약 변수 선언시 타입을 명시하지 않으면 컴파일 에러가 발생한다. 다시말하면 이 장에서 소개하는 데이터 타입은 컴파일타임에 이미 크기가 결정 되어있어야하는 타입이다.
요약하면 Rust에서 다음과 같은 데이터 타입을 사용할 수 있다.
또한 변수명에 타입을 지정 할때는 :
이후에 타입을 표기한다. 가령 변수 선언시 타입은 변수명: 타입
. 함수인자나 표기는 함수명(인자: 타입)
. 참고로 함수 리턴 타입은 변수명으르 표기할 필요없기 때문에 :
없이 ->
이후에 그냥 타입만 명시하면 된다.
하나의 값을 갖는 타입
따로 형지정을 하지 않은면 default로 i32
이다.
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 |
isize
usize
타입은 프로그램이 동작하는 컴퓨터 환경이 64bit 아키텍처이면 64bit 크기를 갖고 32bit 아키텍처이면 32bit 크기를 갖는다.
Number literals | Example |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte (u8 only) | b'A' |
_
를 값의 중간에 삽입해 가독성을 높힐수도 있다. u8 빼고 모든 값은 type 접미사(suffix) 를 붙일수 있다. 57u8
두가지, 따로 명시하지 않는 다면 디폴트는 f64
let x = 2.0; // f64
let y: f32 = 3.0; // f32
사칙연산은 같은 타입끼리 가능. 아래는 에러
let x = 0.5 * 7
이렇게 하면 가능
let x = 0.5 * 7f64
값에 접미사
f64
붙이면 형변환이 됨.
let t = true;
let f: bool = false; // with explicit type annotation
'
로 감싼 문자. ("
는 문자열에 사용)
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '😻';
Rust의 char타입은 Unicode Scalar를 표현하는 값이고 이는 ASCII 보다 많은 표현을 가능.
여러개의 값이나 타입을 그룹핑한 타입. 길이가 고정되어있어 늘어날 수 없다. 변수에 :(타입1, 타입2, ..)
으로 선언할 수 있다.
let tup: (i32, f64, u8) = (500, 6.4, 1);
만약 튜플의 개별 값을 얻으려면
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {}", y);
.
+ <인덱스 번호> 를 사용해 얻을 수도 있다.
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 의 배열도 튜플처럼 크기가 고정된다. 동적으로 늘릴수 없다. 배열의 값은 문자열이 될수도 있음.
let a = [1, 2, 3, 4, 5];
[
로 감싸로,
로 구분
배열은 데이터를 heap 이 아닌 stack 에 할당한다. (4장 참고 ) 기본적으로 컴파일타임에 Stack, 런타임에 는 Heap에 할당.
크기를 늘리거나 줄이기위해서는 vector
타입을 사용한다. (8장 참고)
let 배열명: [타입; 배열 크기]
로 선언하고 [
로 값을 쓸 수 있다.
let a: [i32; 5] = [1, 2, 3, 4, 5];
모든 값이 3인 크기가 5인 배열을 선언하려면
let a = [3; 5];
let a = [3, 3, 3, 3, 3];
와 동일
값은 a[0] a[1] 와 같이 인덱싱하여 얻을 수 있다.
let first = a[0];
let second = a[1];
만약 배열크기를 넘어가는 indexing을 한다면 컴파일 타임에 에러는 발생하지 않지만, 런타임에 에러가 발생함을 주의.
fn main() {
let a = [1, 2, 3, 4, 5];
let index = 10;
let element = a[index];
println!("The value of element is: {}", element);
}
런타임 에러
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:11:64
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
다음과 같이 배열의 크기를 Run Time에 할당하는 것은 컴파일 타임에 에러가 발생한다. array는 컴파일타임에 스택에 할당되어야 하기 때문이다.
fn main() {
let x = 5;
let a: [i32; x] = [1,2,3,4,5];
println!("test {}", a[4]);
}