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

IT’s Portfolio

[Rust] Start Rust (Day 9) - Understanding Ownership ๋ณธ๋ฌธ

Development Study/Rust

[Rust] Start Rust (Day 9) - Understanding Ownership

f1r3_r41n 2023. 1. 24. 21:43
728x90
๋ฐ˜์‘ํ˜•

๐Ÿฆ€ Rust Day 9

๐Ÿณ๏ธ Understanding Ownership

  • ์†Œ์œ ๊ถŒ์€ ๋Ÿฌ์ŠคํŠธ์˜ ๋…ํŠนํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜
  • ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ(Garbage Collector)์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋ ค๋Š” ๋Ÿฌ์ŠคํŠธ๋งŒ์˜ ํ•ด๋ฒ•
    • Garbage Collection (ํ†ต์นญ GC)
      • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ ๋” ์ด์ƒ ์“ฐ์ด์ง€ ์•Š๋Š” ์˜์—ญ์„ ์ž๋™์œผ๋กœ ์ฐพ์•„๋‚ด์–ด ํ•ด์ œํ•˜๋Š” ๊ธฐ๋Šฅ
      • ์‹œ์Šคํ…œ์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ปฌ๋ ‰ํ„ฐ๋ผ ์นญํ•จ
      • ๋ณดํ†ต ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘ ๊ธฐ๋Šฅ์„ ์ฑ„ํƒํ•œ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ํ•˜๊ฒŒ ํ•˜๋Š” ๋Œ€์‹ ์— ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘๊ธฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์ค‘๊ฐ„์ค‘๊ฐ„์— ์“ธ๋ชจ๊ฐ€ ์—†์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ, ์ฆ‰ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์•Œ์•„์„œ ์ˆ˜์ง‘ํ•จ

