본문 바로가기
RUST

꼭꼭 씹어먹는 러스트 - 2 데이터 유형

by IT너구리실장 2024. 5. 28.
반응형


# Data Types

  • Rust의 모든 값은 특정 데이터 유형이 지정되어 있음
  • 아래 예시와 같이, 변수명 옆에 `: u32` 와 같이 type annotaion 써야 함

  • 데이터 유형은 Scalar Types, Compound Types 두 가지로 나뉜다.

## Scalar Types

  • 단일 값을 나타낸다.
  • integers, floating-point, Booleans, characters 4가지 타입이 있다.

### Integer Types

  • 정수(Integer)는 명시적인 크기와 부호의 유무에 따라 i, u로 구분한다.

ref. https://doc.rust-lang.org/book/ch03-02-data-types.html

  • 위에서 사용한 `u32` 는 `32비트 공간을 차지하는 부호 없는 정수`이다. ( i 인 경우 부호 있는)
  • `arch` 는 컴퓨터의 아키텍처에 따라 달라진다. 64비트 아키텍처를 사용하는 경우 64비트, 32비트 아키텍처를 사용하는 경우 32비트

ref. https://doc.rust-lang.org/book/ch03-02-data-types.html

  • 위 표와 같이 다양 형식으로 정수 리터럴 작성 가능
  • type suffix : `57u8`처럼 타입 접미사를 붙여 타입을 지정할 수 있다.
  • visual separator : 숫자를 읽기 쉽게 하기 위해 `_`를 시각적 구분자로 사용할 수 있다. `1000` 은 `1_000`과 동일한 값을 같는다.
  • 어떤 유형의 정수를 사용할지 확실하지 않다면, 정수 타입의 기본값인 `i32` 사용을 추천한다. 
  • `isize` 또는 `usize`는 어떤 종류의 컬렉션을 인덱싱할 때 사용

### Floating-Point Types

  • Rust는 소수점이 있는 숫자를 나타내기 위해 `f32` 와 `f64` 두 가지 타입을 가지고 있고, 각각 32비트와 64 비트 크기를 갖는다.
  • 기본 타입은 `f64`이다. 현대 CPU에서 `f32`와 속도가 거의 같기 때문에 더 정밀한 `f64`를 사용한다.
  • 모든 floating-point types 은 부호가 있다.

rustrover 에서 기본 타입을 표시해준다.


### Numeric Operations

  • Rust는 모든 숫자 타입에 대해 기본적인 수학 연산을 지원한다.
  • 정수 나눗셈은 0 밑으로 버림


### The Boolean Type

  • `bool` 타입의 크기는 1byte이며  `true` 와 `false` 두 가지 값을 가질 수 있다.


### The Character Type

  • `char` 타입은 4byte의 크기로 유니코드 스칼라 값을 나타낸다.
  • `char` 타입의 리터럴은 문자열 리터럴과 달리 작은따옴표를 사용한다.

 


## Compound Types

  • 복합 타입은 여러 값을 하나의 타입으로 그룹화할 수 있습니다.
  • Rust에는 두 가지 기본 복합 타입이 있습니다 tuples, arrays

### Tuple Type

  • 튜플(tuple)은 다양한 타입의 여러 값을 하나의 복합 타입으로 그룹화하는 일반적인 방법

  • 튜플은 고정된 길이를 가지며, 한 번 선언되면 크기를 늘리거나 줄일 수 없습니다.
  • 튜플을 생성하려면 괄호 안에 쉼표로 구분된 값 목록을 작성합니다. 튜플의 각 위치는 타입을 가지며, 튜플 내의 값들의 타입은 동일할 필요가 없습니다. 

  • 변수 tup는 전체 튜플을 바인딩합니다.
  • 튜플의 개별 값을 가져오려면 패턴 매칭을 사용하여 튜플 값을 구조 분해할 수 있습니다.

  • 튜플 요소에 직접 접근하려면 점(.)과 원하는 값의 인덱스를 사용합니다. 

tuple x를 생성하고 각 인덱스(0부터 시작)로 원소에 접근 (예시 x.0, x.1, x.2)

  • 값이 없는 튜플은 특별히 "unit"이라고 불리며, 이 값과 해당 타입은 모두 ()로 작성되며 빈 값 또는 빈 반환 타입을 나타냅니다. 표현식이 다른 값을 반환하지 않으면 암시적으로 유닛 값을 반환합니다.

