[Rust] 배열과 슬라이스

배열
Rust의 기본 배열은 아주 정적인 친구다.
배열의 길이까지 컴파일타임에 제약된다는 점에서, C/C++의 배열과 거의 동등하다.

Rust의 배열 타입은 아래와 같이 표현된다.
[타입; 길이]
여기서 타입은 각 요소의 타입, 길이는 배열의 길이다.

그리고 배열 값의 초기화는 대괄호로 둘러싸인 목록으로 정의한다.
따라서, 정수면서 길이가 5인 배열은 다음과 같이 만들 수 있다. image

image

그리고 여기서 배열의 타입은 생략이 가능하다. image

image


배열 간편초기화
Rust의 정적배열은 또 간단하게 일괄로 초기화를 처리할 수 있는 문법을 제공한다.

간단하다. 그냥 **[초기값; 길이]**로 써주면 된다. image

image

image 그럼 위처럼 길이만큼의 배열을 만들어, 초기값을 다 넣어준다.


인덱싱
Rust의 배열은 다른 언어들과 마찬가지로, 0으로 시작하는 인덱스값을 받는다. image

image

image 한가지 유의할 점은, 인덱싱도 단순히 Index, IndexMut 트레잇의 메서드일 뿐이란 것이다.

그래서 요소 하나를 가변참조하는 상태에서 뭘 더 하려고 하면 소유권 때문에 뻗는 상황이 종종 일어난다.


슬라이스
슬라이스는 동적인 배열이다.
다만 독립적으로 존재하진 못하고, 배열의 참조로 동작하는 형태다.

슬라이스의 타입 표현은 **[타입]**이다.
배열 타입 표현에서 길이만 빠진 형태다.

그런데 기본적으로 슬라이스는 사이즈를 미리 알 수가 없어서 참조의 형태로만 사용한다.
그래서 보통 **&[타입]**의 형태를 주로 볼 것이다.

그리고 슬라이스의 획득은 **배열값[..]**의 형태로 할 수 있다. [..]면 통째로 가져오는거고, [1..3]면 1부터 3까지, [1..]면 1부터 끝까지, [..3]이면 3까지다. image

image

image

그리고 슬라이스는 배열에만 국한되는 기능이 아니라, 단순한 패턴이라 관련 트레잇을 준수한다면 다 동일한 규격으로 사용할 수 있다.

&str타입도 사실은 String의 슬라이스 타입이다.



벡터
Rust의 기본배열은 무조건 길이가 정해져야만 한다고 했었다. 불편해서 어떻게 쓰겠나?

이를 위한 동적배열타입이 벡터, Vec이다.
축소와 확장이 매우 자유로운 배열이다.

벡터는 일단 기본 타입은 아니고, 제네릭 컬렉션 타입이라 일단은 Vec<타입>으로 표현한다. image

image

image 근데 뭐, 기능이 더 풍부하다 뿐이지 기존 배열과 다를건 별로 없다.

vec! 매크로를 사용하면 기존 배열 초기식도 쓸 수 있고. image

image

image

슬라이스 등도 동일하게 가져올 수 있다. image

image

외에 수많은 기능들은 문서를 참조하길 바란다.
https://doc.rust-lang.org/std/vec/struct.Vec.html



참조
https://doc.rust-lang.org/std/primitive.slice.html
https://cheats.rs/