1๏ธโƒฃ ์†Œ์œ ๊ถŒ์ด๋ž€?

  • ์†Œ์œ ๊ถŒ์€ ๋Ÿฌ์ŠคํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ. ์–ธ์–ด ์ „์ฒด์— ๊นŠ์ด ๊ด€์—ฌํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋…
  • ํ”„๋กœ๊ทธ๋žจ๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•
    • ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์–ธ์–ด
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ์–ธ์–ด
  • ๋Ÿฌ์ŠคํŠธ๋Š” ์ œ 3์˜ ๋ฐฉ๋ฒ• ์‚ฌ์šฉ
    • ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฒ€์‚ฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ทœ์น™์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์†Œ์œ ๊ถŒ ์‹œ์Šคํ…œ ์— ์˜ํ•ด ๊ด€๋ฆฌ๋จ
    • ๋•Œ๋ฌธ์— ์†Œ์œ ๊ถŒ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์„ฑ๋Šฅ์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ
    • ๋Ÿฌ์ŠคํŠธ์™€ ์†Œ์œ ๊ถŒ ์‹œ์Šคํ…œ์˜ ๊ทœ์น™์— ์ต์ˆ™ํ•ด์งˆ์ˆ˜๋ก ๋” ์•ˆ์ „ํ•˜๋ฉฐ ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ์Šคํƒ(Stack) ๋ฉ”๋ชจ๋ฆฌ์™€ ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ
    • ๋Ÿฌ์ŠคํŠธ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ’์ด ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์–ธ์–ด์˜ ๋™์ž‘์ด๋‚˜ ์˜์‚ฌ๊ฒฐ์ •์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นจ
    • ์Šคํƒ๊ณผ ํž™์€ ์ฝ”๋“œ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ํ™œ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€์ด๋ฉฐ ๊ฐ์ž ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•จ
    • ์Šคํƒ(Stack)
      • ์œ ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ
      • ์ฝ์„ ๋•Œ๋Š” ์œ ์ž…๋œ ๋ฐ˜๋Œ€ ์ˆœ์„œ
        • ์ฆ‰, ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๊ฐ’์„ ๊ฐ€์žฅ ๋จผ์ € ์ฝ๋Š” ๊ตฌ์กฐ(LIFO, Last In, First Out)
      • ์Œ“์ธ ๋ฐ์ดํ„ฐ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ๊บผ๋‚ด๋Š” ๋™์ž‘์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ
      • ์Šคํƒ์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ๋™์ž‘ => push
      • ์Šคํƒ์˜ ์ œ์ผ ์œ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๋™์ž‘ => pop
      • ์Šคํƒ์— ์ €์žฅํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๊ณ ์ •๋œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•จ
    • ํž™(Heap)
      • ์ปดํŒŒ์ผ ์‹œ์ ์— ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํž™์— ์ €์žฅ
      • ์Šคํƒ์— ๋น„ํ•ด ๋ณต์žกํ•จ
      • ํž™์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๋™์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ์ • ๊ณต๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ => OS๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ผ์ • ๊ณต๊ฐ„์„ ์ฐพ์•„ ์‚ฌ์šฉ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ‘œ์‹œํ•œ ํ›„, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Ÿ๊ฐ’์ธ ํฌ์ธํ„ฐ(pointer)๋ฅผ ๋„˜๊ฒจ์คŒ
      • ์œ„์˜ ๊ณผ์ •์„ ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(allocating on the heap) ๋˜๋Š” ๋‹จ์ˆœํžˆ ํ• ๋‹น(allocating) ์ด๋ผ๊ณ  ์นญํ•จ
      • ์Šคํƒ์— ๊ฐ’์„ ํ‘ธ์‹œํ•˜๋Š” ๋™์ž‘์—๋Š” ํ• ๋‹น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
        • ํฌ์ธํ„ฐ๋Š” ์ด๋ฏธ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ๊ฐ’์ด๋ฏ€๋กœ ํฌ์ธํ„ฐ๋Š” ์Šคํƒ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•จ
    • ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ๊ฒƒ์ด ํž™์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ„
      • OS๊ฐ€ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์„ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ
      • ์ƒˆ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„์— ์ถ”๊ฐ€๋จ
      • ํž™์— ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ๋งŽ์€ ์ž‘์—… ํ•„์š”
      • OS๊ฐ€ ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ถฉ๋ถ„ํžˆ ํฐ ๊ณต๊ฐ„์„ ์ฐพ์€ ํ›„ ๋‹ค์Œ ํ• ๋‹น ์ž‘์—…์„ ์œ„ํ•œ ์˜ˆ์•ฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 
    • ํž™์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์Šคํƒ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋Š๋ฆผ
      • ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
      • ํ˜„๋Œ€์˜ ํ”„๋กœ์„ธ์„œ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๋Š” ์ผ์ด ๋” ์ ์„์ˆ˜๋ก ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘
      • ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋ฐ์ดํ„ฐ(Heap)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋ณด๋‹ค๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ(Stack)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋” ๋Šฅ๋ฅ ์ ์œผ๋กœ ๋™์ž‘
      • ํฐ ๊ณต๊ฐ„์„ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜๋ ค๋ฉด ์–ด๋Š ์ •๋„ ์‹œ๊ฐ„์ด ํ•„์š”
    • ์ฝ”๋“œ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ด ํ•จ์ˆ˜์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ’๋“ค์ด ์ „๋‹ฌ๋˜๋ฉฐ, ์ด ๊ฐ’๋“ค์€ ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜์–ด ์Šคํƒ์— ์ €์žฅ๋จ
      • ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์™„๋ฃŒ ์‹œ ์ด ๊ฐ’๋“ค์€ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋จ
    • ์ฝ”๋“œ์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ถ”์ ํ•˜๊ณ  ํž™์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ์Œ
      • ๋Ÿฌ์ŠคํŠธ์˜ ์†Œ์œ ๊ถŒ ๊ธฐ๋Šฅ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฐฉ๋ฒ•
      • ์†Œ์œ ๊ถŒ์€ ํž™ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ์กด์žฌํ•˜๋Š” ๊ฒƒ

๐Ÿค” ์†Œ์œ ๊ถŒ ๊ทœ์น™

  • ๋Ÿฌ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๊ฐ๊ฐ์˜ ๊ฐ’์€ ์†Œ์œ ์ž(owner)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ํŠน์ • ์‹œ์ ์— ๊ฐ’์˜ ์†Œ์œ ์ž๋Š” ๋‹จ ํ•˜๋‚˜๋ฟ์ž„
  • ์†Œ์œ ์ž๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๊ทธ ๊ฐ’์€ ์ œ๊ฑฐ๋จ

๐Ÿค” ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„(scope)

{ // ๋ณ€์ˆ˜ s๋ฅผ ์•„์ง ์„ ์–ธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Œ
  let s = "Hello world!"; // ๋ณ€์ˆ˜ s๋Š” ์ด ์ง€์ ๋ถ€ํ„ฐ ์œ ํšจํ•จ
  // ๋ณ€์ˆ˜ s๋ฅผ ์‚ฌ์šฉํ•œ ๋™์ž‘ ์ˆ˜ํ–‰
} // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ ๋ณ€์ˆ˜ s๋Š” ์ด์ œ ์œ ํšจํ•˜์ง€ ์•Š์Œ
  • ๋ณ€์ˆ˜ s๋Š” ํ”„๋กœ๊ทธ๋žจ ๋‚ด ํ•˜๋“œ์ฝ”๋”ฉํ•œ ๋ฌธ์ž์—ด๊ฐ’์ธ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์ฐธ์กฐํ•จ
  • ํ•ต์‹ฌ 1. ๋ณ€์ˆ˜๊ฐ€ ๋ฒ”์œ„ ์•ˆ์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด ์œ ํšจํ•จ
  • ํ•ต์‹ฌ 2. ๋ณ€์ˆ˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์œ ํšจํ•จ

๐Ÿค” String ํƒ€์ž…

  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ํ…์ŠคํŠธ๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹˜
    • ์ด์œ  1. ๋ฌธ์ž์—ด์€ ๋ถˆ๋ณ€(immutable)
    • ์ด์œ  2. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฌธ์ž์—ด๊ฐ’์„ ์•Œ ์ˆ˜ ์—†์Œ
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด String ํƒ€์ž… ์‚ฌ์šฉ
    • ํž™์— ํ• ๋‹น๋˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ ์ˆ˜ ์—†๋Š” ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด ์ €์žฅ ๊ฐ€๋Šฅ
    • from ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ String ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
      • let s = String::from("Hello world!");
      • ๋‘ ๊ฐœ์˜ ์ฝœ๋ก  :: ์€ from ํ•จ์ˆ˜๋ฅผ String ํƒ€์ž…์˜ ์ด๋ฆ„ ๊ณต๊ฐ„์œผ๋กœ ์ œํ•œํ•˜์—ฌ string_from ๊ฐ™์€ ์ด๋ฆ„ ๋Œ€์‹  ๋” ๋ช…๋ฃŒํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ
  • String ํƒ€์ž…์€ mutable, ๋ฆฌํ„ฐ๋Ÿด์€ immutable
    fn main() {
        let mut s = String::from("Hello");
        s.push_str(" Rust world!!");
        println!("{}", s);
    }
    // Result
    // Hello Rust world!!
    • push_str() ์€ String ์ธ์Šคํ„ด์Šค์— ๋ฆฌํ„ฐ๋Ÿด์„ ๊ฒฐํ•ฉ

๐Ÿค” ๋ฉ”๋ชจ๋ฆฌ์™€ ํ• ๋‹น

  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฌธ์ž์—ด ๋‚ด์šฉ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ…์ŠคํŠธ๋ฅผ ์ตœ์ข… ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Œ
    • ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด์ง€๋งŒ ๋ถˆ๋ณ€์ด๋ผ๋Š” ์‚ฌ์‹ค์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ
  • ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ทธ ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๊ธธ์ด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ž์—ด์€ ๊ทธ ๋ฌธ์ž์—ด์ด ์‚ฌ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฏธ๋ฆฌ ๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•จ
  • String ํƒ€์ž…์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ ์ˆ˜ ์—†๋Š” ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ผ์ • ๋ถ€๋ถ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น
    • ์ ˆ์ฐจ 1. ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฐ˜๋“œ์‹œ ๋Ÿฐํƒ€์ž„์— OS์— ์š”์ฒญํ•ด์•ผ ํ•จ
    • ์ ˆ์ฐจ 2. String ํƒ€์ž…์˜ ์‚ฌ์šฉ์ด ์™„๋ฃŒ๋œ ํ›„์—๋Š” ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ OS์— ๋‹ค์‹œ ๋Œ๋ ค์ค„ ๋ฐฉ๋ฒ• ํ•„์š”
  • ์ ˆ์ฐจ 1์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฒ˜๋ฆฌ
    • String::from ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ด ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”์ฒญํ•จ
  • ์ ˆ์ฐจ 2๋Š” ์กฐ๊ธˆ ๋‹ค๋ฆ„
    • GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋“ค์€ GC๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ง์ ‘ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Œ
    • GC๊ฐ€ ์—†๋Š” ์–ธ์–ด๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‹œ์ ์„ ์ธ์ง€ํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ์ž‘์—…์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
      • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ์ผ์ฐ ํ•ด์ œํ•จ => ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
      • ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ => ๋ฒ„๊ทธ ์œ ๋ฐœ
      • ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์”ฉ์˜ ํ• ๋‹น(allocate)๊ณผ ํ•ด์ œ(free) ์ž‘์—…์„ ์š”ํ•จ
  • ๋ณ€์ˆ˜๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋Ÿฌ์ŠคํŠธ๋Š” drop ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŠน๋ณ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • ๋‹ซ๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด drop ํ•จ์ˆ˜ ์ž๋™ ํ˜ธ์ถœ
    • C++์—์„œ๋Š” ์–ด๋–ค ํ•ญ๋ชฉ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ๋งˆ์ง€๋ง‰์— ์ž์›์„ ํ•ด์ œํ•˜๋Š” ํŒจํ„ด์„ ์ดˆ๊ธฐํ™”์— ์˜ํ•œ ์ž์› ํš๋“(RAII, Resource Acquisition Is Initialization) ์ด๋ผ๊ณ  ์นญํ•จ.
      • ๋Ÿฌ์ŠคํŠธ์˜ drop ํ•จ์ˆ˜๋Š” RAII ํŒจํ„ด๊ณผ ์œ ์‚ฌ

