๊ด€๋ฆฌ ๋ฉ”๋‰ด

IT’s Portfolio

[Rust] Start Rust (Day 14) - Common Collections ๋ณธ๋ฌธ

Development Study/Rust

[Rust] Start Rust (Day 14) - Common Collections

f1r3_r41n 2023. 2. 20. 17:25
728x90
๋ฐ˜์‘ํ˜•

๐Ÿฆ€ Rust Day 14

๐Ÿณ๏ธ Common Collections

  • ๋‚ด์žฅ๋œ ๋ฐฐ์—ด๊ณผ ํŠœํ”Œ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ปฌ๋ ‰์…˜์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ
    • ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ค‘์— ์–ผ๋งˆ๋“ ์ง€ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • ๋ฒกํ„ฐ(vector) : ์—ฐ์†๋œ ์ผ๋ จ์˜ ๊ฐ’์„ ์ €์žฅํ•จ
  • ๋ฌธ์ž์—ด(string) : ๋ฌธ์ž(character) ์˜ ์ปฌ๋ ‰์…˜
  • ํ•ด์‹œ ๋งต(hash map) : ํŠน์ • ํ‚ค์— ๊ฐ’์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉ. ํ•ด์‹œ ๋งต์€ ๋” ๋ฒ”์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งต(map) ์„ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์ž„

 

1๏ธโƒฃ ๋ฒกํ„ฐ์— ์ผ๋ จ์˜ ๊ฐ’ ์ €์žฅํ•˜๊ธฐ

  • Vec<T> ํƒ€์ž…
    • ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ’์„ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ์†์œผ๋กœ ์ €์žฅ๋จ
    • ์–ด๋–ค ํƒ€์ž…์ด๋“  ์ €์žฅ ๊ฐ€๋Šฅ
    • ํŠน์ •ํ•œ ํƒ€์ž… ์ €์žฅ ์‹œ ํ•ด๋‹น ํƒ€์ž…์— ๋Œ€ํ•œ ์• ๋…ธํ…Œ์ด์…˜์„ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•จ
    • ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ’๋งŒ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿค” ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ

fn main() {
    let v: Vec<i32> = Vec::new();
}
  • Vec::new ํ•จ์ˆ˜๋กœ ์ƒˆ๋กœ์šด ๋นˆ ๋ฒกํ„ฐ ์ƒ์„ฑ
  • ํƒ€์ž…์— ๋Œ€ํ•œ ์• ๋…ธํ…Œ์ด์…˜ ๋ช…์‹œ
  • ๋ฒกํ„ฐ๋Š” ์ œ๋„ค๋ฆญ(generic) ์„ ์ด์šฉํ•ด ๊ตฌํ˜„๋จ
  • ๋Ÿฌ์ŠคํŠธ๋Š” ๋ฒกํ„ฐ์— ์ผ๋‹จ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ํƒ€์ž…์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋นˆ ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ํƒ€์ž… ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ณ„๋กœ ์—†์Œ
fn main() {
    let v = vec![1, 2, 3];
}
  • ์ง€์ •ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฑํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” vec! ๋งคํฌ๋กœ
  • ์ดˆ๊นƒ๊ฐ’ ์ง€์ • ์‹œ i32 ํƒ€์ž…์˜ ๊ฐ’์„ ์ง€์ •ํ–ˆ์œผ๋ฏ€๋กœ ํƒ€์ž… ์• ๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Œ

๐Ÿค” ๋ฒกํ„ฐ ์ˆ˜์ •

fn main() {
    let mut v = Vec::new();
    v.push(4);
    v.push(5);
    v.push(6);
    v.push(7);
}
  • push ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฒกํ„ฐ์— ๊ฐ’ ์ถ”๊ฐ€

๐Ÿค” ๋ฒกํ„ฐ ํ•ด์ œ

  • ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฒกํ„ฐ ์—ญ์‹œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ drop ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋จ
  • ๋ฒกํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’๋„ ํ•จ๊ป˜ ํ•ด์ œ๋จ
    • ๋ชจ๋“  ์ •์ˆ˜๊ฐ’๋„ ํ•ด์ œ๋จ
  • ๋ฒกํ„ฐ์— ์ฐธ์กฐํ˜• ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ผ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ

๐Ÿค” ๋ฒกํ„ฐ๋กœ๋ถ€ํ„ฐ ๊ฐ’ ์ฝ๊ธฐ

