상세 컨텐츠

본문 제목

16. Rust 슬라이스

Rust를 처음부터 배우세요

by 러스트코리아 2024. 11. 15. 20:02

본문

반응형

슬라이스  메모리 섹션에 대한 포인터입니다.

따라서 슬라이스를 사용하여 연속적인 메모리 블록 범위 내의 데이터에 액세스할 수 있습니다.

일반적으로 메모리에 연속적인 간격으로 데이터를 저장할 수 있는 데이터 구조로는 배열, 벡터, 스트링 등이 있습니다.

즉, 슬라이싱은 배열, 벡터 및 문자열과 함께 사용할 수 있으며 숫자 인덱스(배열의 아래 첨자 인덱스와 유사)를 사용하여 가리키는 데이터에 액세스합니다.

예를 들어, 슬라이싱은 문자열과 함께 사용될 수 있으며, 조각은 문자열의 연속된 부분을 가리킬 수 있습니다. 이 문자열 조각은 실제로 문자열에 대한 포인터입니다. 연속된 문자열 범위를 가리키므로 문자열의 시작 위치와 끝 위치를 지정해야 합니다.

슬라이스 콘텐츠에 액세스할 때 아래 첨자 인덱스는 0부터 시작합니다.

슬라이스 의 크기는 런타임에 알려지며 배열처럼 컴파일 타임에 알려야 하는 것이 아닙니다.

16.1 슬라이스 정의 구문

위의 모호한 설명을 통해 우리는 슬라이스가 배열, 벡터 또는 문자열을 가리키는 연속 간격이라는 것을 알 수 있습니다.

슬라이스를 정의하는 구문 형식은 다음과 같습니다.

  1. let sliced_value = &data_structure[start_index..end_index]

슬라이스를 정의할 때 주의해야 할 몇 가지 사항은 다음과 같습니다.

  1. [start_index..end_index]는 왼쪽 폐쇄 및 개방 구간 [start_index, end_index)입니다.
  2. 간격의 구문에 대해 주의해야 할 두 가지 사항이 있습니다...
  3. 배열, 벡터, 문자열의 첨자 액세스 방법도 0부터 시작하므로 start_index의 최소값은 0입니다.
  4. end_index의 최대값은 배열, 벡터 또는 문자열의 길이입니다.
  5. end_index가 나타내는 인덱스의 문자는 슬라이스에 포함되지 않습니다.

16.2 슬라이스 범례

배열, 벡터 및 문자열은 메모리에 지속적으로 저장됩니다. 메모리에 문자열을 저장하는 방법은 다음과  같습니다.

Tutorials 문자열의 길이는 9, 첫 번째 문자의 첨자 인덱스는 0, 마지막 문자의 첨자 인덱스는 8임을 에서 직관적으로 알 수 있습니다.

슬라이싱을 사용하여 Tutorials 문자열의 4번째 문자부터 시작하여 5개의 연속 문자에 액세스하려면 다음과 같이 할 수 있습니다.

  1. fn main() {
  2. let n1 = "Tutorials".to_string();
  3. println!("length of string is {}",n1.len());
  4. let c1 = &n1[4..9];
  5.  
  6. // fetches characters at 4,5,6,7, and 8 indexes
  7. println!("{}",c1);
  8. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. length of string is 9
  2. rials

16.3 함수 인수로서의 슬라이스

슬라이스는 함수에 대한 인수로 사용될 수도 있습니다.

슬라이스는 배열, 벡터, 문자열의 연속된 하위 집합을 참조로 함수에 전달하는 데 사용할 수 있습니다.

먼저 간단한 코드를 살펴보겠습니다

  1. fn main(){
  2. let data = [10,20,30,40,50];
  3. use_slice(&data[1..4]);
  4. //this is effectively borrowing elements for a while
  5. }
  6. fn use_slice(slice:&[i32]) {
  7. // is taking a slice or borrowing a part of an array of i32s
  8. println!("length of slice is {:?}",slice.len());
  9. println!("{:?}",slice);
  10. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. length of slice is 3
  2. [20, 30, 40]

위의 코드에서

  1. main() 및 use_slice() 두 함수가 선언되었으며, 후자는 슬라이스를 허용하고 슬라이스의 길이를 인쇄합니다.
  2. 먼저 main() 함수에서 5개의 요소가 있는 배열을 선언합니다.
  3. 그런 다음 배열 조각(인덱스 1부터 인덱스 3까지의 요소)을 매개변수로 사용하여 use_slice() 함수를 호출합니다.

16.4 변경 가능한 슬라이스

슬라이스는 기본적으로 변경할 수 없습니다 .

슬라이스가 원본 데이터를 가리키는 것처럼 보이지만 기본적으로 슬라이스의 요소를 변경할 수는 없습니다.

즉, 기본적으로 조각의 요소를 변경해도 원본 데이터는 영향을 받을 수 없습니다.

그러나 이것이 절대적인 것은 아닙니다. 우리가 선언하는 원본 데이터가 가변적이고 슬라이스를 정의할 때 &mut 키워드가 추가되면 슬라이스의 요소를 변경하여 원본 데이터에 영향을 줄 수 있습니다.

  1. fn main(){
  2. let mut data = [10,20,30,40,50];
  3. use_slice(&mut data[1..4]);
  4. // passes references of 20, 30 and 40
  5. println!("{:?}",data);
  6. }
  7. fn use_slice(slice:&mut [i32]) {
  8. println!("슬라이스의 길이는:{:?}",slice.len());
  9. println!("{:?}",slice);
  10. slice[0] = 1010; // replaces 20 with 1010
  11. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 슬라이스의 길이는:3
  2. [20, 30, 40]
  3. [10, 1010, 30, 40, 50]

위 코드에서 볼 수 있듯이 원본 데이터가 변경 가능하고 슬라이스 선언 시 &mut 키워드를 추가하면 슬라이스가 변경 가능합니다.

현재 콘텐츠 저작권은 chapin666 또는 그 계열사에 있습니다. 
반응형

'Rust를 처음부터 배우세요' 카테고리의 다른 글

18. Rust 열거 Enum  (0) 2024.11.20
17. Rust 구조 (Struct)  (0) 2024.11.15
15. Rust는 차용(빌려줌) - Borrowing  (0) 2024.11.15
14. Rust 소유권  (0) 2024.11.15
13. Rust 배열  (0) 2024.11.15

관련글 더보기