Rust 튜토리얼 목차

문자열

Rust에서 문자열을 다루는 데에는 주로 세 가지 타입이 사용됩니다.

str, &str, String

이 세 가지 타입의 차이와 예제, 그리고 to_owned()와 to_string() 메소드의 차이에 대해 알아보겠습니다.


str: 이 타입은 문자열 리터럴을 나타냅니다.

보통 직접 사용하지 않고 &str 형태로 참조합니다. str 타입은 불변이며 크기가 고정되어 있습니다.

// 예제 1
let my_literal: &'static str = "안녕하세요!";
// let a: str = "abc"; 불가능: str이 고정 크기가 아니라 런타임에 크기가 결정되기 때문
// Sized, ?Sized 개념, 컴파일 시점에 크기가 결정되지 않는 타입은 직접 사용하는 것이 불가능

&str: 이 타입은 str의 참조이며 불변이며 문자열 슬라이스를 나타냅니다.

&str을 사용하면, 메모리를 절약하면서 문자열의 일부분을 참조할 수 있습니다.

&str은 실제 문자열 데이터를 저장하는 것이 아니라, 메모리의 문자열 데이터를 가리키는 참조입니다.

이러한 방식을 사용함으로써, Rust는 안전성과 소유권을 보장할 수 있습니다.

// 예제 2
let full_name = "홍길동";
let first_name: &str = &full_name[..6]; // "홍길"만 참조, 한글 3bytes, 알파벳 1byte

String: 이 타입은 가변하며 크기가 변경될 수 있는 문자열입니다.

String은 Heap에 저장되며, 필요에 따라 크기를 늘이거나 줄일 수 있습니다.

// 예제 3
let mut my_string = String::from("안녕하세요!");
my_string.push_str(" 만나서 반가워요!");

to_owned()와 to_string() 메소드의 차이점:

to_owned(): &str이나 다른 불변 타입의 참조에서 가변 타입으로 변경할 때 사용합니다.

예를 들어, &str에서 String으로 변경할 때 사용할 수 있습니다.

let my_str = "안녕하세요!";
let my_string = my_str.to_owned(); // String 타입으로 변경

to_string(): ToString 트레잇(trait)을 구현하는 타입의 인스턴스를 문자열로 변환할 때 사용합니다.

일반적으로 숫자 타입이나 사용자 정의 타입에서 String으로 변환할 때 사용합니다.

let my_number = 42;
let my_number_string = my_number.to_string(); // "42"라는 String 타입으로 변경

to_owned()와 to_string()의 차이점은 사용 목적과 적용 대상이 다릅니다.

to_owned()는 불변 참조를 가변 타입으로 변경하는 데 사용되며,

to_string()은 ToString 트레잇을 구현하는 타입을 문자열로 변환하는 데 사용됩니다.

문자열의 경우, to_owned()와 to_string()이 동일한 결과를 반환하지만, 다른 타입에 대해서는 다른 목적으로 사용됩니다.

일반적으로 문자열 리터럴을 String으로 변환할 때는 to_string()을 사용하고,

&str에서 String으로 소유권을 이전할 때는 to_owned()를 사용하는 것이 일반적인 관례입니다.

즉, 문자열의 경우에는 두 메소드 모두 String으로의 변환을 수행하지만,

다른 타입들의 경우에는 to_string()이 문자열 변환을 처리하고, to_owned()는 다른 목적으로 사용됩니다.

참고: @Rust 공식 문서