복합(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

+ Recent posts