16. Rust 슬라이스
슬라이스 는 메모리 섹션에 대한 포인터입니다.
따라서 슬라이스를 사용하여 연속적인 메모리 블록 범위 내의 데이터에 액세스할 수 있습니다.
일반적으로 메모리에 연속적인 간격으로 데이터를 저장할 수 있는 데이터 구조로는 배열, 벡터, 스트링 등이 있습니다.
즉, 슬라이싱은 배열, 벡터 및 문자열과 함께 사용할 수 있으며 숫자 인덱스(배열의 아래 첨자 인덱스와 유사)를 사용하여 가리키는 데이터에 액세스합니다.
예를 들어, 슬라이싱은 문자열과 함께 사용될 수 있으며, 조각은 문자열의 연속된 부분을 가리킬 수 있습니다. 이 문자열 조각은 실제로 문자열에 대한 포인터입니다. 연속된 문자열 범위를 가리키므로 문자열의 시작 위치와 끝 위치를 지정해야 합니다.
슬라이스 콘텐츠에 액세스할 때 아래 첨자 인덱스는 0부터 시작합니다.
슬라이스 의 크기는 런타임에 알려지며 배열처럼 컴파일 타임에 알려야 하는 것이 아닙니다.
16.1 슬라이스 정의 구문
위의 모호한 설명을 통해 우리는 슬라이스가 배열, 벡터 또는 문자열을 가리키는 연속 간격이라는 것을 알 수 있습니다.
슬라이스를 정의하는 구문 형식은 다음과 같습니다.
- let sliced_value = &data_structure[start_index..end_index]
슬라이스를 정의할 때 주의해야 할 몇 가지 사항은 다음과 같습니다.
- [start_index..end_index]는 왼쪽 폐쇄 및 개방 구간 [start_index, end_index)입니다.
- 간격의 구문에 대해 주의해야 할 두 가지 사항이 있습니다...
- 배열, 벡터, 문자열의 첨자 액세스 방법도 0부터 시작하므로 start_index의 최소값은 0입니다.
- end_index의 최대값은 배열, 벡터 또는 문자열의 길이입니다.
- end_index가 나타내는 인덱스의 문자는 슬라이스에 포함되지 않습니다.
16.2 슬라이스 범례
배열, 벡터 및 문자열은 메모리에 지속적으로 저장됩니다. 메모리에 문자열을 저장하는 방법은 다음과 같습니다.
Tutorials 문자열의 길이는 9, 첫 번째 문자의 첨자 인덱스는 0, 마지막 문자의 첨자 인덱스는 8임을 에서 직관적으로 알 수 있습니다.
슬라이싱을 사용하여 Tutorials 문자열의 4번째 문자부터 시작하여 5개의 연속 문자에 액세스하려면 다음과 같이 할 수 있습니다.
- fn main() {
- let n1 = "Tutorials".to_string();
- println!("length of string is {}",n1.len());
- let c1 = &n1[4..9];
- // fetches characters at 4,5,6,7, and 8 indexes
- println!("{}",c1);
- }
위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.
- length of string is 9
- rials
16.3 함수 인수로서의 슬라이스
슬라이스는 함수에 대한 인수로 사용될 수도 있습니다.
슬라이스는 배열, 벡터, 문자열의 연속된 하위 집합을 참조로 함수에 전달하는 데 사용할 수 있습니다.
먼저 간단한 코드를 살펴보겠습니다
- fn main(){
- let data = [10,20,30,40,50];
- use_slice(&data[1..4]);
- //this is effectively borrowing elements for a while
- }
- fn use_slice(slice:&[i32]) {
- // is taking a slice or borrowing a part of an array of i32s
- println!("length of slice is {:?}",slice.len());
- println!("{:?}",slice);
- }
위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.
- length of slice is 3
- [20, 30, 40]
위의 코드에서
- main() 및 use_slice() 두 함수가 선언되었으며, 후자는 슬라이스를 허용하고 슬라이스의 길이를 인쇄합니다.
- 먼저 main() 함수에서 5개의 요소가 있는 배열을 선언합니다.
- 그런 다음 배열 조각(인덱스 1부터 인덱스 3까지의 요소)을 매개변수로 사용하여 use_slice() 함수를 호출합니다.
16.4 변경 가능한 슬라이스
슬라이스는 기본적으로 변경할 수 없습니다 .
슬라이스가 원본 데이터를 가리키는 것처럼 보이지만 기본적으로 슬라이스의 요소를 변경할 수는 없습니다.
즉, 기본적으로 조각의 요소를 변경해도 원본 데이터는 영향을 받을 수 없습니다.
그러나 이것이 절대적인 것은 아닙니다. 우리가 선언하는 원본 데이터가 가변적이고 슬라이스를 정의할 때 &mut 키워드가 추가되면 슬라이스의 요소를 변경하여 원본 데이터에 영향을 줄 수 있습니다.
- fn main(){
- let mut data = [10,20,30,40,50];
- use_slice(&mut data[1..4]);
- // passes references of 20, 30 and 40
- println!("{:?}",data);
- }
- fn use_slice(slice:&mut [i32]) {
- println!("슬라이스의 길이는:{:?}",slice.len());
- println!("{:?}",slice);
- slice[0] = 1010; // replaces 20 with 1010
- }
위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.
- 슬라이스의 길이는:3
- [20, 30, 40]
- [10, 1010, 30, 40, 50]
위 코드에서 볼 수 있듯이 원본 데이터가 변경 가능하고 슬라이스 선언 시 &mut 키워드를 추가하면 슬라이스가 변경 가능합니다.