복합(Compound) 타입
- 여러 값을 하나의 타입으로 표현
- Tuple, Array
Tuple
- 고정 길이를 가짐. 즉, 한번 선언되면 그 크기를 변경할 수 없음
- 튜플 내 각 위치는 타입을 갖고, 타입들은 서로 달라도 됨
- 괄호 안에 쉼표로 값을 구분하여 선언
- 인덱스나 [[구조 해체(destructing)]]로 접근 가능
fn main() {
let tup: (i32, f64, char) = (-28, 3.14, 'Y');
// 인덱스로 접근
let first = tup.0;
let second = tup.1;
let third = tup.2;
// 구조 해체로 접근
let (x, y, z) = tup;
let first = x;
let second = y;
let third = z;
}
아무 값도 없는 튜플은 유닛(Unit)이라고 부름
- 값과 타입이 모두
()로 선언되고 빈 값이나 비어있는 반환 타입을 나타냄 - 표현식이 어떠한 값도 반환하지 않는다면 암묵적으로 유닛을 반환
Array
- 값과 타입이 모두
고정 길이를 가짐. 즉, 한번 선언되면 그 크기를 변경할 수 없음
튜플과 달리 배열의 모든 요소는 같은 타입이어야 함
괄호 안에 쉼표로 값을 구분하여 선언
let a = [1, 3, 5]let b: [i32, 5] = [1,2,3,4,5];let c = [-3, 4]; // [-3, -3, -3, -3]
인덱스를 통해 접근 가능
스택에 할당
fn main() {
let arr = [1, 3, 5];
let first = arr[0];
let second = arr[1];
let third = arr[2];
}
유효하지 않은 배열 요소에 대한 접근
배열이 선언되어 있고 사용자가 배열의 인덱스를 입력하여 해당 인덱스에 대응하는 배열의 요소를 반환받는 프로그램이 있다고 가정하자.
일반적으로 저수준 언어(C/C++)에서 배열 범위를 벗어난 인덱스에 접근하면 런타임 에러가 발생하지 않고 임의의 값이 반환된다. 이는 유효하지 않은 메모리에 접근하므로 프로그램이 예상하지 못한 방향으로 동작할 수 있다.
그러나, 러스트에서는 이러한 경우 런타임 에러를 발생시킨다. 인덱스를 통해 배열의 요소에 접근하는 경우, 러스트는 사용자가 입력한 인덱스가 배열의 범위를 벗어나는지 검사한다. 이는 러스트가 가진 안정성의 한 예시이다. 러스트는 유효하지 않은 메모리에 대한 접근을 허용하고 프로그램 실행을 유지하는 대신에 즉시 실행을 종료시킴으로써 안정성을 확보한다.
'Rust' 카테고리의 다른 글
| [Rust] 제어문 : 분기 처리와 반복 (0) | 2024.04.16 |
|---|---|
| [Rust] 함수 (0) | 2024.04.15 |
| [Rust] 데이터 타입 : 스칼라 (Scalar) (0) | 2024.04.15 |
| [Rust] 불변성과 섀도잉 (0) | 2024.03.31 |
| [Rust] Cargo란? (0) | 2024.03.11 |