811 단어
4 분
배열, 슬라이스, 튜플

배열 (Array)#

선언#

배열은 고정된 길이같은 타입의 요소를 가지는 자료형입니다.
타입 표기는 [T; N] -> T는 요소 타입, N은 길이입니다.

main.rs
let arr: [i32; 3] = [1, 2, 3];
let arr2 = [0; 5]; // [0, 0, 0, 0, 0] (0을 5번 반복)

인덱싱#

main.rs
assert_eq!(arr[0], 1);
assert_eq!(arr[2], 3);

길이 확인#

main.rs
assert_eq!(arr.len(), 3);

반복문#

main.rs
for num in arr {
println!("{}", num);
}

장점#

  • 크기와 타입이 고정되어 있어 컴파일 타임에 메모리 크기가 확정
  • 스택에 저장되어 접근 속도가 빠름
  • 안전성: 범위를 벗어나면 런타임 오류 발생

단점#

  • 크기를 변경할 수 없음
  • 요소 타입이 모두 같아야 함

주로 쓰는 이유#

  • 데이터 개수가 변하지 않는 경우
  • 빠른 접근과 메모리 효율이 중요한 경우

슬라이스 (Slice)#

슬라이스는 배열이나 문자열의 일부분을 참조하는 타입입니다. 크기를 고정하지 않고 &[T] 형태로 사용합니다.

main.rs
let arr = [10, 20, 30, 40, 50];
let slice = &arr[1..4];
assert_eq!(slice, &[20, 30, 40]);

전체 슬라이스#

main.rs
let slice_all = &arr[..];
assert_eq!(slice_all, &[10, 20, 30, 40, 50]);

장점#

  • 데이터 복사 없이 원본의 일부만 참조 가능
  • 길이가 가변적이라 유연함
  • 함수 매개변수로 사용하면 배열/벡터/문자열 모두 받기 가능

단점#

  • 읽기 전용 참조 (값 변경은 불가능, &mut [T]를 써야 함)
  • 원본 데이터가 사라지면 사용할 수 없음

주로 쓰는 이유#

  • 큰 데이터에서 일부만 읽고 싶을 때
  • 함수 인자로 다양한 컬렉션 타입을 받고 싶을 때

튜플 (Tuple)#

튜플은 여러 타입을 하나로 묶을 수 있는 자료형입니다. 타입 표기는 (T1, T2, ...) 형태입니다.

main.rs
let tup: (i32, f64, &str) = (42, 3.14, "Rust");

요소 접근#

인덱스로 접근#

main.rs
assert_eq!(tup.0, 42);
assert_eq!(tup.1, 3.14);
assert_eq!(tup.2, "Rust");

분해(destructuring)#

main.rs
let (x, y, z) = tup;
assert_eq!(x, 42);
assert_eq!(y, 3.14);
assert_eq!(z, "Rust");

튜플 리턴#

함수에서 여러 값을 반환할 때 자주 사용됩니다.

main.rs
fn min_max(nums: &[i32]) -> (i32, i32) {
let min = *nums.iter().min().unwrap();
let max = *nums.iter().max().unwrap();
(min, max)
}
let arr = [3, 1, 4, 1, 5];
let (min, max) = min_max(&arr);
assert_eq!((min, max), (1, 5));

장점#

  • 서로 다른 타입의 데이터를 하나로 묶을 수 있음
  • 함수에서 여러 값을 반환할 때 유용
  • 구조 분해 할당(destructuring)이 가능

단점#

  • 길이가 고정되어 있고, 요소 이름이 없음
  • 데이터 의미를 명확히 하려면 구조체 사용이 더 적절할 때가 많음

주로 쓰는 이유#

  • 간단히 여러 값을 묶어서 반환하거나 전달할 때
  • 임시 데이터 그룹을 만들 때

요약#

타입장점단점주로 쓰는 이유
배열고정 크기, 빠른 접근크기 변경 불가, 같은 타입만크기가 변하지 않는 데이터
슬라이스원본 참조, 유연한 크기원본 소멸 시 사용 불가데이터 일부 참조, 함수 인자
튜플서로 다른 타입 묶기요소 이름 없음여러값 묶이