fn main() {
    let v = vec![1, 2, 3, 4, 5];

    let third: &i32 = &v[2];
    println!("์„ธ ๋ฒˆ์งธ ์›์†Œ : {third}");
}
// Result
// ์„ธ ๋ฒˆ์งธ ์›์†Œ : 3
  • ์ธ๋ฑ์Šค ๋ฌธ๋ฒ•(indexing syntax) ์ด์šฉ
  • & ์™€ [] ๋ฅผ ์ด์šฉํ•ด ์ €์žฅ๋œ ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฆฌํ„ด
fn main() {
    let v = vec![1, 2, 3, 4, 5];

    match v.get(2) {
        Some(third) => println!("์„ธ ๋ฒˆ์งธ ์›์†Œ : {third}"),
        None => println!("์„ธ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์—†์Œ."),
    }
}
// Result
// ์„ธ ๋ฒˆ์งธ ์›์†Œ : 3
  • get ๋ฉ”์„œ๋“œ ์ด์šฉ
  • Option<&T> ํƒ€์ž…์˜ ๊ฐ’ ๋ฆฌํ„ด
fn main() {
    let v = vec![1, 2, 3, 4, 5];

    let no_value = &v[100];
    let no_value = v.get(100);
}
  • ๋ฒกํ„ฐ์˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ๋•Œ [] ๋ฐฉ์‹์€ ํŒจ๋‹‰(panic) ๋ฐœ์ƒ
    • ์ง€์ •๋œ ์ฐธ์กฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ
  • get ๋ฉ”์„œ๋“œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด None ๊ฐ’์ด ๋ฆฌํ„ด๋จ
fn main() {
    let mut v = vec![1, 2, 3, 4, 5];

    let first = &v[0];

    v.push(6);
}
  • ํ•„์ž์˜ rustc ๋ฒ„์ „์€ 1.62.0 ์ธ๋ฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
    • ์ผ๋‹จ ๊ฐœ๋…์€ ์ •๋ฆฌํ•ด๋‘๋ ค๊ณ  ํ•จ
  • ํ”„๋กœ๊ทธ๋žจ์ด ์œ ํšจํ•œ ์ฐธ์กฐ๊ฐ’์„ ์–ป๊ฒŒ ๋˜๋ฉด ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์œ ํšจํ•  ์ˆ˜ ์žˆ๋„๋ก ๋Œ€์—ฌ๊ฐ’ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํ–‰๋˜์–ด ์†Œ์œ ๊ถŒ๊ณผ ๋Œ€์—ฌ ๊ทœ์น™์„ ์ ์šฉํ•จ
  • ๊ฐ™์€ ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ฐ€๋ณ€ ์ฐธ์กฐ์™€ ๋ถˆ๋ณ€ ์ฐธ์กฐ๋ฅผ ๋™์‹œ์— ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ
  • ํ˜„์žฌ ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฌ์ง€ ์•Š๋‹ค๋ฉด ๋ฒกํ„ฐ์˜ ๋งˆ์ง€๋ง‰์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ด๋ฏธ ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ

๐Ÿค” ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์„ ์ˆœํšŒํ•˜๊ธฐ

fn main() {
    let v = vec![1, 2, 3, 4, 5, 6];

    for i in &v {
        println!("{i}");
    }
}
// Result
// 1
// 2
// 3
// 4
// 5
// 6
  • for ๋ฌธ์„ ์ด์šฉํ•ด ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์— ๋Œ€ํ•œ ๋ถˆ๋ณ€ ์ฐธ์กฐ๋ฅผ ์–ป์–ด์™€ ์ถœ๋ ฅํ•จ
fn main() {
    let mut v = vec![1, 2, 3, 4, 5, 6];

    for i in &mut v {
        *i += 50;
        println!("{i}");
    }
}
// Result
// 51
// 52
// 53
// 54
// 55
// 56
  • ๊ฐ€๋ณ€ ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ์–ป์–ด์™€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•จ
  • ๊ฐ€๋ณ€ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด += ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์ „์— ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž(*) ๋ฅผ ์ด์šฉํ•ด ๋ณ€์ˆ˜ i ์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•จ

๐Ÿค” ์—ด๊ฑฐ์ž๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ํƒ€์ž… ์ €์žฅํ•˜๊ธฐ

  • ์—ด๊ฑฐ์ž์˜ ์—ด๊ฒƒ๊ฐ’์€ ๊ฐ™์€ ์—ด๊ฑฐ์ž ํƒ€์ž…์œผ๋กœ ํ‰๊ฐ€๋˜๋ฏ€๋กœ ๋ฒกํ„ฐ์— ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๋ฉด ์—ด๊ฑฐ์ž๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ•˜๋ฉด ๋จ
enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}

