카테고리 없음

Rust의 슬라이스(Slice)와 문자열 처리 방법

mystory55801 2025. 5. 29. 10:47

Rust의 슬라이스(Slice)와 문자열 처리 완벽 가이드

Rust에서 문자열을 다루는 것은 처음엔 조금 까다롭게 느껴질 수 있습니다. String&str의 차이부터, 문자열을 슬라이스(slice)하는 방법까지 익숙하지 않으면 혼란스러울 수 있죠. 이 글에서는 Rust의 문자열 처리와 슬라이스 개념을 예제와 함께 쉽게 정리해 드리겠습니다.

String과 &str의 차이점

Rust에서는 문자열을 표현할 때 String&str 두 가지 타입을 자주 사용합니다. 이 둘은 다음과 같은 차이점이 있습니다:

  • String: 힙(heap)에 저장되며, 가변적인 문자열 타입입니다. 문자열을 생성하고, 변경하거나 붙일 수 있습니다.
  • &str: 문자열 슬라이스로, 불변이며 프로그램의 바이너리나 String 내부의 일부를 참조할 때 사용됩니다.

let s1 = String::from("hello"); // String
let s2 = "world"; // &str

String은 소유권을 가지며, &str은 참조입니다. 보통 함수의 매개변수로 문자열을 받을 때는 &str로 받는 것이 일반적입니다.

슬라이스(Slice)란 무엇인가?

슬라이스는 데이터의 일부분을 참조할 수 있도록 하는 타입입니다. 문자열뿐 아니라 배열 등에도 적용할 수 있습니다. 슬라이스는 원본 데이터를 복사하지 않고, 메모리를 참조함으로써 효율적으로 데이터를 다룰 수 있게 해줍니다.


let s = String::from("Rustacean");
let slice = &s[0..4];
println!("slice: {}", slice); // 출력: Rust

&s[0..4]는 문자열의 0번 인덱스부터 3번 인덱스까지의 문자를 참조합니다. 이처럼 슬라이스는 범위를 지정하여 문자열의 일부를 다룰 수 있게 해줍니다.

문자열 슬라이스와 UTF-8 주의점

Rust의 문자열은 UTF-8로 인코딩되어 있기 때문에, 단순히 바이트 인덱스로 자르면 문제가 생길 수 있습니다. 예를 들어 한글이나 이모지를 자르려 할 때는 반드시 문자 경계를 고려해야 합니다.


let s = "안녕하세요";
let slice = &s[0..3]; // 오류: 유효하지 않은 문자 경계

이럴 땐 chars()를 이용하여 문자 단위로 슬라이스하거나 get()을 사용해 안전하게 참조하는 것이 좋습니다.


let s = "안녕하세요";
let slice = s.chars().take(2).collect::();
println!("{}", slice); // 출력: 안녕

문자열 길이, 연결, 수정하기

Rust에서는 문자열을 다양한 방식으로 다룰 수 있습니다. 아래는 문자열의 길이를 구하고, 연결하고, 수정하는 기본 예제입니다.


let mut s = String::from("Hello");
println!("길이: {}", s.len()); // 5

s.push_str(", Rust!"); // 문자열 추가
println!("변경 후: {}", s);

let new_string = format!("{} - {}", s, "Welcome!");
println!("포맷 문자열: {}", new_string);

문자열을 다루는 함수 예제

Rust 함수에서 문자열을 다룰 때는 보통 &str 타입으로 참조를 전달합니다. 아래는 문자열의 첫 단어를 반환하는 함수 예제입니다.


fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s
}

fn main() {
    let s = String::from("hello world");
    let word = first_word(&s);
    println!("첫 단어: {}", word);
}

이 함수는 문자열 슬라이스를 사용하여 공백 전까지의 첫 단어를 반환합니다. 복사 없이 문자열의 일부분을 참조하는 매우 효율적인 방식입니다.

결론: 슬라이스와 문자열 처리는 Rust의 핵심 기능

Rust에서 문자열을 다루는 방식은 다른 언어보다 안전성과 효율성에 초점이 맞춰져 있습니다. 슬라이스는 데이터를 복사하지 않고 참조할 수 있도록 도와주며, 메모리 사용을 최적화하는 데 큰 도움을 줍니다.

String과 &str의 차이를 이해하고, 슬라이스를 적절히 활용한다면, 복잡한 문자열 처리도 Rust에서 안전하게 구현할 수 있습니다. 다음에는 구조체와 메서드로 문자열 데이터를 캡슐화하는 방법도 배워보세요!