1๏ธโƒฃ ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹ : ์ด๋™(Move)

fn main() {
    let x = 6;
    let y = x;

    println!("{} {}", x, y);
}
// Result
// 6 6
  • ๊ฐ’ 6์„ ๋ณ€์ˆ˜ x์— ๋Œ€์ž… ํ›„ ๋ณ€์ˆ˜ x ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์„ ๋ณ€์ˆ˜ y์— ๋Œ€์ž…
  • ์ •์ˆ˜๋Š” ๊ณ ์ • ํฌ๊ธฐ์˜ ๋‹จ์ˆœํ•œ ๊ฐ’์ด๊ธฐ์— 6์ด๋ผ๋Š” ๊ฐ’ ๋‘ ๊ฐœ๊ฐ€ ์Šคํƒ์— ์ €์žฅ๋จ
fn main() {
    let s1 = String::from("Hello!");
    let s2 = s1;

    println!("{}\n{}", s1, s2);
}
// Result
// error[E0382]: borrow of moved value: `s1`
  • ์ •์ˆ˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • String ํƒ€์ž…์€ ๋ฌธ์ž์—ด ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ, ๊ธธ์ด(length), ์šฉ๋Ÿ‰(capacity) ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์Šคํƒ์— ์ €์žฅ๋จ
  • [๋ณ€์ˆ˜ s1]
    ์ด๋ฆ„ ๊ฐ’
    ํฌ์ธํ„ฐ contents
    ๊ธธ์ด 6
    ์šฉ๋Ÿ‰ 6
    • ๊ธธ์ด(length) : String ํƒ€์ž…์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ํ˜„์žฌ ์–ด๋Š ์ •๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•œ ๊ฐ’
    • ์šฉ๋Ÿ‰(capacity) : String ํƒ€์ž…์ด OS๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•œ ๊ฐ’
  • [๋ณ€์ˆ˜ s1์˜ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ค์ œ contects]
    ์ธ๋ฑ์Šค ๊ฐ’
    0 H
    1 e
    2 l
    3 l
    4 o
    5 !
  • ๋ณ€์ˆ˜ s1์„ s2์— ๋Œ€์ž…ํ•˜๋ฉด String ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋จ
    • ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์™€ ๊ธธ์ด, ์šฉ๋Ÿ‰์ด ์Šคํƒ์— ๋ณต์‚ฌ๋จ
  • ๋ณ€์ˆ˜ s2์™€ s1์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋‘ ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋ ค ํ•จ
    • ์ด์ค‘ ํ•ด์ œ ์—๋Ÿฌ(double free error) ๋ฐœ์ƒ
      • ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ๋ฒ„๊ทธ ์ค‘ ํ•˜๋‚˜
    • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ถˆ์ˆœํ™”(corruption)๋ฅผ ์ผ์œผํ‚ค๋ฉฐ, ์ž ์žฌ์ ์œผ๋กœ ๋ณด์•ˆ์ƒ์˜ ์ทจ์•ฝ์ ์ด ๋  ์ˆ˜ ์žˆ์Œ
  • ๋Ÿฌ์ŠคํŠธ๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ๋ณ€์ˆ˜ s1์ด ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•จ
    • ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ s1์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†์Œ
    • ์œ ํšจํ•˜์ง€ ์•Š์€ ์ฐธ์กฐ ์‚ฌ์šฉ, ์—๋Ÿฌ์ฝ”๋“œ [E0382] ์˜ ์ด์œ 
  • ์–•์€ ๋ณต์‚ฌ(shallow copy)์™€ ๊นŠ์€ ๋ณต์‚ฌ(deep copy) ์ค‘ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ์™€ ๊ธธ์ด, ์šฉ๋Ÿ‰๋งŒ์„ ๋ณต์‚ฌํ•˜๋Š” ๋™์ž‘์ด ์–•์€ ๋ณต์‚ฌ์™€ ์œ ์‚ฌํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋จ
    • ํ•˜์ง€๋งŒ, ๋Ÿฌ์ŠคํŠธ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋ฅผ ๋ฌดํšจํ™” ํ•ด๋ฒ„๋ฆฌ๋ฏ€๋กœ ์–•์€ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ์ด๋™(move)์ด๋ผ๊ณ  ์นญํ•จ
  • ์ด๋™์ด ์ผ์–ด๋‚˜๋ฉด ๋‘ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋งŒ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ค‘ ํ•ด์ œ ์—๋Ÿฌ ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  • ๋Ÿฌ์ŠคํŠธ๋Š” ์ ˆ๋Œ€ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ deep copy๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ

2๏ธโƒฃ ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹ : ๋ณต์ œ(Clone)

  • ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋ ค๋ฉด clone ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
  • clone ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ ์‹œ ์–ด๋–ค ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋จ
  • ๋ณต์‚ฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ๋  ์ˆ˜ ์žˆ์Œ

3๏ธโƒฃ ์Šคํƒ ์ „์šฉ ๋ฐ์ดํ„ฐ : ๋ณต์‚ฌ(Copy)

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

๐Ÿค” ์†Œ์œ ๊ถŒ๊ณผ ํ•จ์ˆ˜

  • ๊ฐ’์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•จ = ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•จ
    • ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด ๋Œ€์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ’์˜ ์ด๋™์ด๋‚˜ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง
fn main() {
    let s = String::from("Hello!"); // ๋ณ€์ˆ˜ s ์ƒ์„ฑ
    takes_ownership(s); // ๋ณ€์ˆ˜ s ํ•จ์ˆ˜ ์ด๋™
} // ๋ณ€์ˆ˜ s๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์ง€๋งŒ takes_ownership ํ•จ์ˆ˜ ๋‚ด๋กœ ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Œ

fn takes_ownership(receive_s: String) { // ๋ณ€์ˆ˜ receive_s ์ƒ์„ฑ
    println!("{}", receive_s);
} // ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋ฉฐ drop ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ receive_s ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋จ
// Result
// Hello!
  • ๋งŒ์•ฝ main ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ณ€์ˆ˜ s์˜ ์ด๋™์ด ์ผ์–ด๋‚œ ํ›„ ์‚ฌ์šฉ ์š”์ฒญ์„ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ
fn main() {
    let x = 6; // ๋ณ€์ˆ˜ x ์ƒ์„ฑ
    makes_copy(x); // ๋ณ€์ˆ˜ x ํ•จ์ˆ˜ ์ด๋™
    println!("{}", x); // i32 ํƒ€์ž…์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ณ€์ˆ˜ x๋Š” ์—ฌ์ „ํžˆ ์œ ํšจํ•จ
}

fn makes_copy(clone_x: i32) { // ๋ณ€์ˆ˜ clone_x ์ƒ์„ฑ
    println!("{}", clone_x);
}
// Result
// 6
// 6

๐Ÿค” ๋ฆฌํ„ด๊ฐ’๊ณผ ๋ฒ”์œ„

  • ๋ฆฌํ„ด๊ฐ’๋„ ์†Œ์œ ๊ถŒ์„ ์ด์ „ํ•จ
fn main() {
    let s1 = give_ownership(); // give_ownership์˜ ๋ฆฌํ„ด๊ฐ’์ด s1์œผ๋กœ ์˜ฎ๊ฒจ์ง
    let s2 = String::from("Rust!"); // s2 ์ƒ์„ฑ
    println!("{}", s2);

    let s3 = take_and_give(s2); // s2 ํ•จ์ˆ˜ ์ด๋™ ํ›„ ๋ฆฌํ„ด๊ฐ’ s3๋กœ ์˜ฎ๊ฒจ์ง

    println!("{} {}", s1, s3);
} // s1, s3 drop ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
// s2๋Š” ํ•จ์ˆ˜๋กœ ์ด๋™๋๊ธฐ์— ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ

fn give_ownership() -> String {
    let s = String::from("Rust!!"); // s ์ƒ์„ฑ
    s // s ๋ฆฌํ„ด
}

fn take_and_give(s: String) -> String { // s ์ƒ์„ฑ
    s // s ๋ฆฌํ„ด
}
  • ๋ณ€์ˆ˜์˜ ์†Œ์œ ๊ถŒ์€ ๋งค๋ฒˆ ๊ฐ™์€ ํŒจํ„ด์„ ๋”ฐ๋ฆ„
    • ๊ฐ’์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ์†Œ์œ ๊ถŒ์ด ์˜ฎ๊ฒจ์ง
    • ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋Š” ์†Œ์œ ๊ถŒ์ด ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋กœ ์˜ฎ๊ฒจ์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ drop ํ•จ์ˆ˜์— ์˜ํ•ด ์ œ๊ฑฐ๋จ
fn main() {
    let s1 = String::from("Hello!");
    let (s2, len) = string_length(s1);

    println!("'{}' ์˜ ๊ธธ์ด : {}", s2, len);
}

fn string_length(s: String) -> (String, usize) {
    let length = s.len();
    (s, length)
}
// Result
// 'Hello!' ์˜ ๊ธธ์ด : 6
  • ํŠœํ”Œ์„ ์ด์šฉํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์†Œ์œ ๊ถŒ์„ ์‹ค์ œ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’๊ณผ ํ•จ๊ป˜ ๋‹ค์‹œ ๋ฆฌํ„ดํ•˜๋Š” ์ฝ”๋“œ
    • ํ•ด๋‹น ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์†Œ์œ ๊ถŒ์„ ํ™•๋ณดํ•˜๊ณ  ๋‹ค์‹œ ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์†Œ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹˜
  • ๋Ÿฌ์ŠคํŠธ๋Š” ์ฐธ์กฐ(references) ๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ํ•จ์ˆ˜์— ๊ฐ’์„ ์ด์ „ํ•  ๋•Œ ์†Œ์œ ๊ถŒ์„ ์ด์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

2๏ธโƒฃ ์ฐธ์กฐ์™€ ๋Œ€์—ฌ

  • ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹ , ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • &(ampersands) ๊ธฐํ˜ธ๊ฐ€ ์ฐธ์กฐ(references) ์ด๋ฉฐ, ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ
    • ์ฐธ์กฐ์˜ ๋ฐ˜๋Œ€๋Š” ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž์ธ * ์— ์˜ํ•ด ๋™์ž‘ํ•˜๋Š” ์—ญ์ฐธ์กฐ(dereferencing)
fn main() {
    let s1 = String::from("Hello!");
    let length = get_length(&s1);

    println!("'{}' ์˜ ๊ธธ์ด : {}", s1, length);
}

fn get_length(s: &String) -> usize {
    s.len()
}
// Result
// 'Hello!' ์˜ ๊ธธ์ด : 6
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ์ฝ”๋“œ
  • [String ํƒ€์ž…์˜ ๋ณ€์ˆ˜ s1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” &String s]
    ์ด๋ฆ„ ๊ฐ’
    ํฌ์ธํ„ฐ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•œ s1
  • ์ฐธ์กฐ๋Š” ์†Œ์œ ๊ถŒ์„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ธฐ์— ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ ์ฐธ์กฐ๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋”๋ผ๋„ drop ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ
  • ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋Œ€์—ฌ(borrowing) ๋ผ๊ณ  ์นญํ•จ
  • ๋Œ€์—ฌํ•œ ๋ณ€์ˆ˜๋Š” ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•จ
    • ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฐธ์กฐ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€์ž„