fn main() {
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Float(3.14),
        SpreadsheetCell::Text(String::from("๊ฐ€๋‚˜๋‹ค๋ผ")),
    ];
}
  • ์—ด๊ฑฐ์ž๋ฅผ ์ด์šฉํ•ด ํ•˜๋‚˜์˜ ๋ฒกํ„ฐ์— ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’ ์ €์žฅ
  • ๋ฒกํ„ฐ์— ์–ด๋–ค ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Œ
    • ๋Ÿฌ์ŠคํŠธ๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฒกํ„ฐ์— ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’์ด ์ €์žฅ๋ ์ง€ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ๋‹น์—ฐํžˆ ๊ฐ๊ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋Š ์ •๋„์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ์ง€๋„ ์ •ํ™•ํžˆ ํŒ๋‹จํ•จ
  • ํ”„๋กœ๊ทธ๋žจ์ด ๋ฒกํ„ฐ์— ์ €์žฅํ•ด์•ผ ํ•  ํƒ€์ž…๋“ค์„ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์— ์™„๋ฒฝํžˆ ์•Œ ์ˆ˜ ์—†๋‹ค๋ฉด ์—ด๊ฑฐ์ž๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ณ„๋‹ค๋ฅธ ๋„์›€์ด ๋˜์ง€ ์•Š์Œ

 

2๏ธโƒฃ String ํƒ€์ž…์— UTF-8 ํ˜•์‹์˜ ํ…์ŠคํŠธ ์ €์žฅํ•˜๊ธฐ

  • ๋Ÿฌ์ŠคํŠธ์˜ ๋ฌธ์ž์—ด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๋“ค์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋ฉฐ, UTF-8 ํ˜•์‹์œผ๋กœ ์ €์žฅ๋จ
  • ๋Ÿฌ์ŠคํŠธ์˜ ๋ฌธ์ž์—ด์€ ๋ฐ”์ดํŠธ(bytes) ์˜ ์ปฌ๋ ‰์…˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ด ๋ฐ”์ดํŠธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•จ

๐Ÿค” ๋ฌธ์ž์—ด์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

  • ๋Ÿฌ์ŠคํŠธ๋Š” ์–ธ์–ด์˜ ๋ช…์„ธ ์•ˆ์—์„œ ์˜ค์ง ํ•œ ๊ฐ€์ง€์˜ ๋ฌธ์ž์—ด ํƒ€์ž…, ์ฆ‰ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค์ธ str ํƒ€์ž…๋งŒ์„ ์ง€์›ํ•จ
    • ์ฃผ๋กœ ๊ฐ’์„ ๋Œ€์—ฌํ•œ &str ์˜ ํ˜•ํƒœ๋กœ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž„
    • ์–ด๋”˜๊ฐ€์— UTF-8 ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์ €์žฅ๋œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ
    • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฒฐ๊ณผ ํŒŒ์ผ์— ํฌํ•จ๋˜๋ฏ€๋กœ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค์ž„
  • String ํƒ€์ž…์€ ์–ธ์–ด์˜ ๋ช…์„ธ์— ์ •์˜๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋Ÿฌ์ŠคํŠธ์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…
    • ๊ธธ์ด ์กฐ์ •์ด๋‚˜ ๋‚ด์šฉ ๋ณ€๊ฒฝ, ์†Œ์œ  ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ UTF-8 ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด ํƒ€์ž…
  • ๋Ÿฌ์ŠคํŠธ์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” OsString, OsStr, CString, CStr ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ฌธ์ž์—ด ํƒ€์ž…๋„ ์ œ๊ณต
    • ์ด ๋ฌธ์ž์—ด ํƒ€์ž…๋“ค์€ ๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ ํ˜•์‹์˜ ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋˜๊ธฐ๋„ ํ•จ

๐Ÿค” ์ƒˆ ๋ฌธ์ž์—ด ์ƒ์„ฑํ•˜๊ธฐ

  • String ํƒ€์ž…์€ Vec<T> ํƒ€์ž…์ด ์ง€์›ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„ ์ž‘์—…์„ ์ง€์›ํ•จ
fn main() {
    let mut s = String::new();
}
  • ์ƒˆ๋กœ์šด ๋นˆ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ด ๋ณ€์ˆ˜ s์— ํ• ๋‹น
fn main() {
    let data = "First String";
    let s = data.to_string();
    // let s = "First String".to_string();
}
  • ๋ฌธ์ž์—ด ์ƒ์„ฑ ์‹œ ์ดˆ๊นƒ๊ฐ’ ์ง€์ •
  • Display ํฌ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ํƒ€์ž…์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” to_string ํ•จ์ˆ˜ ํ™œ์šฉ
