본문 바로가기
2. Back-end/>> Rust

반드시 알아야 하는 Data types! 오잉? Tuple type 있네?

by 블록메타 2023. 1. 18.
SEMONAN

Rust의 Data type에 대해서  공부 해볼 건데요, C++ 과 분명히 다름점이 있습니다. 

 

128bit 정수형 type, isize를 통한 Architecture에 따른 가변형 type, 그리고 tuple type도 있습니다. 

이렇게 C++과 다른접이 있으니 끝까지 따라와 주세요. 

 

Programming language를 배울 때, Data type은 꼭 알아야 합니다. 

 

Rust에는 크게 Scalar, Compound 2종류의 Data type이 있고,  Rust는 statically language (고정된 타입의 language) 이기 때문에, Compile time에서 모든 변수의 type을 알수가 있습니다. 

 

예제 코드를 통해서 살펴 봅시다.

guess라는 변수에 "42" 문자열을 parse()를 통해서 숫자로 변경해서 guess 변수에 넣습니다. guess 변수의 type은 u32로 명확히 했습니다. 이런 경우, 정상적으로 빌드 됩니다. 

 

parse()는 정수형 type을 리턴하고, guess도 정수형 type이르모 문제가 없습니다. 그런데, u32를 없애고 빌드하면 Error가 발생합니다. 왜냐하면 parse()는 정수형을 리턴할 수도 있고, 실수형을 리턴할 수도 있습니다.  Rust는 Data type이 명확해야 하는데, parse()가 정수형을 리턴할지 실수형을 리턴할지 Compile time에서 알 수 없기 때문에 Error 발생합니다. 

 

여기서 중요 포인트는 Compile time에서 불명확한 Data type을 체크하여 알려준다는 것입니다.   그래서 Compile time에서 오류를 알려주는 부분은 매우 유용합니다. 

 

다음은 Scalar type을 살펴 봅시다. 

Scalar Types

Rust는 크게 4가지 Scalar type을 가지고 있습니다. Integers, Floating-point numbers, Boolean, Characters 

입니다. 

 

먼저, Integer type을 보시죠. 표를 보면, C++과 동일하게 Signed와 Unsigned가 나누어져 있습니다. 

Signed는 i를 사용하고, Unsigned는 u를 사용합니다. 

8bit integer의 경우 Signed는 i8이고, Unsigned는 u8입니다. 

 

변수의 Length도 8, 16, 32, 64 bit가 있고 이것은 c++과 동일하구요, Rust에서는 128bit도 있으므로, 훨씬 더 큰 수를 한 변수에 저장할 수 있습니다.  Unsigned의 경우 0 ~ 2^128-1 까지 사용할 수 있습니다. 

 

arch type은 Signed와 Unsigned가 있고, 32bit architecture이면 32 bit가 되고, 64bit architecture이면 64bitr가 됩니다.

그리고 가독성을 좋게 하기 위한 number literal이 있습니다.  57u8은 Unsigned 8bit의 숫자 57이 되는 것이고, 그리고 더 특이한 것은 _를 사용하여 숫자를 끊어서 코딩 할 수 있습니다.  숫자가 길면 단위를 세기가 어렵잖아요. 그런 경우에 이렇게 _바를  넣을 수 있는거죠.

 

1_000 = 1000 입니다. 

Binary는 Ob로 시작하는데 Binary도 긴 경우가 많아서 _가 유용합니다. 

그리고, Byte(u8 only)는 b'A'로 코딩 할 수 있습니다. 

 

다음은 Integer overflow에 대해서 살펴 봅시다. 

 

c++은 unit8의 경우 0~255까지 표현 가능한데, 255에서 +1하면 overflow발생하여 0이 됩니다. overflow를 의도할 수도 있지만, 의도하지 않는 경우가 대부분이며, c++의 경우 Compile time에서 overflowㄹ르 감지할 수 없습니다. 

 

그러나 Rust는 Debug모드로 빌드 할 경우 Compile time에서 overflowㄹ르 체크하여 알려줍니다. Release 모드에서는 overflow를 체크하지 않습니다. 

 

Rust에 이런 특징이 있다는 것을 알고 사용하면 더 좋겠죠?

 

Floating-point types은 f32(32bit), f64(64bit)가 있고 c++과 동일하다고 생각할 수 있습니다. 

Floating-point type 변수를 만들 때 f32/f64를 지정하지 않으면, 기본적으로 f64로 생성됩니다. 

 

다음은 Numeric operations입니다. 

Numeric operations도 C++과 동일합니다. 

+ - * / % 연산을 할 수 있으며, /의 소수점은 버림 됩니다.    (* %는 Mod 연산자)

 

Boolean type(불리언타입) 은 다른 언어와 마찬가지로 true, false를 사용할 수 있습니다. 

Character type은 C++과 다르게 특이점이 있습니다. 

C++에서는 char은 1byte를 사용하지만 Rust의 char은 4byte를 사용합니다. 

4byte를 통하여 ASCII뿐만 아니라, 중국어/일본어/한국어 등 다국어를 저장할 수 있고, emoji같은 아모티콘도 저장할 수 있습니다. 

Character type이 4byte unicode로 개발된 점은 시대의 흐름에 맞게 잘 개선된 것 같습니다. 

 

Compound typedms  Tuple, Array가 있는데, 먼저 Tuple type을 알아봅시다. 

 

여러 개의 값을 그룹화하여 Tuple type으로 만들 수 있는데, 각 값은 다른 type을 가질 수 있습니다. 

 

예제 소스코드에서, (500, 6.4, 1)의 각 Element는 (i32, f64, u8)로 타입이 다른데, 이것을 tup에 담고 있습니다.  Tuple의 size는 변경될 수 없습니다. 

 

 

Tuple을 각 Scalar 변수로 쪼개는 예제 소스코드를 봅시다. 

(500, 6.4, 1)을 가지고 있는 tup를 x, y, z의 각 scalar 변수에 쪼개서 담고 있습니다.  이렇게 되면 변수 x에는 500이 들어가고, y에는 6.4, z에는 1이 들어갑니다. 

Tuple의 각 Element에 접근하는 방법을 알아 봅시다. 

 

x.0은 index 0에 접근하는 것이고(값 500), x.2는 index 2에 접근하는 것입니다. (값 1)

Tuple의 Element에 접근하는 방법은 .Index입니다. 

 

Array type을 알아봅시다. Array type은 여러 값을 묶어서 사용할 수 있는데 모든 값은 동일한 Type 이여야 합니다. 

a에 담겨 있는 1,2,3,4,5는 모두 같은 Type 입니다. 

 

Array의 Length는 고정이라 변경 될 수 없습니다. 

아래 코드는 i32 type이고, Length가 5인, a 라는 Array를 만드는데 그 안의 값은 1,2,3,4,5 입니다. 

숫자 3이 5개 들어 있는 Array를 생성합니다. 

[3; 5]; 와 [3,3,3,3,3];는 같습니다. 

 

Array의 Index에 접근하는 방법은 [Index]로 할 수 있습니다. (C++와 동일)

 

 

지금까지 Rust의 Data types에 대하여 공부했습니다. 단일 값는 Scalar type, 여러 값은 Compound type을 알아 보았습니다. 

도움 되시길 바랍니다. 

 

 

 

Reference

https://www.youtube.com/watch?v=CQB7JGsY-VM&list=PLdvEO-IMMcPvfiBkVwgIwDf4AuTjI2aeG&index=3

댓글