본문 바로가기

언어/Rust

[ Rust ] arrays - 동일한 데이터 타입을 묶어서 사용하기

반응형

배열은 러스트에서 동일한 타입의 값들을 고정된 크기로 저장할 수 있는 데이터 타입입니다. 배열은 연속된 메모리 공간에 데이터를 저장하며, 컴파일 타임에 크기와 타입이 고정됩니다. 배열은 대괄호 []를 사용하여 정의하며, 각 요소는 쉼표로 구분됩니다.

배열의 특징

  • 배열의 길이는 고정되어 있으며, 한 번 정의되면 변경할 수 없습니다.
  • 배열의 모든 요소는 동일한 타입이어야 합니다.
  • 배열의 요소는 인덱스를 사용하여 접근할 수 있으며, 인덱스는 0부터 시작합니다.

배열 정의 방법

fn main() {
    // 배열 정의: 길이가 5이고, 각 요소가 i32 타입인 배열
    let numbers: [i32; 5] = [1, 2, 3, 4, 5];

    // 배열 요소에 접근
    println!("First element: {}", numbers[0]); // 1
    println!("Second element: {}", numbers[1]); // 2

    // 배열의 길이
    println!("Array length: {}", numbers.len()); // 5
}

배열 정의와 초기화

  1. 배열 정의: let numbers: [i32; 5] = [1, 2, 3, 4, 5];
    • numbers는 길이가 5인 i32 타입의 배열입니다.
    • 배열의 길이는 타입에 포함되며, [i32; 5]와 같이 정의합니다.
  2. 요소 접근: numbers[0], numbers[1]과 같이 인덱스를 사용해 배열의 요소에 접근합니다.
  3. 배열의 길이: .len() 메서드를 사용하여 배열의 길이를 구할 수 있습니다.

배열의 동일한 값으로 초기화

배열을 동일한 값으로 초기화할 때는 [value; length] 형태를 사용할 수 있습니다.

fn main() {
    // 모든 요소가 3인 길이 5의 배열
    let repeated_array = [3; 5];
    println!("{:?}", repeated_array); // [3, 3, 3, 3, 3]
}

배열의 유효한 인덱스 접근

러스트에서는 배열에 접근할 때, 유효하지 않은 인덱스에 접근하려고 하면 컴파일 타임이 아닌 런타임에 패닉이 발생합니다. 따라서 인덱스를 사용할 때는 배열의 길이를 확인하는 것이 중요합니다.

fn main() {
    let array = [1, 2, 3, 4, 5];
    let index = 10;

    // 잘못된 인덱스 접근 (런타임에 패닉 발생)
    // println!("Element at index {}: {}", index, array[index]);

    // 안전하게 접근하려면 다음과 같이 체크
    if index < array.len() {
        println!("Element at index {}: {}", index, array[index]);
    } else {
        println!("Index out of bounds!");
    }
}

배열과 반복문

배열은 반복문(for)을 통해 각 요소에 순차적으로 접근할 수 있습니다.

fn main() {
    let numbers = [10, 20, 30, 40, 50];

    for number in numbers.iter() {
        println!("Value: {}", number);
    }
}

배열을 함수에 전달

배열은 함수의 파라미터로 전달할 때 참조(&)를 사용하면 배열을 복사하지 않고 원본 배열에 접근할 수 있습니다.

fn print_array(arr: &[i32]) {
    for val in arr.iter() {
        println!("Value: {}", val);
    }
}

fn main() {
    let my_array = [1, 2, 3, 4, 5];
    print_array(&my_array);
}

이 예제에서 print_array 함수는 슬라이스(&[i32])를 받아 배열의 요소를 출력합니다. 이렇게 하면 배열의 길이가 고정되지 않아도 사용이 가능하며, 메모리 효율도 높아집니다.

배열과 슬라이스

슬라이스는 배열의 일부를 참조하는 타입으로, 배열의 일부분을 다룰 때 매우 유용합니다.

fn main() {
    let array = [1, 2, 3, 4, 5];

    // 배열의 슬라이스 가져오기
    let slice = &array[1..4]; // [2, 3, 4]

    for val in slice.iter() {
        println!("Slice value: {}", val);
    }
}

슬라이스를 사용하면 배열의 일부분을 가리키는 참조를 만들 수 있으며, 슬라이스의 크기는 동적으로 결정됩니다.

정리

  • 배열은 고정된 길이와 동일한 타입의 요소를 갖는 자료 구조입니다.
  • 배열의 요소는 인덱스를 통해 접근하며, 인덱스 범위를 벗어나면 런타임 에러가 발생할 수 있습니다.
  • 배열은 슬라이스로 참조하여 함수에 전달하거나 배열의 일부를 다룰 수 있습니다.
반응형