Rust 공식 문서를 참고한 글입니다.
Slice 자료형
슬라이스 자료형이란 배열이나 문자열과 같은 컬렉션을 일부 참조할 수 있게 하고, 소유권을 갖지 않아도 복사 없이 빠르게 접근할 수 있도록 하는 것이다. 첫번째 단어의 마지막 글자 인덱스를 반환하는 프로그램 예제를 살펴보자. 반복문을 통해 문자열을 탐색하며 띄어쓰기를 만나면 인덱스를 반환하는 방식이다.
fn first_word(s: &String) -> usize {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
s.len()
}
문자열의 마지막 인덱스를 구할 수 있지만, 이것은 usize로 반환하여 &String에서만 의미가 있는 값이다. 즉, 어떤 문자열의 첫번째 단어의 마지막 인덱스를 변수에 저장했는데, 문자열이 변경되거나 사라지면 정수 자료형은 의미가 없는 값이 된다. 후에 다루겠지만 Rust는 인덱스를 통해서 문자열 일부에 접근할 수 없다. 이때 사용하는 것이 slice 자료형이다.
String Slices
문자열 슬라이스는 인덱스로 문자열의 일부에 접근할 수 있다. s의 [시작 인덱스, 끝 인덱스]를 지정하면 참조할 수 있다.
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
이 방법을 토대로 마지막 인덱스를 반환하는 프로그램을 변경해보자.
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}
이렇게 사용하면 참조하는 변수의 변경이나 삭제가 발생했을 때 컴파일러 수준에서 이를 막아주므로 안전하게 사용할 수 있다.
문자열 리터럴
문자열 리터럴은 String과 달리 불변성을 가진다. 바이너리 파일 중에서 이 문자열 리터럴의 값에 해당하는 부분만 참조하고 있다. 그래서 위에서 작성한 코드 fn first_word(s: &String) -> &str 를 fn first_word(s: &str) -> &str 로 작성하면 문자열 리터럴과 String 에 모두 사용할 수 있게 된다.
'언어 > Rust' 카테고리의 다른 글
[Rust] 5-2. 메서드 (0) | 2024.10.09 |
---|---|
[Rust] 5-1. 구조체 사용 (0) | 2024.10.09 |
[Rust] 4-2. 참조와 대여 (0) | 2024.09.28 |
[Rust] 4-1. 소유권(Ownership) (0) | 2024.09.28 |
[Rust] 3-3. 제어문(Control Flow) (0) | 2024.09.26 |