771 단어
4 분
문자열 타입

문자열 타입 종류#

Rust에서 문자열은 크게 두 가지 타입이 있습니다.

  • String: 변경 가능한, 힙에 저장되는 문자열
  • &str : 변경 불가능한, 문자열 슬라이스

그리고 **문자 타입(char)**도 있습니다.
char은 단일 문자를 표현하며, 작은따옴표(')로 감쌉니다.

main.rs
let c: char = 'A';
let k: char = '한';

문자(char)와 문자열(String/&str) 차이#

  • char : 단 하나의 문자. UTF-8 기준 4바이트까지 저장 가능
  • &str / String : 여러 문자로 이루어진 문자열
let c: char = 'R';
let s: &str = "Rust";
let s2: String = String::from("Rust");

&strString 차이#

&str은 보통 문자열 리터럴처럼 프로그램 안에 박혀있는 고정된 문자열을 나타냅니다.

main.rs
let hello: &str = "Hello, world!";

String은 힙에 저장되며, 길이를 변경하거나 조작할 수 있는 문자열입니다.

main.rs
let mut s = String::from("Hello");
s.push_str(", world!");

문자열 만들기#

문자열 리터럴#

main.rs
let s: &str = "Rust";

String으로 만들기#

main.rs
let s1 = String::from("Rust");
let s2 = "Rust".to_string();

문자열 자주 쓰는 메서드#

len#

문자열의 바이트 길이를 반환합니다.

main.rs
assert_eq!("Rust".len(), 4);
assert_eq!("안녕".len(), 6); // UTF-8은 한 글자라도 1바이트 이상일 수 있음

is_empty#

문자열이 비어 있는지 확인합니다.

main.rs
assert_eq!("".is_empty(), true);
assert_eq!("Rust".is_empty(), false);

push / push_str#

문자나 문자열을 뒤에 추가합니다.

main.rs
let mut s = String::from("Rust");
s.push('!');
s.push_str(" Lang");
assert_eq!(s, "Rust! Lang");

replace#

특정 문자열을 다른 문자열로 바꿉니다.

main.rs
let s = "I like Rust".replace("Rust", "Python");
assert_eq!(s, "I like Python");

trim#

문자열 양쪽의 공백과 쓸데없는 문자를 제거합니다.

main.rs
let s = "\n Hello Rust \n";
assert_eq!(s.trim(), "Hello Rust");

split#

문자열을 나눕니다.

main.rs
let langs: Vec<&str> = "Rust,Go,Python".split(',').collect();
assert_eq!(langs, vec!["Rust", "Go", "Python"]);

contains#

특정 문자열이 포함되어 있는지 확인합니다.

main.rs
assert_eq!("Rust is fast".contains("fast"), true);
assert_eq!("Rust is fast".contains("slow"), false);

starts_with / ends_with#

문자열이 특정 문자열로 시작하거나 끝나는지 확인합니다.

main.rs
assert_eq!("Rustacean".starts_with("Rust"), true);
assert_eq!("Ferris".ends_with("is"), true);

인덱싱과 슬라이싱#

인덱싱#

Rust에서는 문자열을 인덱스로 바로 접근할 수 없습니다.

main.rs
let ch = "Rust"[0]; // 에러 발생

대신 chars()bytes() 메서드를 사용해야 합니다.

main.rs
let s = "Rust";
let first_char = s.chars().nth(0);
assert_eq!(first_char, Some('R'));

슬라이싱#

&str의 경우 Range를 사용해서 슬라이싱이 가능합니다. 단, 문자열 인덱스는 바이트 단위이므로 UTF-8 문자를 중간에서 자르면 런타임 오류가 발생합니다.

main.rs
let nums = "0123456789";
assert_eq!(&nums[0..=7], "01234567")
let hello = "안녕하세요";
let slice = &hello[0..2]; // panic 발생 (UTF-8 코드 포인트 중간 자름)

많이 쓰는 변환#

&str <-> String 변환#

// &str → String
let s1: String = "Hello".to_string();
let s2: String = String::from("Hello");
// String → &str
let s3: &str = &s1;

문자(char) 관련 유용한 메서드#

let c: char = 'a';
// 대문자로 변환
assert_eq!(c.to_ascii_uppercase(), 'A');
// 알파벳인지 확인
assert_eq!(c.is_alphabetic(), true);
// 숫자인지 확인
assert_eq!('1'.is_numeric(), true);