์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ๋ฐ์ดํฐ ํต์
- ์๋ฐ ๊ฐ๋
- ubuntu
- ์ด์์ฒด์
- java
- Python
- ํ์ด์ฌ
- ๋ฌ์คํธ ํ๋ก๊ทธ๋๋ฐ ๊ณต์ ๊ฐ์ด๋
- Rust
- ์ค๋ผํด
- ์๋ฐ ๊ธฐ์ด
- Database
- OS
- ๋ฐฑ์ค
- Python challenge
- ์๋ฐ
- data communication
- ๋ฌ์คํธ
- Operating System
- Reversing
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ํ์ด์ฌ ์ฑ๋ฆฐ์ง
- ํ์ด์ฌ ์ฒผ๋ฆฐ์ง
- C
- ์ฐ๋ถํฌ
- ์๊ณ ๋ฆฌ์ฆ
- ์ค๋ผํดDB
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์ค ๋ฌ์คํธ
- ๋ฌ์คํธ ์์
Archives
- Today
- Total
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:43728x90
๋ฐ์ํ
๐ฆ 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, ๋ฆฌํฐ๋ด์ immutablefn 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๋ก๋ถํฐ ํ ๋น๋ฐ์ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ํํํ ๊ฐ
- ๊ธธ์ด(length) :
- [๋ณ์ 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
๋ฐ์ํ
'Development Study > Rust' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Rust] Start Rust (Day 11) - Enums and Pattern Matching [1] (0) | 2023.02.03 |
---|---|
[Rust] Start Rust (Day 10) - Using Structs to Structure Related Data (4) | 2023.02.01 |
[Rust] Start Rust (Day 8) - Rust Example Script 2 [Nth in Fibonacci Sequence] (0) | 2023.01.18 |
[Rust] Start Rust (Day 7) - Rust Example Script 1 [Temperature Converter] (0) | 2023.01.09 |
[Rust] String Type (String, str) (0) | 2023.01.05 |
Comments