๐Ÿค” ๊ฐ€๋ณ€ ์ฐธ์กฐ

  • ๋ณ€์ˆ˜์— mut keywork ์ถ”๊ฐ€ ํ›„ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ’ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•จ
  • ๊ฐ€๋ณ€ ์ฐธ์กฐ์—๋„ ์ œ์•ฝ์ด ์žˆ์Œ
    • ํŠน์ • ๋ฒ”์œ„ ๋‚ด์˜ ํŠน์ • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋Š” ์˜ค์ง ํ•œ ๊ฐœ๋งŒ ์กด์žฌํ•ด์•ผ ํ•จ
    • ์ œ์•ฝ ๋•๋ถ„์— ๋Ÿฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ(data races) ์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฐฉ์ง€ ๊ฐ€๋Šฅ
    • ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ์€ ๊ฒฝํ•ฉ ์กฐ๊ฑด(race condition) ๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ ์ฃผ๋กœ ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒ
      • ๋™์ž‘ 1. ๋‘˜ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•  ๋•Œ
      • ๋™์ž‘ 2. ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ๋•Œ
      • ๋™์ž‘ 3. ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋™๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์„ ๋•Œ
    • ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ์€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฒฐ๊ณผ๋ฅผ ์œ ๋ฐœํ•˜๋ฉฐ, ๋Ÿฐํƒ€์ž„์— ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›€
      • ๋Ÿฌ์ŠคํŠธ๋Š” ์ปดํŒŒ์ผ ํ—ˆ์šฉ์„ ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•จ
    • ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ๋ฒ”์œ„๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋™์‹œ์— ํ™œ์šฉ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ถˆ๋ณ€ ์ฐธ์กฐ๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ
    • ๋ถˆ๋ณ€ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๋™์ž‘์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๋™์ž‘์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ถˆ๋ณ€ ์ฐธ์กฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•ด๋„ ๋ฌด๋ฐฉํ•จ

๐Ÿค” ์ฃฝ์€ ์ฐธ์กฐ

  • ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋Š” ์ฃฝ์€ ํฌ์ธํ„ฐ๋กœ ์ธํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์›€
  • ์ฃฝ์€ ํฌ์ธํ„ฐ
    • ์ด๋ฏธ ํ•ด์ œ๋˜์–ด ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ
  • ๋Ÿฌ์ŠคํŠธ๋Š” ์ฃฝ์€ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณด์žฅํ•ด ์คŒ
    • ์–ด๋–ค ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์— ์•ž์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•จ
    • ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒ์„ฑ๋˜์—ˆ๊ณ  ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์— ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋จ
    • ํ•จ์ˆ˜๊ฐ€ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ๋ณด๊ด€๋˜์–ด ์žˆ์Œ์„ ํ™•์ธ ํ›„ ์ ‘๊ทผ์„ ์ ˆ๋Œ€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
    • ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๋ฆฌํ„ดํ•˜๋ฉด ์†Œ์œ ๊ถŒ์ด ์ด์ „๋˜๊ธฐ์— ์ •์ƒ ์ž‘๋™ํ•จ

๐Ÿค” ์ฐธ์กฐ์— ๋Œ€ํ•œ ๊ทœ์น™

  • ์–ด๋Š ํ•œ ์‹œ์ ์— ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ๊ฐ€๋ณ€ ์ฐธ์กฐ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ถˆ๋ณ€ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘˜ ๋ชจ๋‘๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ
  • ์ฐธ์กฐ๋Š” ํ•ญ์ƒ ์œ ํšจํ•ด์•ผ ํ•จ

3๏ธโƒฃ ์Šฌ๋ผ์ด์Šค ํƒ€์ž…

  • ์Šฌ๋ผ์ด์Šค๋„ ์†Œ์œ ๊ถŒ์„ ๊ฐ–์ง€ ์•Š๋Š” ํƒ€์ž…
  • ์Šฌ๋ผ์ด์Šค ์‚ฌ์šฉ ์‹œ ์ปฌ๋ ‰์…˜ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ์—ฐ์†๋œ ์š”์†Œ๋“ค ์ฐธ์กฐ ๊ฐ€๋Šฅ
  • ์ „๋‹ฌ๋  ๋ฌธ์ž์—ด์—์„œ ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด๋งŒ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑ
    • ๋ฌธ์ž์—ด์— ๊ณต๋ฐฑ์ด ์—†๋‹ค๋ฉด ์ „์ฒด ๋ฌธ์ž์—ด์ด ํ•œ ๋‹จ์–ด์ผ ๊ฒƒ์ด๋ฏ€๋กœ ์ „์ฒด ๋ฌธ์ž์—ด ๋ฆฌํ„ด
    • ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ด usize ํƒ€์ž…์ธ ๋‹จ์–ด์˜ ๋์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค๋ผ๋ฉด String ํƒ€์ž…์ธ ์ „๋‹ฌ๋  ๋ฌธ์ž์—ด์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ด

