Rust 문자열

2023. 6. 24. 00:37Language/Rust

러스트에서 문자열을 다룰 때는 String 타입 또는 &str 타입을 이용합니다.

 

&str은 변경이 불가능 하기 때문에 함수의 반환 값으로 사용해야 할 때는 String 타입을 사용하고 있습니다.

 

이 둘의 차이점에 대해 먼저 알아 보겠ㅅㅂ니다.

 

String 타입

String 타입은 벡터 타입입니다. 정확히는 vec<u8> 타입입니다. u8은 부호가 없는 8비트(1바이트) 정수이기 때문에 String 타입은 1바이트 단위로 데이터를 확장 할 수 있고, 벡터 타입은 힙 메모리에 저장됩니다.

 

&str 타입

&str 타입은 슬라이스라고 합니다. 큰따옴표("")로 감싼 문자열이 &str이며, 러스트에서는 슬라이스인 &[u8] 타입으로 취급됩니다. &[u8] 타입인 것을 보면 참조자로만 사용 할 수 있기 때문에 소유권이 없어 수정이 불가능 합니다.

 

문자열에서 문자 가져오기

C#이나 다른 언어에서는 아래와 같이 배열의 인덱스로 문자열에서 문자를 가져 올 수 있습니다.

 

string str= "hello";
Console.WriteLine($"{str[0]}");

하지만 Rust에서는 아래와 같이 작성하면 에러가 납니다.

 

fn main() {
    let str = "hello";
    println!("{}", str[0]);
}
error[E0277]: the type `str` cannot be indexed by `{integer}`
 --> src/main.rs:3:24
  |
3 |     println!("{}", str[0]);
  |                        ^ string indices are ranges of `usize`
  |
  = help: the trait `SliceIndex<str>` is not implemented for `{integer}`
  = note: you can use `.chars().nth()` or `.bytes().nth()`
          for more information, see chapter 8 in The Book: <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>
  = help: the trait `SliceIndex<[T]>` is implemented for `usize`
  = note: required for `str` to implement `Index<{integer}>`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `string-test` (bin "string-test") due to previous error

 

Note 부분을 보면 str[0]과 같은 형태는 접근 할 수 없으니, 대신 chars 또는 bytes 메서드를 사용해서 접근하라고 컴파일러가 알려줍니다.

 

chars 메서드는 문자열을 UTF-8 기반으로 1글자 씩 분할한 반복자를 반환하고, bytes 메서드는 문자열을 단순히 1바이트 단위로 분할한 반복자를 반환합니다.

 

아까 위에서 봤듯이, Rust에서는 문자하나가 1바이트이기 때문에 bytes 메서드를 사용해서 1바이트를 가져오면 문자 1개가 됩니다.

 

fn main() {
    let str = "hello";
    let ch = str.chars().nth(0).unwrap();
    println!("{}", ch);

    let ch_byte = str.bytes().nth(0).unwrap();
    println!("{}", String::from_utf8_lossy(&[ch_byte]));
}

위와 같이 문자 hello의 h를 출력 할 수 있습니다.

'Language > Rust' 카테고리의 다른 글

cargo diesel_cli 설치 에러  (0) 2023.06.22
환경변수 파일 읽기  (0) 2023.06.21
Rust 명령줄의 인수 받기  (0) 2023.06.18
Rust의 HashMap 소개  (1) 2023.06.15
Rust Shuffle  (0) 2023.06.11