๐ ๋ฌ์คํธ Rust ์์ ๊ถ ๊ฐ๋ ์๋ฒฝ ์ ๋ฆฌ: ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ํต์ฌ ์๋ฆฌ ์ดํดํ๊ธฐ
# ๋ฌ์คํธ(Rust) ์์ ๊ถ ๊ฐ๋ ์๋ฒฝ ์ ๋ฆฌ: ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ํต์ฌ ์๋ฆฌ ์ดํดํ๊ธฐ
C/C++์ ๋ฉ๋ชจ๋ฆฌ ์ง์ ๊ด๋ฆฌ ๋ถ๋ด๊ณผ Java, Go, Python๊ณผ ๊ฐ์ ์ธ์ด๊ฐ ์ฌ์ฉํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)์ ์ฑ๋ฅ ์ง์ฐ ์ฌ์ด์์ ๊ณ ๋ฏผํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฌ์คํธ(Rust)๋ ํ์ ์ ์ธ ๋์์ผ๋ก ์๋ฆฌ ์ก์์ต๋๋ค. ๋ฌ์คํธ๊ฐ ๋ณ๋์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฐ์ดํฐ ๊ฒฝํฉ์ ์์ฒ ์ฐจ๋จํ ์ ์๋ ๋น๊ฒฐ์ ๋ฐ๋ก '์์ ๊ถ(Ownership)'์ด๋ผ๋ ๋ ์ฐฝ์ ์ธ ์์คํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ ๋ฌ์คํธ๋ฅผ ์ฒ์ ์ ํ ๋ ๊ฐ์ฅ ํฐ ์ง์ ์ฅ๋ฒฝ์ผ๋ก ๋๊ปด์ง๋ ์์ ๊ถ์ ํต์ฌ ๊ฐ๋ ์ ์ค๋ฌด์ ๊ด์ ์์ ํ์ดํฉ๋๋ค. ์ ์ด ์์คํ ์ด ์ค๊ณ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ์ฝ๋ ์์ฑ ์ ์ด๋ค ๊ท์น์ ์ค์ํด์ผ ํ๋์ง ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์ด๋ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๊ณ ์ ํฉ๋๋ค.
๐ ๋ชฉ์ฐจ
- ์์ ๊ถ์ ์ธ ๊ฐ์ง ํต์ฌ ์์น๊ณผ ์ ์
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต: ์คํ(Stack)๊ณผ ํ(Heap)์ ์ฐจ์ด
- ๊ฐ์ ์ด๋(Move)๊ณผ ๋ณต์ฌ(Copy)์ ๋์ ๋ฐฉ์
- ์ฐธ์กฐ์ ๋น๋ฆผ(Borrowing)์ ํตํ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ
- ๊ฐ๋ณ ์ฐธ์กฐ์ ์ ์ฝ๊ณผ ๋ฐ์ดํฐ ๊ฒฝํฉ ๋ฐฉ์ง ์๋ฆฌ
- ์์ ๊ถ ์์คํ ๋์ ์ ๋ฐ์ํ๋ ์ ๋ฌดํ์ ๋น์ฉ ๋ถ์
์์ ๊ถ์ ์ธ ๊ฐ์ง ํต์ฌ ์์น
๋ฌ์คํธ์ ์์ ๊ถ์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ปดํ์ผ ํ์์ ๊ฐ์ ํ๋ ๊ท์น๋ค์ ์งํฉ์ ๋๋ค. ์ด ์์คํ ๋๋ถ์ ๋ฌ์คํธ๋ ๋ฐํ์ ์ค๋ฒํค๋ ์์ด ์์ ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ๋ค์์ ์ธ ๊ฐ์ง ๋์์น์ ์๊ฒฉํ๊ฒ ์ค์ํฉ๋๋ค.
- ๋ฌ์คํธ๊ฐ ๋ค๋ฃจ๋ ๋ชจ๋ ๊ฐ์ '์์ ์(Owner)'๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ณ์๋ฅผ ํ๋์ฉ ๊ฐ์ง๋๋ค.
- ํน์ ์์ ์ ๊ฐ์ ๋ํ ์์ ์๋ ๋จ ํ๋๋ง ์กด์ฌํ ์ ์์ต๋๋ค.
- ์์ ์๊ฐ ์์ ์ด ์ ์ธ๋ ๋ฒ์(Scope)๋ฅผ ๋ฒ์ด๋๋ฉด, ํด๋น ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฆ์ ์ ๊ฑฐ(Drop)๋ฉ๋๋ค.
์ด ๋ฐฉ์์ ๊ธฐ์กด ์ธ์ด๋ค์ด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ํตํด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด๋, ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก free()๋ฅผ ํธ์ถํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ํด๊ฒฐํฉ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋์ ํ๋ฆ์ ๋ถ์ํ์ฌ ์ ํํ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ฝ๋๋ฅผ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต: ์คํ๊ณผ ํ์ ๊ตฌ๋ถ
์์ ๊ถ์ ์ ํํ ์ดํดํ๋ ค๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ ์์ญ์ ์ ์ฅ๋๋์ง ์์์ผ ํฉ๋๋ค. ๋ฌ์คํธ๋ ๋ฐ์ดํฐ์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์คํ๊ณผ ํ์ ๋ค๋ฅด๊ฒ ํ์ฉํ๋ฉฐ, ์์ ๊ถ ์์คํ ์ ์ฃผ๋ก ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ง์คํฉ๋๋ค.
- ์คํ(Stack): ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋ ๋ฐ์ดํฐ(์ ์, ๋ถ๋ ์์์ , ๋ถ๋ฆฐ ๋ฑ)๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์ปดํ์ผ ํ์์ ํฌ๊ธฐ๋ฅผ ์ ์ ์์ผ๋ฉฐ ์ ๊ทผ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฆ ๋๋ค. ์ฌ๊ธฐ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์์ ๊ถ ์ด์ ๋์ '๋ณต์ฌ(Copy)'๊ฐ ์ผ์ด๋ฉ๋๋ค.
- ํ(Heap): ์คํ ์ค์ ํฌ๊ธฐ๊ฐ ๋ณํ ์ ์๋ ๋ฐ์ดํฐ(String, Vector ๋ฑ)๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๊ฐ ๋น ๊ณต๊ฐ์ ์ฐพ์ ์ฃผ์๋ฅผ ๋ฐํํ๋ฉฐ, ์ด ์ฃผ์(ํฌ์ธํฐ)๋ ์คํ์ ์ ์ฅ๋๊ณ ์ค์ ๋ฐ์ดํฐ๋ ํ์ ์์นํฉ๋๋ค.
- ๊ด๋ฆฌ ๋น์ฉ์ ์ฐจ์ด: ํ ๋ฉ๋ชจ๋ฆฌ๋ ํ ๋น๊ณผ ํด์ ์ ์ฑ๋ฅ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. ๋ฌ์คํธ์ ์์ ๊ถ์ ์ด ํ ๋ฐ์ดํฐ๋ฅผ ์ธ์ ํด์ ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ด ๋ฉ๋๋ค.
๊ฐ์ ์ด๋(Move)๊ณผ ๋ณต์ฌ(Copy)
๋ฌ์คํธ์์ ๋ณ์ ๊ฐ์ ๊ฐ์ ๋์ ํ ๋, ๋ฐ์ดํฐ์ ์ ํ์ ๋ฐ๋ผ '์ด๋' ํน์ '๋ณต์ฌ'๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋์์ ์ก๊ธฐ ์ํ ์ค๊ณ์ ๋๋ค.
- ์ด๋(Move): ํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ๋์ ํ๋ฉด ์์ ๊ถ์ด ์์ ํ ๋์ด๊ฐ๋๋ค. ์ด์ ๋ณ์๋ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋ณ์๊ฐ ๋์์ ๊ฐ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ค๋ '์ด์ค ํด์ (Double Free)' ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ๋ณต์ฌ(Copy): ์คํ์ ์ ์ฅ๋๋ ๊ธฐ๋ณธ ํ์ ๋ค์ ๋์ ์ ๊ฐ์ด ๋ณต์ฌ๋์ด ์์ชฝ ๋ณ์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ 'Copy ํธ๋ ์ดํธ'๋ฅผ ๊ตฌํํ ํ์ ๋ค์ ํ์ ๋ฉ๋๋ค.
- ๊น์ ๋ณต์ฌ(Clone): ํ ๋ฐ์ดํฐ์ ์์ ๊ถ์ ์ ์งํ๋ฉด์ ์๋ก์ด ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ์ถ์ ๋๋ .clone() ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ์ด๋ ๋ช ์์ ์ธ ๋น์ฉ(๋ฉ๋ชจ๋ฆฌ ์ถ๊ฐ ํ ๋น ๋ฐ ๋ฐ์ดํฐ ๋ณต์ ์๊ฐ)์ด ๋ฐ์ํจ์ ๊ฐ๋ฐ์์๊ฒ ์ธ์ง์ํต๋๋ค.
์ฐธ์กฐ์ ๋น๋ฆผ(Borrowing)
์์ ๊ถ์ ๋งค๋ฒ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌ์คํธ๋ '์ฐธ์กฐ(&)'๋ฅผ ํตํ '๋น๋ฆผ' ๊ฐ๋ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์๊ณ ์ฃผ์๋ง ์ฐธ์กฐํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ถ๋ณ ์ฐธ์กฐ(&T): ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ๊ฐ๊ฐ ๋์์ ์กด์ฌํ ์ ์์ต๋๋ค.
- ๊ฐ๋ณ ์ฐธ์กฐ(&mut T): ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ง๋ง, ํน์ ์์ ์ ๋จ ํ๋๋ง ์กด์ฌํ ์ ์์ต๋๋ค.
- ์ฐธ์กฐ์ ์ ํจ์ฑ: ์ฐธ์กฐ์๋ ์์ ์๋ณด๋ค ์ค๋ ์ด ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ์ '๋น๋ฆผ ๊ฒ์ฌ๊ธฐ(Borrow Checker)'๊ฐ ์ด๋ฅผ ๊ฐ์ํ์ฌ ๋์์ ์์ ํฌ์ธํฐ(Dangling Pointer) ๋ฐ์์ ์ฐจ๋จํฉ๋๋ค.
๊ฐ๋ณ ์ฐธ์กฐ์ ์ ์ฝ๊ณผ ๋ฐ์ดํฐ ๊ฒฝํฉ ๋ฐฉ์ง
๋ฌ์คํธ ์์ ๊ถ ์์คํ ์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ํน์ง ์ค ํ๋๋ ์ปดํ์ผ ํ์์ ๋ฐ์ดํฐ ๊ฒฝํฉ(Data Race)์ ๋ฐฉ์งํ๋ค๋ ์ ์ ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ์๊ฒฉํ ๊ท์น์ ์ ์ฉํฉ๋๋ค.
- ์ํธ ๋ฐฐ์ ์์น: ๋์ผํ ๋ฐ์ดํฐ์ ๋ํด ๊ฐ๋ณ ์ฐธ์กฐ๊ฐ ์กด์ฌํ ๋, ๋ค๋ฅธ ์ด๋ค ์ฐธ์กฐ(๊ฐ๋ณ ๋๋ ๋ถ๋ณ)๋ ๋์์ ์กด์ฌํ ์ ์์ต๋๋ค.
- ์ฝ๊ธฐ ์ ์ฉ ๋ค์ค์ฑ: ๋ถ๋ณ ์ฐธ์กฐ๋ง ์กด์ฌํ ๋๋ ๊ฐ์์ ์ ํ ์์ด ๊ณต์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ '๋ค์์ ์ฝ๊ธฐ' ๋๋ 'ํ๋์ ์ฐ๊ธฐ' ์ค ํ๋๋ง ํ์ฉํ๋ ์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๊ธ(Read-Write Lock)์ ์๋ฆฌ์ ์ ์ฌํฉ๋๋ค.
- ๋๊ธฐํ ๋น์ฉ ์ ๊ฐ: ์ด๋ฌํ ์ ์ฝ ๋๋ถ์ ๋ฌ์คํธ๋ ๋ฐํ์์ ๋ณ๋์ ๋ฝ(Lock) ์ฒ๋ฆฌ ์์ด๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํด์ง๋ฉฐ, ์ด๋ ์คํ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ด์ด์ง๋๋ค.
์์ ๊ถ ์์คํ ๋์ ์ ๋น์ฉ๊ณผ ํ๋จ ๊ธฐ์ค
๋ฌ์คํธ์ ์์ ๊ถ์ ๊ณต์ง๊ฐ ์๋๋๋ค. ์ฑ๋ฅ์ ์ด์ ์ ๋ช ํํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ง๋ถํด์ผ ํ ๋น์ฉ๋ ์กด์ฌํฉ๋๋ค. ์ค๋ฌด ๋์ ์ ๋ค์์ ์์๋ค์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ์ธ์ง ๋ถํ ๋ฐ ํ์ต ๋น์ฉ: ์์ ๊ถ ๊ท์น์ ์ด๊ธฐ ํ์ต ๊ณก์ ์ด ๋งค์ฐ ๊ฐํ๋ฆ ๋๋ค. ๋น๋ฆผ ๊ฒ์ฌ๊ธฐ์์ '์ธ์'์ด๋ผ ๋ถ๋ฆฌ๋ ๊ณผ์ ์์ ๊ฐ๋ฐ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค.
- ์ํคํ ์ฒ ์ค๊ณ์ ๋ณต์ก๋: ๋ฐ์ดํฐ๋ฅผ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ค๊ณํ์ง ์์ผ๋ฉด ์์ ๊ถ ๊ด๊ณ๊ฐ ๊ผฌ์ด๊ธฐ ์ฝ์ต๋๋ค. ์ํ ์ฐธ์กฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ Rc, Arc, RefCell ๊ฐ์ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์ด๋ ์ถ๊ฐ์ ์ธ ๋ฐํ์ ๋น์ฉ์ ์๋ฐํฉ๋๋ค.
- ์คํ ์ฑ๋ฅ(Zero-cost Abstraction): ๋ฌ์คํธ ์์ ๊ถ์ ์ปดํ์ผ ํ์์ ๋ชจ๋ ๊ฒ์ฌ๊ฐ ๋๋๋ฏ๋ก ์คํ ์์ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ์ธํ 'Stop the world' ํ์์ด ์ ํ ์์ต๋๋ค. ์ง์ฐ ์๊ฐ(Latency)์ด ์ค์ํ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ด๋ ์ค์๊ฐ ์๋น์ค์์๋ ์ด ๋น์ฉ ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ์ ๋ฆฌํฉ๋๋ค.
๋ฌ์คํธ์ ์์ ๊ถ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ํ๋ฆ๊ณผ ๋ฐ์ดํฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ช ํํ ์ดํดํ๋๋ก ๊ฐ์ ํ๋ ์์คํ ์ ๋๋ค. ์ด๊ธฐ์๋ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ง์ฃผํ๋ ์ผ์ด ์ฆ๊ฒ ์ง๋ง, ์ด๋ฅผ ํตํด ๋ฐํ์์ ๋ฐ์ํ ์ ์๋ ์น๋ช ์ ์ธ ๋ฒ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์ฐจ๋จํ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์์ฐ์ด ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฌ์คํธ ์์ ๊ถ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํ ํต์ฌ ์ฒดํฌ ํฌ์ธํธ๋ฅผ ์ ๋ฆฌํด ๋๋ฆฝ๋๋ค.
- ํจ์์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋ ์์ ๊ถ ์ด์ ๋์ ์ฐธ์กฐ(&)๋ฅผ ์ฐ์ ์ ์ผ๋ก ๊ณ ๋ คํ์ธ์.
- ๊ฐ๋ณ ์ฐธ์กฐ(&mut)๋ ํ์ํ ์ต์ํ์ ๋ฒ์ ๋ด์์๋ง ์ฌ์ฉํ๊ณ ์ฆ์ ๋ฐํํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋์ธ์.
- ์ปดํ์ผ๋ฌ ์๋ฌ ๋ฐ์ ์ .clone()์ผ๋ก ์์ ํด๊ฒฐํ๊ธฐ๋ณด๋ค, ๋ฐ์ดํฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ๊ฒํ ํ์ฌ ๊ตฌ์กฐ์ ์ธ ์ค๊ณ๋ฅผ ๊ฐ์ ํ์ธ์.
- ์ฑ๋ฅ์ด ๊ทน๋๋ก ์ค์ํ ๊ตฌ๊ฐ์์๋ ์ค๋งํธ ํฌ์ธํฐ ์ฌ์ฉ์ ์ค์ด๊ณ ๋จ์ํ ์์ ๊ถ ํ๋ฆ์ ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค.