반응형
# Data Types
- Rust의 모든 값은 특정 데이터 유형이 지정되어 있음
- 아래 예시와 같이, 변수명 옆에 `: u32` 와 같이 type annotaion 써야 함
- 데이터 유형은 Scalar Types, Compound Types 두 가지로 나뉜다.
## Scalar Types
- 단일 값을 나타낸다.
- integers, floating-point, Booleans, characters 4가지 타입이 있다.
### Integer Types
- 정수(Integer)는 명시적인 크기와 부호의 유무에 따라 i, u로 구분한다.
- 위에서 사용한 `u32` 는 `32비트 공간을 차지하는 부호 없는 정수`이다. ( i 인 경우 부호 있는)
- `arch` 는 컴퓨터의 아키텍처에 따라 달라진다. 64비트 아키텍처를 사용하는 경우 64비트, 32비트 아키텍처를 사용하는 경우 32비트
- 위 표와 같이 다양 형식으로 정수 리터럴 작성 가능
- 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 은 부호가 있다.
### 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는 전체 튜플을 바인딩합니다.
- 튜플의 개별 값을 가져오려면 패턴 매칭을 사용하여 튜플 값을 구조 분해할 수 있습니다.
- 튜플 요소에 직접 접근하려면 점(.)과 원하는 값의 인덱스를 사용합니다.
- 값이 없는 튜플은 특별히 "unit"이라고 불리며, 이 값과 해당 타입은 모두 ()로 작성되며 빈 값 또는 빈 반환 타입을 나타냅니다. 표현식이 다른 값을 반환하지 않으면 암시적으로 유닛 값을 반환합니다.
### Array Type
- 배열(array)은 튜플과 달리 배열의 모든 요소는 동일한 타입이어야 합니다.
- Rust의 배열은 고정된 길이를 가집니다.
- 배열의 값을 생성하려면 대괄호 안에 쉼표로 구분된 값 목록을 작성합니다:
- 배열은 데이터를 스택에 할당할 때 유용하며, 항상 고정된 수의 요소를 갖는다는 것을 보장하고자 할 때 사용됩니다.
- 배열은 벡터 타입만큼 유연하지 않습니다. 벡터는 크기를 늘리거나 줄일 수 있는 표준 라이브러리에서 제공하는 유사한 컬렉션 타입입니다.
- 배열을 사용할지 벡터를 사용할지 확신이 서지 않는 경우, 벡터를 사용하는 것이 좋습니다.
- 요소의 수가 변경되지 않을 것을 알고 있을 때 배열이 더 유용합니다. 예를 들어, 프로그램에서 월의 이름을 사용할 때는 항상 12개의 요소를 가질 것이므로 배열을 사용하는 것이 좋습니다
- 배열의 타입을 작성하려면 대괄호 안에 각 요소의 타입과 세미콜론, 그리고 배열의 요소 수를 작성합니다.
- 배열을 초기화할 때 각 요소가 동일한 값을 가지도록 하려면 초기 값을 지정하고 세미콜론으로 구분한 후 대괄호 안에 배열의 길이를 작성할 수 있습니다:
- 배열 요소 접근
- 배열은 고정된 크기의 메모리 덩어리로 스택에 할당될 수 있습니다. 배열 요소에 접근하려면 인덱싱을 사용합니다.
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
반응형
'RUST' 카테고리의 다른 글
꼭꼭 씹어먹는 러스트 - 5 제어 흐름 (0) | 2024.06.12 |
---|---|
꼭꼭 씹어먹는 러스트 - 4 주석 (0) | 2024.06.11 |
꼭꼭 씹어먹는 러스트 - 3 함수 (0) | 2024.06.10 |
꼭꼭 씹어먹는 러스트 - 1 변수와 가변성 (0) | 2024.05.27 |
Rust 개발 환경 세팅 ( window 11, RustRover) (2) | 2024.05.24 |