[Chapter3-2] Rust 데이터 타입

hwwwa·2021년 10월 28일
0

🦀 Rust

목록 보기
5/25
post-thumbnail

데이터 타입

Rust에 포함되어 있는 타입은 크게 스칼라와 컴파운드로 나눌 수 있습니다. 주의할 점은 Rust는 타입이 고정된 언어라는 점입니다. 모든 변수의 타입이 컴파일 시에 반드시 정해져 있어야 합니다. 보통 컴파일러는 우리가 값을 사용하는 지에 따라 타입을 추측할 수 있습니다.

Chapter2에서 String을 parse를 사용해 숫자로 변환했던 경우처럼 타입의 선택 폭이 넓은 경우는 반드시 아래의 코드처럼 타입의 명시를 추가해야 합니다.

let guess: u32 = "42".parse().expect("Not a number!");

스칼라 타입

스칼라는 하나의 값으로 표현되는 타입입니다. 스칼라 타입에는 정수형, 부동소수점 숫자, boolean, 문자로 총 네 가지 타입을 보유하고 있습니다.

정수형

정수형은 소숫점이 없는 숫자입니다. 위의 예시 코드에서 u32 타입인 정수형을 사용한 것을 볼 수 있습니다. u32는 부호 없는 32비트 변수를 나타냅니다. 부호가 있는 타입은 u 대신 i로 시작합니다.

![](https://velog.velcdn.com/images%2Finhwa1025%2Fpost%2F4073b12f-f1e9-4558-808a-5a8b176da57b%2Fimage.png)

isize와 usize타입은 프로그램이 동작하는 컴퓨터 환경이 64-bit 아키텍처이면 64bit를, 32-bit 아키텍처이면 32bit를 갖게 됩니다.
일반적으로 확실하게 정해진 경우가 아니라면 Rust의 기본 값인 i32을 선택하는 것이 좋습니다. 일반적으로 가장 빠르기 때문입니다. isize나 usize는 주로 일부 콜렉션 타입의 색인에 사용됩니다.

![](https://velog.velcdn.com/images%2Finhwa1025%2Fpost%2F669a4adb-21ad-46f4-a3b2-ae5a535e0d3a%2Fimage.png)

byte 리터럴을 제외한 모든 정수형 리터럴은 57u8과 같은 타입 접미사와 1_000과 같이 시각적 구분을 위한 _의 사용을 허용합니다.

부동 소수점 타입

Rust의 부동소수점 타입은 f32f64가 있습니다. 각각 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 타입

boolean 타입은 truefalse로 둘 중 하나의 값만 가질 수 있으며 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];
    }
  • 유효하지 않은 배열 요소에 대한 접근 만약 배열의 끝을 넘어선 요소에 접근하려 한다면 컴파일 시에는 아무런 에러도 발생되지 않지만 프로그램의 결과는 실행중에 에러가 발생했고 성공적으로 종료되지 못했다고 나옵니다. 인덱스를 사용해 요소에 접근하려 하면 Rust는 지정한 인덱스가 배열 길이보다 작은지 확인합니다. 인덱스가 길이보다 길다면 Rust는 프로그램이 오류와 함께 종료되는 패닉(panic)이 됩니다. 이는 Rust의 안전 원칙이 동작하는 예입니다. 유효하지 않은 메모리에 엑세스를 허용하지 않고 즉시 종료하여 오류로부터 사용자를 보호합니다.

0개의 댓글