๐Ÿค” ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค

  • ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค(string slices) ๋Š” String ์˜ ์ผ๋ถ€์— ๋Œ€ํ•œ ์ฐธ์กฐ
  • [starting_index..ending_index] ๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ์Šฌ๋ผ์ด์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์Šฌ๋ผ์ด์Šค๋Š” ์‹œ์ž‘ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ์Šฌ๋ผ์ด์Šค์˜ ๊ธธ์ด, ending_index ์—์„œ starting_index ๋ฅผ ๋บ€ ๋งŒํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ฒด
  • (1) ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ ํƒ์ƒ‰ ์‹œ ์•ž์˜ ๊ฐ’ ์ƒ๋žต ๊ฐ€๋Šฅ
  • (2) ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ํƒ์ƒ‰ ์‹œ ๋’ค์˜ ๊ฐ’ ์ƒ๋žต ๊ฐ€๋Šฅ
  • (3) ์ „์ฒด๋ฅผ ์Šฌ๋ผ์ด์Šค๋กœ ์ฐธ์กฐ ์‹œ ์–‘์ชฝ์˜ ๊ฐ’ ์ƒ๋žต ๊ฐ€๋Šฅ
  • ํŒŒ์ด์ฌ์˜ ์Šฌ๋ผ์ด์‹ฑ๊ณผ ์œ ์‚ฌ
  • ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค์˜ ๋ฒ”์œ„ ์ธ๋ฑ์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ UTF-8์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•จ
  • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ์Šฌ๋ผ์ด์Šค
    • let s = "Hello, world!";
    • ๋ณ€์ˆ˜ s์˜ ํƒ€์ž…์€ &str
      • ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์–ด๋Š ํ•œ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์Šฌ๋ผ์ด์Šค์ด๊ธฐ์— ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ํ•ญ์ƒ ๋ถˆ๋ณ€ => &str ์€ ๋ถˆ๋ณ€ ์ฐธ์กฐ
    • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ์ด๋ฏธ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šฌ๋ผ์ด์Šค ๋ฌธ๋ฒ• ์—†์ด๋„ ์ •์ƒ ๋™์ž‘ํ•จ
  • ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค ๋งค๊ฐœ๋ณ€์ˆ˜
    • String ํƒ€์ž…์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋Œ€์‹  ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค๋ฅผ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋” ๋ณดํŽธ์ ์ด๊ณ  ์œ ์šฉํ•œ API๋ฅผ ๋””์ž์ธํ•  ์ˆ˜ ์žˆ์Œ
fn main() {
    let s_words = String::from("little bottle of water");
    let l_words = "Chips! tomato and lettuce";
    let s_f_word = find_first_word(&s_words[..]);
    let l_f_word = find_first_word(l_words);

    println!("{}", s_f_word);
    println!("{}", l_f_word);
}

fn find_first_word(s: &str) -> &str{
    let byte_s = s.as_bytes();

    for (i, &item) in byte_s.iter().enumerate() {
        if item == b' ' {
            return &s[..i];
        }
    }
    s
}
// Result
// little
// Chips!
  • ์œ„์˜ ๋‚ด์šฉ๋“ค์„ ํ•™์Šตํ•œ ํ›„ ์ตœ์ข… ์ฝ”๋“œ
  • as_bytes ๋ฉ”์„œ๋“œ : ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
  • iter ๋ฉ”์„œ๋“œ : ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์˜ ๋ฐ˜๋ณต์ž(iterator) ์ƒ์„ฑ
  • enumerate ๋ฉ”์„œ๋“œ : iterator ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์‹ธ์„œ ๊ฐ ์›์†Œ๋ฅผ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
    • (index, reference to that element)

๐Ÿค” ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์Šฌ๋ผ์ด์Šค

let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];
  • ํ•ด๋‹น ์Šฌ๋ผ์ด์Šค๋Š” &[i32] ํƒ€์ž…
  • ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์™€ ๊ธธ์ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•จ
  • ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ์Šฌ๋ผ์ด์Šค๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ํ™œ์šฉ ๊ฐ€๋Šฅ

Summary

  • ์†Œ์œ ๊ถŒ, ๋Œ€์—ฌ, ์Šฌ๋ผ์ด์Šค๋Š” ๋Ÿฌ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…๋“ค
  • ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ํ†ต์ œ๊ถŒ์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ œ๊ณต
  • ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ์ž๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ๊ถŒ์„ ํ•ด์ œํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ์˜ ์•ˆ์ „ํ•œ ์‚ฌ์šฉ์ด๋‚˜ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Œ
728x90
๋ฐ˜์‘ํ˜•
Comments