본문 바로가기
개발/Rust

[Rust] 배열(array)

by 77monkey 개발자 2023. 10. 2.
반응형

 

Rust에서 배열은 C/C++에서 보았던 배열과 비슷합니다. 하지만 매번 그랬듯이 다른 점도 있기 때문에 잘 비교하면서 알아보도록 합시다. 

 

배열(array)

Rust에서 배열은 고정된 크기의 요소를 저장하는 데이터 구조입니다. 배열은 한 번 생성되면 크기를 변경할 수 없으며, 요소의 데이터 타입은 동일해야 합니다. 요소의 데이터 타입을 다르게 하고 싶다면 [Rust] 튜플(tuple)을 사용하시면 됩니다. Rust의 배열은 C/C++과 동일하게 스택에 저장되며 고정된 크기로 선언됩니다. 고정된 크기가 아니라면 벡터를 사용하셔야 합니다. 벡터는 추후에 포스팅하도록 하겠습니다. 

 

배열 선언

배열을 선언할 때에는 항상 초기화를 해줘야 합니다. Rust에서는 초기화되지 않은 배열을 사용할 수 없기 때문입니다.

코드를 보시면 [T; N] 형태로 선언이 됩니다. 여기서 T는 요소의 데이터 타입을 의미하고, N은 배열의 크기를 의미합니다.

fn main() {
    let mut weight: [u32; 3] = [0; 3];
    let name = ["monkey", "lion", "tiger"];
    let mut married: [bool; 3] = [false; 3];
}

1번째와 3번째 예시에서 초기화 값으로 [V; N] 형태로 표현을 했습니다. V는 요소가 가지는 값이고 N은 배열의 길이를 의미합니다. 참고로 2번째 예시에서는 [&str; 3]으로 타입 추론이 되었습니다.

배열의 요소를 변경할 경우에 대해서만 mut를 사용합니다. 그렇지 않은 경우에는 mut를 빼주시면 됩니다. ㅊ

 

배열 요소 접근

배열 요소를 접근하는 방법은 C/C++과 같습니다. []를 통해서 0부터 배열의 길이 -1 까지 접근할 수 있습니다. 예시 코드는 다음과 같습니다. 

fn main() {
    let weight: [u32; 3] = [0; 3];
    let name = ["monkey", "lion", "tiger"];
    let mut married: [bool; 3] = [false; 3];

    println!("name[0] = {}", name[0]);
    println!("name[1] = {}", name[1]);
    println!("name[2] = {}", name[2]);
}

출력 결과는 예상하시는 것과 같습니다. 

name[0] = monkey
name[1] = lion
name[2] = tiger

 

배열 메소드

배열 메서드는 iter(), iter_mut(), len(), first(), last(), contains(), sort()_, sort_by() 등이 있습니다.

  • iter(): 배열을 순회하기 위한 이터레이터를 반환합니다. 불변 참조를 사용하여 요소에 접근할 때 유용합니다. 아래 코드는 1부터 5까지 출력하는 코드입니다.
fn main() {
    let numbers = [1,2,3,4,5];

    for number in numbers.iter() {
        println!("{}", number);
    }
}
  • iter_mut(): 가변 참조를 사용하여 배열 요소를 수정할 수 있도록 하는 이터레이터를 반환합니다. 아래 코드는 11부터 15까지 출력하는 코드입니다. 참고로 for문에 있는 number는 &mut i32이기 때문에 *를 통해서 numbers 배열의 요소 값을 변경하게 됩니다.
fn main() {
    let mut numbers = [1,2,3,4,5];

    for number in numbers.iter_mut() {
        *number += 10;
        println!("{}", number);
    }
}
  • len(): 배열의 길이를 반환합니다. 출력 결과는 numbers len: 5입니다.
fn main() {
    let numbers = [1,2,3,4,5];

    println!("numbers len: {}", numbers.len());
}
  • first(): 배열의 첫 번째 요소를 접근합니다. 
  • last(): 배열의 마지막 요소를 접근합니다. 
fn main() {
    let numbers = [1,2,3,4,5];

    println!("numbers first: {:?}", numbers.first());
    println!("numbers last: {:?}", numbers.last());
}

출력 결과는 아래와 같이 Some(#)으로 나옵니다. 그렇기 때문에 {:?}으로 출력하게 됩니다.

numbers first: Some(1)
numbers last: Some(5)
  • contains(): 배열이 특정 요소를 포함하는지 확인합니다. contains()의 인자로는 &T인 reference가 필요하기 때문에 &5, &7과 같이 작성해야 합니다. 또한 contains()의 결과값은 bool이기 때문에 코드 결과는 true, false로 나오게 됩니다. 
fn main() {
    let numbers = [1,2,3,4,5];

    println!("5 is in numbers? {:?}", numbers.contains(&5));
    println!("7 is in numbers? {:?}", numbers.contains(&7));    
}
  • sort(): 배열을 정렬합니다. sort()를 하게 되면 오름차순으로 정렬을 해줍니다. 그렇기 때문에 for문을 통해서 출력을 하게 되면 1부터 5까지 차례대로 출력이 됩니다.
fn main() {
    let mut numbers = [2,3,5,1,4];

    numbers.sort();

    for number in numbers.iter() {
        println!("{}", number);
    }
}
  • sort_by(): 사용자 정의 정렬 기준을 지공하여 배열을 정렬합니다. 아래 코드는 내림차순으로 정렬을 해줍니다. 그렇기 때문에 for문을 통해서 결과를 출력하면 5부터 1까지 차례대로 출력이 됩니다.
fn main() {
    let mut numbers = [2,3,5,1,4];

    numbers.sort_by(|a, b| b.cmp(a));

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

 

마무리

Rust에서 배열은 C/C++에서의 배열과 유사하지만 초기화를 반드시 해야 한다는 점에서 일단 달랐습니다. 또한 배열에서 사용할 수 있는 메서드들이 있기 때문에 원하는 결과를 빠르게 구할 수 있습니다. 한 번씩 직접 코딩해 봄으로써 좀 더 친숙해지시길 바랍니다.

 

 

반응형

'개발 > Rust' 카테고리의 다른 글

[Rust] 슬라이스 vs 슬라이스 레퍼런스  (0) 2023.10.08
[Rust] 벡터(Vector)  (0) 2023.10.05
[Rust] 튜플(tuple)  (0) 2023.09.28
[Rust] bool 타입  (0) 2023.09.27
[Rust] if 문  (0) 2023.09.04