fn main() {
    let mut s = String::from("First String");
}
  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ String ํƒ€์ž… ์ƒ์„ฑ ์‹œ from ํ•จ์ˆ˜ ์ด์šฉ
  • String::from ๊ณผ to_string ์€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์ž์‹ ์˜ ์Šคํƒ€์ผ์— ๋”ฐ๋ผ ์„ ํƒํ•ด ์‚ฌ์šฉํ•˜๋ฉด ๋จ

๐Ÿค” ๋ฌธ์ž์—ด ์ˆ˜์ •ํ•˜๊ธฐ

(1) push_str ๊ณผ push ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ๋ง๋ถ™์ด๊ธฐ

fn main() {
    let mut s = String::from("foot");
    s.push_str("ball");

    println!("{s}");
}
// Result
// football
  • push_str ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค๋ฅผ String ์— ๋ง๋ถ™์ž„
  • push_str ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ
fn main() {
    let mut s1 = String::from("foot");
    let s2 = "ball";
    s1.push_str(s2);

    println!("s1: {s1}\ns2: {s2}");
}
// Result
// s1: football
// s2: ball
  • push_str ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€์ˆ˜ s2์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค๋ฉด ์ถœ๋ ฅ๋ฌธ์—์„œ ๋ณ€์ˆ˜ s2๋Š” ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋จ
fn main() {
    let mut s = String::from("coffe");
    s.push('e');

    println!("{s}");
}
// Result
// coffee
  • push ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž(character) ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ String ์— ์ถ”๊ฐ€

 

(2) + ์—ฐ์‚ฐ์ž๋‚˜ format! ๋งคํฌ๋กœ๋ฅผ ์ด์šฉํ•œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ

