RustBook - 3.2 Data Type

숲사람·2022년 3월 23일
0

Rust

목록 보기
4/15
post-custom-banner

이 시리즈는 Rust Book을 공부하고 정리한 문서입니다. 댓글로 많은 조언 부탁드립니다.
Rust Book: https://doc.rust-lang.org/book/


Rust 는 컴파일 타임에 모든 변수의 타입이 결정되어 있어야만 하는 정적 타입(Statically Typed) 언어이다. 만약 변수 선언시 타입을 명시하지 않으면 컴파일 에러가 발생한다. 다시말하면 이 장에서 소개하는 데이터 타입은 컴파일타임에 이미 크기가 결정 되어있어야하는 타입이다.

요약하면 Rust에서 다음과 같은 데이터 타입을 사용할 수 있다.

  • 스칼라 타입 (Scalar type)
    • Integer
    • Floating point
    • Boolean
    • Character
  • 복합 타입 (Compound type)
    • Tuple
    • Array

또한 변수명에 타입을 지정 할때는 :이후에 타입을 표기한다. 가령 변수 선언시 타입은 변수명: 타입. 함수인자나 표기는 함수명(인자: 타입) . 참고로 함수 리턴 타입은 변수명으르 표기할 필요없기 때문에 : 없이 -> 이후에 그냥 타입만 명시하면 된다.

1. 스칼라 타입 (Scalar type)

하나의 값을 갖는 타입

1.1. Integer

따로 형지정을 하지 않은면 default로 i32이다.

LengthSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

isize usize 타입은 프로그램이 동작하는 컴퓨터 환경이 64bit 아키텍처이면 64bit 크기를 갖고 32bit 아키텍처이면 32bit 크기를 갖는다.

Number literalsExample
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_0000
Byte (u8 only)b'A'

_ 를 값의 중간에 삽입해 가독성을 높힐수도 있다. u8 빼고 모든 값은 type 접미사(suffix) 를 붙일수 있다. 57u8

1.2 Floating point type

  • f32
  • f64

두가지, 따로 명시하지 않는 다면 디폴트는 f64

    let x = 2.0; // f64
    let y: f32 = 3.0; // f32

사칙연산은 같은 타입끼리 가능. 아래는 에러

let x = 0.5 * 7

이렇게 하면 가능

let x = 0.5 * 7f64

값에 접미사 f64 붙이면 형변환이 됨.

1.3 Boolean Type

    let t = true;
    let f: bool = false; // with explicit type annotation

1.4 Character Type

' 로 감싼 문자. ("는 문자열에 사용)

    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = '😻';

Rust의 char타입은 Unicode Scalar를 표현하는 값이고 이는 ASCII 보다 많은 표현을 가능.

2. 복합 타입 (Compound type)

2.1 Tuple Type

여러개의 값이나 타입을 그룹핑한 타입. 길이가 고정되어있어 늘어날 수 없다. 변수에 :(타입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;

2.2 Array Type

튜플과 다르게 배열의 모든 요소는 같은 타입이어야한다. 그리고 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]);
 }
profile
기록 & 정리 아카이브용
post-custom-banner

0개의 댓글