본문 바로가기
개발/러스트 (Rust)

Rust 기본, 슬라이스 (Slice)

by 레조 2024. 7. 14.

https://rustacean.net/

 

Rust 기본 : 슬라이스 (Slice)


슬라이스(Slice)는 컬렉션 내 연속적인 요소들을 참조(Borrow)합니다.

여기서 '연속적'이란 요소들이 서로 인접해 있다는 의미입니다. 

일반적으로 컬렉션 전체가 아닌 일부분만을 참조하고 싶을 때 Slice를 사용합니다.

 

슬라이스는 컬렉션의 일부를 Borrow 한다.

 - 불변 슬라이스(&[T]): 데이터의 일부에 대한 읽기 전용 접근을 허용합니다.

 - 가변 슬라이스(&mut [T]): 데이터의 일부에 대한 읽기 및 쓰기 접근을 허용합니다.

 

가변 슬라이스는 단순히 기존 데이터의 일부분에 대한 접근을 변경 가능하게 만들어 주는 것이지, 

컬렉션의 구조 자체를 변경하거나 메모리를 확장하지는 않습니다.

 


 

문자열 유형

String
 - 확장 가능하며, 힙에 할당된 문자열 (UTF-8 인코딩)

 

str
 - 메모리(스택, 힙, 또는 정적 메모리) 어딘가에 있는 UTF-8 바이트의 불변 시퀀스.
 - 시퀀스의 길이가 컴파일 시에 알려져 있지 않기 때문에 참조(&str)를 통해 다룬다. -> string slice

 

fn main() {
    // 스트링(String)
    let tweet = String::from(
        "This is my tweet and it's very very long."
    );
        
    // 자동 역참조 강제변환 (auto dref coercion) : String -> &str
    let trimmed_tweet = trim_tweet(&tweet);
    println!("{trimmed_tweet}");
    
    // 스트링 리터럴 (string literal)
    let tweet2 = "This is my tweet and it's very very long.";
    let trimmed_tweet2 = trim_tweet(&tweet2);
    println!("{trimmed_tweet2}");
}

// String, &str 두 타입 모두 인자로 받을 수 있다.
fn trim_tweet(tweet: &str) -> &str {
    &tweet[..20]
}

 

배열에 슬라이스 사용하기.

fn main() {
    let a = [1, 2, 3, 4, 5, 6];
    let a_slice = &a[..3];
    println!("{:?}", a_slice);
}

 

백터에 슬라이스 사용하기.

fn main() {
    let vec = vec![1, 2, 3, 4, 5];
    let slice = &vec[1..4]; // vec의 인덱스 1부터 3까지의 요소를 포함하는 슬라이스

    println!("{:?}", slice); // 슬라이스 출력
}