fn main() {
    let s1 = String::from("Football");
    let s2 = String::from(" Manager");
    let s3 = s1 + &s2;
    println!("{s3}");
}
// Result
// Football Manager
  • ๋ณ€์ˆ˜ s1์€ ์œ ํšจํ•˜์ง€ ์•Š์Œ
    • + ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ add ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋จ
    • fn add(self, s: &str) -> String {
      • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” add ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด ์„ ์–ธํ•จ
      • ํ•ด๋‹น ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” String ์„ ์ด์šฉํ•ด add ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ์‹ค์ œ ์‚ฌ์šฉํ•œ ํƒ€์ž…์œผ๋กœ ์น˜ํ™˜๋œ ์ดํ›„์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์ž„
      • ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์˜ ์ฐธ์กฐ ๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์— ์ถ”๊ฐ€ํ•˜๊ณ  String ํƒ€์ž…์„ ๋ฆฌํ„ดํ•จ
      • add ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ s๊ฐ€ ์ฐธ์กฐ ํ˜•์‹์ด๋ฏ€๋กœ String ์—๋Š” ์˜ค์ง &str ํƒ€์ž…์˜ ๊ฐ’๋งŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‘ ๊ฐœ์˜ String ๊ฐ’์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์—†์Œ
      • ์œ„ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜ s2์˜ ํƒ€์ž…์€ &String ์ธ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ &String ์ธ์ˆ˜๋ฅผ &str ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ
      • add ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋Ÿฌ์ŠคํŠธ๋Š” ๊ฐ•์ œ ์—ญ์ฐธ์กฐ(deref coercion) ๋ฅผ ์ด์šฉํ•˜์—ฌ &s2 ๋ฅผ &s2[..] ๋กœ ๋ณ€ํ™˜ํ•จ
    • ์ฆ‰, s1์˜ ์†Œ์œ ๊ถŒ์„ ํ™•๋ณดํ•œ ํ›„ s2์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋ง๋ถ™์ธ ํ›„ ๊ทธ ๊ฒฐ๊ด๊ฐ’์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ž„
fn main() {
    let s1 = String::from("one");
    let s2 = String::from("two");
    let s3 = String::from("three");

    // let add_s = s1 + "-" + &s2 + "-" + &s3;
    let format_s = format!("{}-{}-{}", s1, s2, s3);
    println!("{format_s}");
}
// Result
// one-two-three
  • ๋ฌธ์ž์—ด์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฒฐํ•ฉํ•  ๋•Œ, + ์—ฐ์‚ฐ์ž๋Š” ๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ
  • format! ๋งคํฌ๋กœ๋Š” println! ๋งคํฌ๋กœ์™€ ์™„์ „ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ํ™”๋ฉด์— ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋Œ€์‹  ๊ฒฐํ•ฉ๋œ String ๊ฐ’์„ ๋ฆฌํ„ดํ•จ
  • format! ๋งคํฌ๋กœ๋Š” ๊ฐ€๋…์„ฑ์ด ์ข‹์„ ๋ฟ ์•„๋‹ˆ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์†Œ์œ ๊ถŒ๋„ ์—†์Œ

 

๐Ÿค” ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค

  • ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๋ฌธ์ž์—ด์— ์ €์žฅ๋œ ๊ฐœ๋ณ„ ๋ฌธ์ž๋ฅผ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
  • ๋Ÿฌ์ŠคํŠธ์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด String ๊ฐ’์˜ ์ผ๋ถ€์— ์ ‘๊ทผํ•˜๋ ค ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ
  • ๋Ÿฌ์ŠคํŠธ์˜ ๋ฌธ์ž์—ด์€ ์ธ๋ฑ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ

 

(1) ๋ฌธ์ž์—ด์˜ ๋‚ด๋ถ€

  • String ์€ Vec<u8> ํƒ€์ž…์„ ํ•œ ๋ฒˆ ๊ฐ์‹ผ ํƒ€์ž…์ž„
let len = String::from("Hello").len();
// Result
// 5
  • ๋ณ€์ˆ˜ len์˜ ๊ฐ’์€ 5
  • ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๋ฌธ์ž์—ด 'Hello' ์˜ ๊ธธ์ด๊ฐ€ 5bytes
  • UTF-8 ๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž๋“ค์€ ํ•œ ๊ธ€์ž๋‹น 1byte
let len = String::from("์•ˆ๋…•ํ•˜์„ธ์š”").len();
  • ๋Ÿฌ์ŠคํŠธ์—์„œ ์ด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 15
  • ํ•ด๋‹น ๋ฌธ์ž์—ด์„ UTF-8 ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด 15bytes ์‚ฌ์šฉ
    • ๋ฌธ์ž์—ด ์•ˆ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ์Šค์นผ๋ผ๊ฐ’์€ 3bytes ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ
    • ๋ฌธ์ž์—ด์˜ ๋ฐ”์ดํŠธ์— ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Œ
let s = String::from("์•ˆ๋…•ํ•˜์„ธ์š”");
let ans = &s[0];
  • ํ•ด๋‹น ๋ฌธ์ž์—ด์„ UTF-8 ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” 236์ด๊ณ  ๋‘ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” 149
  • ๋Ÿฌ์ŠคํŠธ๋Š” ์ธ๋ฑ์Šค 0์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด๊ฐ€ ์•„๋‹Œ ๋ฐ”์ดํŠธ๊ฐ’ 236๋ฟ์ž„
  • ๋•Œ๋ฌธ์— ๋Ÿฌ์ŠคํŠธ๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์Œ

 

(2) ๋ฐ”์ดํŠธ์™€ ์Šค์นผ๋ผ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜ํ•Œ ํด๋Ÿฌ์Šคํ„ฐ

  • ๋Ÿฌ์ŠคํŠธ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋ฌธ์ž์—ด์€ ํฌ๊ฒŒ ๋ฐ”์ดํŠธ(bytes), ์Šค์นผ๋ผ๊ฐ’(scalar values), ๊ทธ๋ž˜ํ•Œ ํด๋Ÿฌ์Šคํ„ฐ(grapheme clusters, ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์ž๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ) ๋“ฑ ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•จ
    • ๊ทธ๋ž˜ํ•Œ์ด๋ž€, ์–ด๋–ค ์–ธ์–ด์˜ ์ฒ ์ž ์ฒด๊ณ„์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•จ. ์•ŒํŒŒ๋ฒณ์˜ ๊ฒฝ์šฐ ๊ฐ ์ž๋ชจ๊ฐ€ ์ด์— ํ•ด๋‹นํ•จ.
  • ํ•œ๊ธ€ '์•ˆ๋…•ํ•˜์„ธ์š”' ์˜ u8 ๊ฐ’๋“ค
    • [236, 149, 136, 235, 133, 149, 237, 149, 152, 236, 132, 184, 236, 154, 148]
    • ์ด 15๊ฐœ์˜ ๋ฐ”์ดํŠธ๊ฐ’์ด ์ปดํ“จํ„ฐ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ
  • 15๊ฐœ์˜ ๋ฐ”์ดํŠธ๊ฐ’์„ ๋Ÿฌ์ŠคํŠธ์˜ char ํƒ€์ž…์ธ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ๊ฐ’์œผ๋กœ ํ‘œํ˜„
    • ['์•ˆ', '๋…•', 'ํ•˜', '์„ธ', '์š”']
    • ์ด 5๊ฐœ์˜ char ๊ฐ’
  • 15๊ฐœ์˜ ๋ฐ”์ดํŠธ๊ฐ’์„ ๊ทธ๋ž˜ํ•Œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ํ‘œํ˜„
    • ["์•ˆ", "๋…•", "ํ•˜", "์„ธ", "์š”"]
  • ๋Ÿฌ์ŠคํŠธ๊ฐ€ String ํƒ€์ž…์—์„œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋งˆ์ง€๋ง‰ ์ด์œ 
    • ์ธ๋ฑ์Šค ์ฒ˜๋ฆฌ์—๋Š” ํ•ญ์ƒ ์ผ์ •ํ•œ ์‹œ๊ฐ„($O(1)$)์ด ์†Œ์š”๋˜์–ด์•ผ ํ•˜์ง€๋งŒ String ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋งŒํผ์€ ์ผ์ •ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Œ
    • ๋Ÿฌ์ŠคํŠธ๋Š” ์œ ํšจํ•œ ๋ฌธ์ž๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…์ธ ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์Šค์บ”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ

 

๐Ÿค” ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค ํ•˜๊ธฐ

  • ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ธ๋ฑ์‹ฑ ์ž‘์—…์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ ํƒ€์ž…์ด ํ•˜๋‚˜์˜ ๋ฐ”์ดํŠธ๊ฐ’, ํ•˜๋‚˜์˜ ๋ฌธ์ž, ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ•Œ ํด๋ž˜์Šคํ„ฐ ํ˜น์ธ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Œ
  • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด [] ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค์— ์ €์žฅํ•  ํŠน์ • ๋ฐ”์ดํŠธ ์˜ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•ด์•ผ ํ•จ
fn main() {
    let s = String::from("์•ˆ๋…•ํ•˜์„ธ์š”");
    println!("{}", &s[0..3]);
}
// Result
// ์•ˆ
  • ๋ณ€์ˆ˜ s๋Š” ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ 3bytes ๊ฐ’์„ ์ €์žฅํ•˜๋Š” &str ํƒ€์ž…
  • &s[0..1] ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ฒกํ„ฐ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•  ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ

๐Ÿค” ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ

fn main() {
    let s = String::from("์•ˆ๋…•ํ•˜์„ธ์š”");
    for c in s.chars() {
        println!("{c}");
    }
}
// Result
// ์•ˆ
// ๋…•
// ํ•˜
// ์„ธ
// ์š”
  • ๊ฐœ๋ณ„ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ๊ฐ’์„ ์กฐ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋ฉด chars ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  • ์œ ํšจํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ๊ฐ’์€ 1byte๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋จ
  • chars ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ž์—ด์„ char ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฆฌํ•จ
fn main() {
    let s = String::from("์•ˆ๋…•ํ•˜์„ธ์š”");
    for b in s.bytes() {
        println!("{b}");
    }
}
  • bytes ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฐ”์ดํŠธ๋ฅผ ๋ฆฌํ„ดํ•จ

 

3๏ธโƒฃ ํ‚ค์™€ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ ๋งต

  • HashMap<K, V> ํƒ€์ž…์€ K ํƒ€์ž…์˜ ํ‚ค์— V ํƒ€์ž…์˜ ๊ฐ’์„ ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅ
  • ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
    • ํ•ด์‹œ, ๋งต, ๊ฐ์ฒด, ํ•ด์‹œ ํ…Œ์ด๋ธ”(hash table), ๋”•์…”๋„ˆ๋ฆฌ(dictionary), ์—ฐ๊ด€ ๋ฐฐ์—ด(associative array) ๋“ฑ
  • ํ•ด์‹œ ๋งต์€ ๋ฒกํ„ฐ์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ด๋–ค ํƒ€์ž…์ด๋“  ๊ด€๊ณ„์—†์ด ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉ

๐Ÿค” ์ƒˆ๋กœ์šด ํ•ด์‹œ ๋งต ์ƒ์„ฑํ•˜๊ธฐ

use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();
    scores.insert(
        String::from("Blue"),
        20
    );
    scores.insert(
        String::from("Yellow"),
        50
    );

    println!("{:#?}", scores);
}
// Result
// {
//     "Yellow": 50,
//     "Blue": 20,
// }
  • new ํ•จ์ˆ˜๋กœ ๋นˆ ํ•ด์‹œ ๋งต ์ƒ์„ฑ
  • insert ํ•จ์ˆ˜๋กœ ์ƒˆ๋กœ์šด ํ‚ค์™€ ๊ฐ’์„ ์ถ”๊ฐ€
  • ํ•ด์‹œ ๋งต์€ ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋‚ฎ์•„ ํ”„๋ ๋ฅ˜๋“œ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ํ˜„์žฌ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ง€์›๋„ ๋นˆ์•ฝํ•จ
  • ํ•ด์‹œ ๋งต์€ ๋ฒกํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฉฐ, ๋ชจ๋“  ํ‚ค์™€ ๋ชจ๋“  ๊ฐ’์˜ ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•จ
