811 단어
4 분
배열, 슬라이스, 튜플
배열 (Array)
선언
배열은 고정된 길이와 같은 타입의 요소를 가지는 자료형입니다.
타입 표기는 [T; N] -> T는 요소 타입, N은 길이입니다.
let arr: [i32; 3] = [1, 2, 3];let arr2 = [0; 5]; // [0, 0, 0, 0, 0] (0을 5번 반복)인덱싱
assert_eq!(arr[0], 1);assert_eq!(arr[2], 3);길이 확인
assert_eq!(arr.len(), 3);반복문
for num in arr { println!("{}", num);}장점
- 크기와 타입이 고정되어 있어 컴파일 타임에 메모리 크기가 확정
- 스택에 저장되어 접근 속도가 빠름
- 안전성: 범위를 벗어나면 런타임 오류 발생
단점
- 크기를 변경할 수 없음
- 요소 타입이 모두 같아야 함
주로 쓰는 이유
- 데이터 개수가 변하지 않는 경우
- 빠른 접근과 메모리 효율이 중요한 경우
슬라이스 (Slice)
슬라이스는 배열이나 문자열의 일부분을 참조하는 타입입니다.
크기를 고정하지 않고 &[T] 형태로 사용합니다.
let arr = [10, 20, 30, 40, 50];let slice = &arr[1..4];assert_eq!(slice, &[20, 30, 40]);전체 슬라이스
let slice_all = &arr[..];assert_eq!(slice_all, &[10, 20, 30, 40, 50]);장점
- 데이터 복사 없이 원본의 일부만 참조 가능
- 길이가 가변적이라 유연함
- 함수 매개변수로 사용하면 배열/벡터/문자열 모두 받기 가능
단점
- 읽기 전용 참조 (값 변경은 불가능,
&mut [T]를 써야 함) - 원본 데이터가 사라지면 사용할 수 없음
주로 쓰는 이유
- 큰 데이터에서 일부만 읽고 싶을 때
- 함수 인자로 다양한 컬렉션 타입을 받고 싶을 때
튜플 (Tuple)
튜플은 여러 타입을 하나로 묶을 수 있는 자료형입니다.
타입 표기는 (T1, T2, ...) 형태입니다.
let tup: (i32, f64, &str) = (42, 3.14, "Rust");요소 접근
인덱스로 접근
assert_eq!(tup.0, 42);assert_eq!(tup.1, 3.14);assert_eq!(tup.2, "Rust");분해(destructuring)
let (x, y, z) = tup;assert_eq!(x, 42);assert_eq!(y, 3.14);assert_eq!(z, "Rust");튜플 리턴
함수에서 여러 값을 반환할 때 자주 사용됩니다.
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)이 가능
단점
- 길이가 고정되어 있고, 요소 이름이 없음
- 데이터 의미를 명확히 하려면 구조체 사용이 더 적절할 때가 많음
주로 쓰는 이유
- 간단히 여러 값을 묶어서 반환하거나 전달할 때
- 임시 데이터 그룹을 만들 때
요약
| 타입 | 장점 | 단점 | 주로 쓰는 이유 |
|---|---|---|---|
| 배열 | 고정 크기, 빠른 접근 | 크기 변경 불가, 같은 타입만 | 크기가 변하지 않는 데이터 |
| 슬라이스 | 원본 참조, 유연한 크기 | 원본 소멸 시 사용 불가 | 데이터 일부 참조, 함수 인자 |
| 튜플 | 서로 다른 타입 묶기 | 요소 이름 없음 | 여러값 묶이 |