RUST

[RUST] RUST 메모리 관리 규칙 - Slice

ssh9308 2023. 12. 28. 09:00
반응형

 

Slice 란?

 

Rust에서 슬라이스(slice)는 연속된 데이터의 일부 혹은 전체에 대한 참조를 제공하는 데이터 타입이다.

 

슬라이스는 컬렉션의 일부를 가리키지만, 소유하지는 않는다.

 

슬라이스를 사용함으로써 컬렉션의 특정 부분에 대한 접근을 효율적으로 제공할 수 있다.

 

 

슬라이스의 기본 특성


1) 참조자

슬라이스는 기본적으로 두 가지 정보를 가진다. 데이터를 가리키는 포인터와 슬라이스의 길이를 가진다.


2) 안전성

슬라이스는 컬렉션의 유효한 부분만을 참조하도록 제한되어 있어, 범위를 벗어난 접근을 방지한다.


3) 동적 크기

슬라이스는 런타임에 크기가 결정된다. 컴파일 타임에는 크기를 알 수 없다.

 

 

 

슬라이스의 사용

1) 배열 슬라이싱

배열이나 벡터에서 일부 범위를 참조하는 데 사용된다.

예를 들어, let slice = &arr [1.. 4];는 arr의 1번부터 3번 인덱스까지의 요소를 가리키는 슬라이스를 생성한다.

 

 

 

2) 문자열 슬라이싱

문자열의 일부를 참조하는 데 사용된다. 예를 들어, let slice = &s[0..2];는 문자열 s의 처음 두 글자를 가리키는 슬라이스이다.

 

여기서 조심해야 할 점은 슬라이스 인자로 들어가는 숫자가 index 를 뜻하는게 아니라는 것이다.

 

index 가 아닌 byte 의 크기로 구분이 된다.

 

예를들어 영어의 경우 글자 하나당 1byte 를 차지하지만,

 

한글의 경우 3byte를 차지하게 된다.

 

 

위의 결과를 보면 "안녕하세요" 문자열에 대한 문자열 슬라이스를 할당해주었다.

 

0 ~ 3 번째까지의 한글을 가져올거라고 생각할 수 있지만, 결과는 "안"하나만 출력되고 있다.

 

해당 String 데이터에서 3byte 크기 만큼 가져온 것이다.

 

 

3) 함수 인자

함수에 배열이나 문자열의 일부를 전달할 때 슬라이스를 사용할 수 있다.

 

이는 전체 컬렉션을 복사하는 것보다 효율적이다.

 

 

슬라이스의 메모리 사용법

 

위와 같은 코드가 있다.

 

문자열 슬라이스를 사용하고 있는데, 메모리에서 어떤 구조로 동작하는지 알아보자.

 

메모리의 사용방법을 도식화 하면 아래와 같다.

 

String 데이터의 slice 변수인 "word" 는 기존 str 데이터가 가리키는 메모리 영역을 가리키되,

 

시작 포인터 위치가 2456 이 아닌 2458 위치를 가리키게 되고 length 와 capacity 값도 달라지게 된다.

반응형