use std::collections::HashMap;

fn main() {
    let teams = vec![
        String::from("Blue"),
        String::from("Yellow")
    ];
    let score = vec![20, 50];

    let scores: HashMap<_, _> = teams.iter()
        .zip(score.iter()).collect();

    println!("{:#?}", scores);
}
// Result
// {
//     "Blue": 20,
//     "Yellow": 50,
// }
  • ํ‚ค์™€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŠœํ”Œ์˜ ๋ฒกํ„ฐ์— ๋Œ€ํ•ด collect ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
  • collect ๋ฉ”์„œ๋“œ
    • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ปฌ๋ ‰์…˜์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•จ
    • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ์ค‘ ์–ด๋–ค ํƒ€์ž…์„ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•˜๋Š” ํƒ€์ž… ์• ๋…ธํ…Œ์ด์…˜ ํ•„์š”
  • ํƒ€์ž… ์• ๋…ธํ…Œ์ด์…˜ ์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ ๋ฐ‘์ค„(_) ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒกํ„ฐ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ด์šฉํ•ด ํ‚ค์™€ ๊ฐ’์˜ ํƒ€์ž…์„ ์•Œ์•„์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
fn main() {
    let teams = vec![
        String::from("Blue"),
        String::from("Yellow")
    ];
    let score = vec![20, 50];

    let scores = teams.iter().zip(score.iter());

    for i in scores {
        println!("{:#?}", i);
    }
}
// Result
// (
//     "Blue",
//     20,
// )
// (
//     "Yellow",
//     50,
// )
  • zip ๋ฉ”์„œ๋“œ๋กœ๋Š” ํŠœํ”Œ์˜ ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿค” ํ•ด์‹œ ๋งต๊ณผ ์†Œ์œ ๊ถŒ

  • i32 ์ฒ˜๋Ÿผ Copy ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํƒ€์ž…์€ ๊ฐ’๋“ค์ด ํ•ด์‹œ ๋งต์œผ๋กœ ๋ณต์‚ฌ๋จ
  • String ์ฒ˜๋Ÿผ ๊ฐ’์„ ์†Œ์œ ํ•˜๋Š” ํƒ€์ž…์€ ๊ฐ’์ด ํ•ด์‹œ ๋งต์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ, ํ•ด์‹œ ๋งต์ด ๊ทธ ๊ฐ’๋“ค์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ–๊ฒŒ ๋จ
  • ํ•ด์‹œ ๋งต์— ๊ฐ’์˜ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ๊ฐ’์€ ํ•ด์‹œ ๋งต์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Œ
    • ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ ํ•ด์‹œ ๋งต์ด ์œ ํšจํ•œ ๋ฒ”์œ„์— ์žˆ๋Š” ๋™์•ˆ ํ•จ๊ป˜ ์œ ํšจํ•ด์•ผ ํ•จ

