C.W.K.
Stream
Lesson 02 of 06 · published

String vs &str

~11 min · collections, string, str, utf8

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

Rust 의 텍스트는 두 타입으로 갈려 있고, 그 분리가 처음엔 다들 헷갈려: String&str. 구분은 정확히 네가 이미 아는 소유 vs 빌림 분리야.

String 은 소유; &str 은 빌림

String 은 자라는 힙 할당 소유 UTF-8 버퍼야 — append 할 수 있고, drop 될 때 메모리를 해제해. &str ('문자열 슬라이스') 는 다른 누군가가 소유하는 UTF-8 텍스트로의 빌린 view 야 — owner 가 아니라 창문. 문자열 리터럴 "hi" 는 네 바이너리를 가리키는 &str 이야.

어디에 뭘 쓰나

함수 파라미터엔 &str 을 받아 — 리터럴이랑 빌린 String 둘 다 받거든. 소유권 필요하면 String 을 반환/저장해. String 은 String::from, .to_string(), format! 로 짓고; push_str 로 append 해. &String 에서 &str 로 coercion 이 자동이라, &str 파라미터가 둘 다와 '그냥 돼'.

UTF-8 은 정수 인덱싱이 없다는 뜻이야. String 에 s[0] 을 못 써 — 글자가 여러 바이트일 수 있어서 바이트로 인덱싱하면 하나를 쪼갤 수 있거든. 글자엔 .chars(), raw 바이트엔 .bytes() 로 순회하고, 알려진 char 경계에서만 슬라이스해. Rust 는 Unicode 를 존중하게 만들어.

왜 타입 둘이 사실 더 단순하냐

체화하기 전엔 오버헤드 같아: 타입이 누가 텍스트를 소유하는지 말해줘. struct 의 String = struct 가 자기 텍스트를 소유하고 lifetime 걱정 없음. &str = 출처에 묶인 빌림. 소유 vs 빌림이 click 하면 (Borrowing 트랙에서 됐지), 두 문자열 타입이 헷갈림을 멈추고 정보가 되기 시작해.

Code

소유 String, 빌린 &str, char 순회·rust
fn shout(text: &str) -> String {       // &str 받고, 소유 String 반환
    format!("{}!", text.to_uppercase())
}

fn main() {
    let owned = String::from("hello");  // 힙 버퍼를 소유
    let literal = "world";              // 바이너리에 구워진 &'static str

    println!("{}", shout(&owned));      // &String 이 &str 로 coerce
    println!("{}", shout(literal));     // 리터럴은 이미 &str

    // UTF-8: char 순회, 바이트 인덱싱 안 함
    for c in "héllo".chars() {
        print!("{c} ");
    }
    println!();
}

External links

Exercise

각 공백-구분 단어의 첫 글자를 대문자로 반환하는 fn initials(name: &str) -> String 를 써봐. 리터럴이랑 String 으로 불러. 그다음 name[0] 을 시도하고 Rust 가 왜 문자열을 정수로 인덱싱 못 하게 하는지 읽어.
Hint
.split_whitespace().chars().next() 를 써. 정수 인덱싱은 UTF-8 char 가 여러 바이트에 걸칠 수 있어서 금지야 — name[0] 이 글자 중간에 떨어질 수 있으니 Rust 가 char 순회를 시켜.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.