String

String은 νž™μ— ν• λ‹Ήλ˜κ³  κ°€λ³€ 길이의 ν‘œμ€€ UTF-8 λ¬Έμžμ—΄ λ²„νΌμž…λ‹ˆλ‹€:

fn main() {
    let mut s1 = String::new();
    s1.push_str("μ•ˆλ…•ν•˜μ„Έμš”");
    println!("s1: len = {}, μš©λŸ‰ = {}", s1.len(), s1.capacity());

    let mut s2 = String::with_capacity(s1.len() + 1);
    s2.push_str(&s1);
    s2.push('!');
    println!("s2: len = {}, μš©λŸ‰ = {}", s2.len(), s2.capacity());

    let s3 = String::from("πŸ‡¨πŸ‡­");
    println!("s3: len = {}, 문자 수 = {}", s3.len(), s3.chars().count());
}

String은 Deref<Target = str>을 κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ΄λŠ” , String 값에 λŒ€ν•΄μ„œλ„ str의 λͺ¨λ“  λ©”μ„œλ“œλ₯Ό 호좜 ν•  수 μžˆλ‹€λŠ” 의미 μž…λ‹ˆλ‹€.

This slide should take about 10 minutes.
  • String::newλŠ” μƒˆλ‘œμš΄ 빈 λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€. String::with_capacityλŠ” μƒˆλ‘œ λ§Œλ“€ λ¬Έμžμ—΄ 버퍼에 넣을 데이터 크기λ₯Ό μ•Œκ³  μžˆλŠ” κ²½μš°μ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • String::len은 String의 λ°”μ΄νŠΈ 크기λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. (μ‹€μ œ 문자 κ°œμˆ˜μ™€λŠ” λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.)
  • String::charsλŠ” μ‹€μ œ 문자(character)듀에 λŒ€ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. char둜 ν‘œν˜„λ˜λŠ” λ¬ΈμžλŠ” μš°λ¦¬κ°€ μ‹€μ œλ‘œ μΈμ‹ν•˜κ³  μ‚¬μš©ν•˜λŠ” λ¬Έμžμ™€λŠ” λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μžμ†Œ κ²°ν•©μœΌλ‘œ 문자λ₯Ό ν‘œν˜„ν•˜λŠ” κ²½μš°κ°€ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 이에 λŒ€ν•΄μ„œλŠ” Grapheme Clusterλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.
  • μ‚¬λžŒλ“€μ΄ λ¬Έμžμ—΄μ΄λΌκ³  말할 λ•Œμ—λŠ” &strμ΄κ±°λ‚˜ String일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ–΄λ–€ νƒ€μž…μ΄ Deref<Target = T>λ₯Ό κ΅¬ν˜„ν•˜κ³  있으면, μ»΄νŒŒμΌλŸ¬λŠ” μ—¬λŸ¬λΆ„μ΄ T의 λ©”μ†Œλ“œλ“€μ„ ν˜ΈμΆœν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.
    • Deref νŠΈλ ˆμž‡μ— κ΄€ν•΄μ„œ 아직 닀루지 μ•Šμ•˜μœΌλ―€λ‘œ 이 μ‹œμ μ—μ„œλŠ” μ΄κ²ƒμœΌλ‘œ λ¬Έμ„œμ˜ μ‚¬μ΄λ“œλ°” ꡬ쑰가 λŒ€λΆ€λΆ„ μ„€λͺ…λ©λ‹ˆλ‹€.
    • String은 Deref<Target = str>을 κ΅¬ν˜„ν•˜κ³  있기 λ•Œλ¬Έμ— String에 λŒ€ν•΄μ„œλ„ str λ©”μ†Œλ“œλ“€μ„ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • Write and compare let s3 = s1.deref(); and let s3 = &*s1;.
  • String은 λ°”μ΄νŠΈ λ²‘ν„°μ˜ 래퍼둜 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 벑터가 μ§€μ›ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ 연산듀을 String도 μ§€μ›ν•©λ‹ˆλ‹€. λ‹€λ§Œ String은 λͺ‡κ°€μ§€ 보μž₯ λ‚΄μš©μ΄ 더 μžˆμŠ΅λ‹ˆλ‹€.
  • String을 인덱슀둜 μ ‘κ·Όν•˜λŠ” 방법듀을 λΉ„κ΅ν•΄λ³΄μ„Έμš”:
    • s3.chars().nth(i).unwrap()λ₯Ό μ΄μš©ν•˜μ—¬ ν•œ 문자λ₯Ό μ„ νƒν•˜λŠ” 경우, i값이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚  λ•Œ, λ²—μ–΄λ‚˜μ§€ μ•Šμ„ λ•Œ λ™μž‘μ„ μ„€λͺ…ν•˜μ„Έμš”.
    • s3[0..4]λ₯Ό μ΄μš©ν•΄μ„œ λ¬Έμžμ—΄μ˜ 일뢀λ₯Ό μ„ νƒν•˜λŠ”λ°, μŠ¬λΌμ΄μŠ€κ°€ μœ λ‹ˆμ½”λ“œ λ¬Έμžμ—΄ 경계에 λ”± λ§žμ§€ μ•Šμ„ 경우 μ–΄λ–»κ²Œ λ˜λŠ”μ§€ μ„€λͺ…ν•˜μ„Έμš”.
  • Many types can be converted to a string with the to_string method. This trait is automatically implemented for all types that implement Display, so anything that can be formatted can also be converted to a string.