๐Ÿค” ํ•ด์‹œ ๋งต์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ธฐ

use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 20);
    scores.insert(String::from("Yellow"), 50);

    let score = scores.get(
        &String::from("Blue")
    );

    println!("{:#?}", score);
}
// Result
// Some(
//     20,
// )
  • get ๋ฉ”์„œ๋“œ์— ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ’์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • get ๋ฉ”์„œ๋“œ๋Š” Option<&V> ํƒ€์ž…์„ ๋ฆฌํ„ดํ•จ
    • ์ฆ‰, ํ•ด์‹œ ๋งต์˜ ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด None ์„ ๋ฆฌํ„ด
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 20);
    scores.insert(String::from("Yellow"), 50);

    for (key, value) in &scores {
        println!("{key} : {value}");
    }
}
// Result
// Yellow : 50
// Blue : 20
  • for ๋ฃจํ”„๋ฅผ ์ด์šฉํ•œ ํ•ด์‹œ ๋งต ํ‚ค์™€ ๊ฐ’์˜ ์Œ ์ˆœํšŒ ์ถœ๋ ฅ
  • ํ•ด์‹œ ๋งต์˜ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์„ ์ž„์˜์˜ ์ˆœ์„œ ๋กœ ์ถœ๋ ฅํ•จ

๐Ÿค” ํ•ด์‹œ ๋งต ์ˆ˜์ •ํ•˜๊ธฐ

  • ํ•ด์‹œ ๋งต์˜ ๊ฐ ํ‚ค์—๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ

 

