Rust, type?

오병진·2022년 7월 8일
0

Learnning Rust

목록 보기
5/7

러스트는 모든 값들에 타입이 존재하며, 타입은 불변합니다.

또한 그리고 타입을 크게 스칼라, 컴파운드 둘로 나눌 수 있습니다.

타입이 명확하지않으면 저번 시간에 했던 if 때처럼 타입에러가 나타납니다.

스칼라 타입

스칼라는 하나의 값으로 표현되는 타입들입니다.
네, 예를 들어 숫자같은 것들이요

정수형

js에서는 number, float
python에서는 int, float

이렇게 간단하지만, 여기서는 아닙니다.

길이SignedUnsigned
8-biti8u8
16-biti16u 16
32-biti32u32
64-biti64u64
archisizeusize

signedinti를 따오고
Unsignedunsigned intu를 따왔네요

그 뒤에 비트수만 붙이면 완성!

arch

이 친구는 사용자의 컴퓨터에 따라 달라집니다!

사용자의 컴퓨터가 32-bit라면 32-bit, 64-bit라면 64-bit!

그렇다면 통상적으로 뭘 써?

i32를 주로 사용합니다.

arch의 경우는 일부 콜렉션 타입의 색인으로 이용된다고 하네요
그러기에 i32가 가장 빠르고 무난합니다.

정수형 리터럴

정수형 리터럴예시
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_0000
Byte (u8 only)b'A'

부동 소수점

Rust에서는 소수를 다루기 위한 부동소수점 숫자를 위한 타입이 존재합니다.
바로 f32f64인데요.

이름처럼 각기 32bit64bit입니다.
기본적으로 f64를 사용하며,
그 이유로는 최신 CPU에서는 둘이 속도가 비슷하면서도 f64가 더 정밀한 표현을 할 수 있기때문입니다.

fn main() {
    let x = 2.0; // f64

    let y: f32 = 3.0; // f32
}

리터럴을 입력할 때에는 IEEE-754를 따르며, 단정밀도와 배정밀도와 대응된다고 볼 수 있습니다.

연산

// 더하기
let sum = 5 + 10;

// 빼기
let difference = 95.5 - 4.3;

// 곱하기
let product = 4 * 30;

// 나누기
let quotient = 56.7 / 32.2;

// 나머지
let remainder = 43 % 5;
}

그리고 당신이 기대하는 다섯가지 기본 연산들이 모두 지원됩니다.
더 많은 연산자들은 추후에 다뤄보도록 하겠습니다.

Bool

역시나 true 또는 falsebool입니다.
전에 다뤘던 if편에서 사용법을 보실 수 있기도합니다.

문자(char)

문자며, 문자열(string)과 혼동하면 안됩니다.
Unicode Scalar를 기반으로 만들어졌기에, 표현을 다양하게 할 수 있지만 반면에 못하는 값들도 존재합니다.

아마 우리가 앞으로 사용할 대부분의 문자들은 허용이 될 거라 예상합니다.

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

문자열도 다루고싶지만, 이는 스칼라 타입이 아니네용

복합 타입

흔히들 말하는 배열, 튜플 뭐 그런 것 들이요.

튜플

튜플은 다양한 타입의 숫자들을 집합시켜 하나의 복합 타입으로 만들 수 있습니다.

let tup: (i32, f64, u8) = (500, 6.4, 1);  

(i32, f64, u8)로 타입을 지정해준 걸 볼 수 있습니다.
이는 단일 값들을 위한 복합 타입이기에 변수에는 전체 튜플이 bind 됩니다. 주소 말고요

튜플 값 받아오기

let tup = (500, 6.4, 1);

let (x, y, z) = tup;

println!("The value of y is: {}", y);

다음과 같이 구조해체를 진행 할 수 있습니다.
js에서의 구조분해할당처럼 말이죠

또한 우리가 흔히 아는 .을 이용한 체이닝으로도 값을 받아 올 수 있습니다.

let tup = (500, 6.4, 1);

let five_hundred = tup.0;

println!("tup.0 is : {}", five_hundred);

배열

아마 저번에도 말했던거처럼 rust를 익힐려는 사람이 뉴비는 아닐겁니다.
자세한 설명은 생략할게요

let a = [1, 2, 3, 4, 5];

let first = a[0];
let second = a[1];

대충 음 heap보단 stack스럽게 쓰고 싶을 때 추천드립니다.
가변적이지 않은 요소이며, 가변적일려면 벡터를 추천드립니다.

추후에 다뤄용 ~ ><

대충 벡터는 유사 집합체로써, 표준 라이브러리에서 제공되며 확장 또는 축소가 가능합니다.
그리고 가변적이고요.

다시 배열로 돌아와서 배열의 인덱스보다 큰 값으로 접근을 한다면..

let a = [1, 2, 3, 4, 5];
let index = 5;

let element = a[index];

println!("element : {}", element);
thread '<main>' panicked at 'index out of bounds: the len is 5 but the index is
 10', src/main.rs:6
note: Run with `RUST_BACKTRACE=1` for a backtrace.

대충 컴파일 시에는 에러가 안나지만, 런타임 에러가 나타납니다.

인덱스를 이용하여 배열에 접근할 경우
배열 길이와 우선적으로 비교하며, 인덱스가 더 클 경우 오류와 함께 종료됩니다.

우린 이를 전문용어로 panic(패닉)이라 하기로 했어요!
패닉을 한다. 라고 보면 됩니다.

유효하지않은 메모리를 가져오는 여타 언어에 비해 에러로 종료를 하니 더 안전하다고 볼 수 있죠

profile
지나가는 사람입니다. 마저 지나갈게요 :D

0개의 댓글