[Rust] μž¬κ·€ νƒ€μž… (Recursive Type)

νƒ€μž… 내에 슀슀둜의 νƒ€μž…μ„ 또 λ„£λŠ” 것은 ν”ν•œ κ΅¬ν˜„ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‹€.
특히 자료ꡬ쑰 같은 기반ꡬ쑰λ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” μƒμŠ΅μ μœΌλ‘œ μ‚¬μš©λœλ‹€.

Rust도 μž¬κ·€ νƒ€μž… ν‘œν˜„μ„ μ§€μ›ν•˜κΈ΄ ν•˜λ‚˜, μ•„μ£Ό μ•½κ°„μ˜ μ œν•œμ‚¬ν•­μ΄ μ‘΄μž¬ν•œλ‹€.


μž¬κ·€ νƒ€μž…μ˜ κΈ°λ³Έ 원칙 쀑 ν•˜λ‚˜λŠ”, κ°’ νƒ€μž…μ„ λ¬΄μž‘μ • μ‘€μ…”λ„£λŠ” ν˜•νƒœλ‘œλŠ” 넣을 μˆ˜κ°€ μ—†λ‹€λŠ” 것이닀.

κ·Έλƒ₯ μ΄λ ‡κ²Œ 넣어버리면 였λ₯˜κ°€ λ‚œλ‹€.
λ‹Ήμ—°ν•˜λ‹€. κ·Έλƒ₯ μ €λ ‡κ²Œ λ„£μœΌλ©΄ νƒ€μž…μ‹œμŠ€ν…œμ€ μ € ꡬ쑰체 νƒ€μž…μ˜ 크기λ₯Ό μ•Œμ•„λ‚Ό μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
Node μ•ˆμ— 또 Nodeκ°€ 있고, 또 있고λ₯Ό λ°˜λ³΅ν•˜λ‹ˆ, ꡬ쑰체 크기 νŒŒμ•…ν•˜λŠ”λ°μ„œ λ¬΄ν•œ μž¬κ·€κ°€ λ°œμƒν•œλ‹€.

κ·Έλž˜μ„œ μž¬κ·€ νƒ€μž…μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ”, Box 같은 포인터 νƒ€μž…μœΌλ‘œ λž˜ν•‘ν•΄μ„œ μ œν•œμ„ ν•΄μ€˜μ•Ό ν•œλ‹€.

이러면 Box μžμ²΄λŠ” μ–΄μ°¨ν”Ό κ³ μ •λœ 포인터 크기둜 ν‰κ°€λ˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

μž¬κ·€ νƒ€μž…μ€ structμ—λ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. unionκ³Ό enum에도 μ‚¬μš©ν•  수 μžˆλ‹€.
recursive enum의 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같이 계측적인 μˆœν™˜κ΅¬μ‘°λ₯Ό μ‚¬μš©ν•  λ•Œ μ‘μš©ν•  수 μžˆλ‹€. λŒ€ν‘œμ μΈ μ‚¬μš©μ‚¬λ‘€λ‘œλŠ” JSON ꡬ쑰 μ •μ˜λ₯Ό λ“€ 수 μžˆκ² λ‹€.

이 κ²½μš°μ—λŠ” Vecκ³Ό HashMap이 방금 Box의 역할을 λŒ€μ²΄ν•œλ‹€.
μ € μ»¬λ ‰μ…˜ κ΅¬μ‘°μ²΄λ“€μ˜ νƒ€μž… μžμ²΄λŠ” κ³ μ • 크기이기 λ•Œλ¬Έμ— Box와 λ§ˆμ°¬κ°€μ§€λ‘œ μœ νš¨ν•˜λ‹€.



μ°Έμ‘°
https://doc.rust-lang.org/reference/types.html#r-type.recursive