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 |