(1) ๊ฐ’ ๋ฎ์–ด์“ฐ๊ธฐ

  • ํ•ด์‹œ ๋งต์— ํ‚ค์™€ ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ํ›„ ๊ฐ™์€ ํ‚ค์— ๋‹ค๋ฅธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ‚ค์— ํ• ๋‹น๋˜์—ˆ๋˜ ๊ฐ’์ด ๊ต์ฒด๋จ

 

(2) ํ‚ค์— ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ๋งŒ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ํ•ด์‹œ ๋งต์€ ๊ฐ’์˜ ํ• ๋‹น ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ํ‚ค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” entry ๋ผ๋Š” ํŠน๋ณ„ํ•œ API๋ฅผ ์ œ๊ณตํ•จ
  • entry ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์€ ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” Entry ์—ด๊ฑฐ์ž์ž„
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 20);

    scores.entry(String::from("Yellow")).or_insert(50);
    scores.entry(String::from("Blue")).or_insert(50);

    println!("{:#?}", scores);
}
// Result
// {
//     "Blue": 20,
//     "Yellow": 50,
// }
  • Entry ์—ด๊ฑฐ์ž์˜ or_insert ๋ฉ”์„œ๋“œ๋Š” ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ทธ ํ‚ค์— ์—ฐ๊ฒฐ๋œ ๊ฐ’์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ๋ฆฌํ„ด
    • ์กด์žฌํ•˜์ง€ ์•Š์„ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํ‚ค์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ํ›„ ์ด ์ƒˆ ๊ฐ’์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ ๋ฆฌํ„ด

 

(3) ๊ธฐ์กด ๊ฐ’์— ๋”ฐ๋ผ ๊ฐ’ ์ˆ˜์ •ํ•˜๊ธฐ

use std::collections::HashMap;

fn main() {
    let s = "hello world pretty wonderful world";
    let mut map = HashMap::new();

    for word in s.split(' ') {
        let count = map.entry(word).or_insert(0);
        *count += 1;
    }

    println!("{:#?}", map);
}
// Result
// {
//     "wonderful": 1,
//     "pretty": 1,
//     "hello": 1,
//     "world": 2,
// }
  • ํ…์ŠคํŠธ ์•ˆ์—์„œ ๊ฐ ๋‹จ์–ด๊ฐ€ ๋ช‡ ๋ฒˆ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์„ธ๋Š” ์ฝ”๋“œ
  • or_insert ๋ฉ”์„œ๋“œ๋Š” ํ‚ค์— ํ• ๋‹น๋œ ๊ฐ’์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ(&mut V) ๋ฅผ ๋ฆฌํ„ด
    • ํ•ด๋‹น ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ count ๋ณ€์ˆ˜์— ์ €์žฅํ–ˆ์œผ๋ฏ€๋กœ ์ด ๋ณ€์ˆ˜์— ์ƒˆ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๋ฉด ์• ์Šคํ„ฐ๋ฆฌ์Šคํฌ(*) ๋ฅผ ์ด์šฉํ•ด count ๋ณ€์ˆ˜๋ฅผ ์—ญ์ฐธ์กฐํ•ด์•ผ ํ•จ
    • ๊ฐ€๋ณ€ ์ฐธ์กฐ๋Š” for ๋ฃจํ”„๊ฐ€ ๋๋‚˜๋ฉด ๋ฒ”์œ„ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ ๊ฐ’ ๋Œ€์—ฌ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿค” ํ•ด์‹œ ํ•จ์ˆ˜

  • ํ•ด์‹œ ๋งต์€ ์•”ํ˜ธํ•™์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS, Denial of Service) ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ€์žฅ ๋น ๋ฅธ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์–ด๋Š ์ •๋„์˜ ์„ฑ๋Šฅ์„ ํฌ์ƒํ•˜๋ฉด์„œ ๋ณด์•ˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์€ ํ•„์š”ํ•จ

 

Summary

  • ๋ฒกํ„ฐ, ๋ฌธ์ž์—ด, ํ•ด์‹œ ๋งต์€ ๋Œ€๋ถ€๋ถ„ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐฉ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ
728x90
๋ฐ˜์‘ํ˜•
Comments