### Array Type

  • 배열(array)은 튜플과 달리 배열의 모든 요소는 동일한 타입이어야 합니다.
  • Rust의 배열은 고정된 길이를 가집니다.
  • 배열의 값을 생성하려면 대괄호 안에 쉼표로 구분된 값 목록을 작성합니다:

  • 배열은 데이터를 스택에 할당할 때 유용하며, 항상 고정된 수의 요소를 갖는다는 것을 보장하고자 할 때 사용됩니다.
  • 배열은 벡터 타입만큼 유연하지 않습니다. 벡터는 크기를 늘리거나 줄일 수 있는 표준 라이브러리에서 제공하는 유사한 컬렉션 타입입니다.
  • 배열을 사용할지 벡터를 사용할지 확신이 서지 않는 경우, 벡터를 사용하는 것이 좋습니다.
  • 요소의 수가 변경되지 않을 것을 알고 있을 때 배열이 더 유용합니다. 예를 들어, 프로그램에서 월의 이름을 사용할 때는 항상 12개의 요소를 가질 것이므로 배열을 사용하는 것이 좋습니다

  • 배열의 타입을 작성하려면 대괄호 안에 각 요소의 타입과 세미콜론, 그리고 배열의 요소 수를 작성합니다. 

i32는 각 요소의 타입입니다. 세미콜론 뒤의 숫자 5는 배열이 5개의 요소를 포함하고 있음을 나타냅니다.

  • 배열을 초기화할 때 각 요소가 동일한 값을 가지도록 하려면 초기 값을 지정하고 세미콜론으로 구분한 후 대괄호 안에 배열의 길이를 작성할 수 있습니다:

let a = [3, 3, 3, 3, 3] 과 동일

  • 배열 요소 접근
    • 배열은 고정된 크기의 메모리 덩어리로 스택에 할당될 수 있습니다. 배열 요소에 접근하려면 인덱싱을 사용합니다.
    • first라는 변수는 인덱스 [0]의 값인 1을 얻습니다. second라는 변수는 인덱스 [1]의 값인 2를 얻습니다.
  • 유효하지 않은 배열 요소 접근
    • 배열의 끝을 벗어난 요소에 접근하려고 하면 어떻게 되는지 알아봅시다.
    • 이 코드를 실행하고 0, 1, 2, 3 또는 4를 입력하면 프로그램은 배열의 해당 인덱스에 있는 값을 출력합니다. 하지만 10과 같이 배열의 끝을 벗어나는 숫자를 입력하면 다음과 같은 출력이 나타납니다
    • 유효하지 않은 값을 사용하여 인덱싱 작업을 수행하는 시점에서 런타임 오류를 발생시켰습니다. 프로그램은 오류 메시지를 출력하며 즉시 종료되고 마지막 println! 문을 실행하지 않았습니다.
    • 인덱싱을 사용할 때 Rust는 지정된 인덱스가 배열 길이보다 작은지 확인합니다. 인덱스가 배열 길이보다 크거나 같으면 Rust는 패닉합니다. 이러한 확인은 런타임에 수행되어야 하며, 특히 이 경우에는 사용자가 나중에 코드를 실행할 때 어떤 값을 입력할지 컴파일러가 알 수 없기 때문에 런타임에 확인이 필요합니다.
    • 이는 Rust의 메모리 안전 원칙이 작동하는 예입니다. 많은 저수준 언어에서는 이러한 확인이 수행되지 않으며, 잘못된 인덱스를 제공하면 유효하지 않은 메모리에 접근할 수 있습니다. Rust는 이러한 종류의 오류로부터 사용자를 보호하기 위해 즉시 종료하여 메모리 접근을 허용하지 않고 계속 실행하는 것을 방지합니다. 

아래 문서를 참조하여 작성했습니다.

 

Data Types - The Rust Programming Language

Every value in Rust is of a certain data type, which tells Rust what kind of data is being specified so it knows how to work with that data. We’ll look at two data type subsets: scalar and compound. Keep in mind that Rust is a statically typed language,

doc.rust-lang.org

 

반응형