๐Ÿ•ท๏ธ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 141 (from laksa165)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

โ„น๏ธ Skipped - page is already crawled

๐Ÿ“„
INDEXABLE
โœ…
CRAWLED
21 days ago
๐Ÿค–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.7 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://blog.cro.sh/posts/four-years-of-rust/
Last Crawled2026-03-16 17:53:23 (21 days ago)
First Indexed2022-12-19 05:09:37 (3 years ago)
HTTP Status Code200
Meta Title4๋…„๊ฐ„์˜ Rust ์‚ฌ์šฉ ํ›„๊ธฐ | Option::None
Meta Description2018๋…„ ์ค‘์ˆœ๋ถ€ํ„ฐ 4๋…„๊ฐ„ Rust๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๊ณ , ์ตœ๊ทผ 1๋…„ ๋ฐ˜ ๊ฐ€๋Ÿ‰์€ ๋ณ‘์—ญํŠน๋ก€๋ฅผ ํ•˜๋ฉด์„œ ํ”„๋กœ๋•์…˜์—์„œ๋„ ์‚ฌ์šฉ์„ ํ•ด ๋ณด์•˜๋‹ค. ์—ฐ๋ง์ด๊ธฐ๋„ ํ•˜๋‹ˆ, ๊ทธ ๋™์•ˆ ๋‚ด๊ฐ€ Rust๋ฅผ ํ•˜๋ฉด์„œ ์–ด๋–ค ์ธ์ƒ์„ ๋ฐ›์•˜๋Š”์ง€๋ฅผ ์ค‘์ ์œผ๋กœ ํ•˜์—ฌ ๋˜๋Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.
Meta Canonicalnull
Boilerpipe Text
2018๋…„ ์ค‘์ˆœ๋ถ€ํ„ฐ 4๋…„๊ฐ„ Rust๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๊ณ , ์ตœ๊ทผ 1๋…„ ๋ฐ˜ ๊ฐ€๋Ÿ‰์€ ๋ณ‘์—ญํŠน๋ก€๋ฅผ ํ•˜๋ฉด์„œ ํ”„๋กœ๋•์…˜์—์„œ๋„ ์‚ฌ์šฉ์„ ํ•ด ๋ณด์•˜๋‹ค. ์—ฐ๋ง์ด๊ธฐ๋„ ํ•˜๋‹ˆ, ๊ทธ ๋™์•ˆ ๋‚ด๊ฐ€ Rust๋ฅผ ํ•˜๋ฉด์„œ ์–ด๋–ค ์ธ์ƒ์„ ๋ฐ›์•˜๋Š”์ง€๋ฅผ ์ค‘์ ์œผ๋กœ ํ•˜์—ฌ ๋˜๋Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ฃผ์˜: ์ž‘์„ฑ์ž์˜ ์‚ฌ๊ฒฌ์ด ๋‹ค๋Ÿ‰ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Rust๋Š” ํญ๋„“๊ฒŒ ์“ฐ์ด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ด์งˆ์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ๊ธฐ๋Šฅ์˜ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ํŠน์ •ํ•œ ์ฒ ํ•™ ํ˜น์€ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๊ดด๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋ฉด ์กฐ๊ธˆ ๋” Rust๋ฅผ ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. Zero-cost Abstraction The concept of zero cost abstractions originally came from the functional world. However, the terminology comes from C++. According to Bjarne Stroustrup, In general, C++ implementations obey the zero-overhead principle: What you donโ€™t use, you donโ€™t pay for. And further: What you do use, you couldnโ€™t hand code any better. 1 ๋ณดํ†ต zero-cost abstraction์„ ๋‘ ๊ฐœ์˜ ๋ฌธ์žฅ์œผ๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ณค ํ•œ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์—๋Š” ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ถ”์ƒํ™”ํ•œ ์ฝ”๋“œ์˜ ๋น„์šฉ์ด ์ถ”์ƒํ™”ํ•˜์ง€ ์•Š์€ ๋‚ ๊ฒƒ์˜ ๊ตฌํ˜„๊ณผ ๋™์ผํ•˜๋‹ค. 1๋ฒˆ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, Rust ์–ธ์–ด์˜ ์ฃผ์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ lifetime์€ ํฌ์ธํ„ฐ(ํ˜น์€ ๋ ˆํผ๋Ÿฐ์Šค)์˜ ์œ ํšจ์„ฑ์„ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค. JavaScript๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค๋Š” ๊ฒƒ์€, ์‚ฌ์‹ค์€ ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ž…( = ) ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ โ€˜๋ณต์ œโ€™ํ•˜์—ฌ๋„, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋ณต์ œ๋˜์–ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํ•ญ์ƒ โ€˜์‚ด์•„ ์žˆ๋Š”โ€™ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋‹ต์€ ์—ญ์„ค์ ์ด๊ฒŒ๋„ โ€˜์ž์‹ ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ์—๋Š” ๊ฐ์ฒด๊ฐ€ ํ•ญ์‚ด ์‚ด์•„ ์žˆ๋Š”๋‹คโ€™๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, JavaScript๋Š” ๋Ÿฐํƒ€์ž„์— ์ž์‹ ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค์˜ ์ˆ˜, ์œ ์‹ํ•œ ๋ง๋กœ refcount๋ฅผ ์ถ”์ ํ•˜๋Š” ๋น„์šฉ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„์™€ ๊ด€๊ณ„์—†์ด ๊ณ ์ •์œผ๋กœ ์ง€์ถœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. (์š”์ฆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ƒ๋‹นํ•œ ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด ์žˆ์–ด์„œ ์ž๋ช…ํ•œ ๊ฒฝ์šฐ์—๋Š” ์—†์•จ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.) Rust์˜ ๊ฒฝ์šฐ์—๋Š” ๋” ์—„๊ฒฉํ•œ ๊ทœ์น™์„ ์ ์šฉํ•ด์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ๊ฐ์˜ ๊ฐ’๋“ค์ด ์–ธ์ œ ์‚ฌ๋ผ์ ธ๋„ ์•ˆ์ „ํ•œ์ง€๋ฅผ ์ถ”์ ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์—๋Š” ๊ทธ๋Ÿฌํ•œ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ–ˆ๋Š”๋ฐ, ์ด โ€˜์–ธ์ œโ€™ ์‹œ์ ์„ lifetime์ด ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. 2๋ฒˆ์˜ ์˜ˆ๋„ ๋“ค์–ด๋ณด์ž. Java์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹ค์ œ ๊ตฌํ˜„์„ ์ฐพ์€ ๋’ค์— ํ•ด๋‹น ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ์—, dynamic dispatch๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค. Dynamic์ด๋ผ๋Š” ๋ง์ด ๋“ค์–ด๊ฐ„ ๊ธฐ๋Šฅ๋‹ต๊ฒŒ, ์ด๋Š” ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค. JVM์—์„œ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜๋Š” ์žˆ๊ฒ ์ง€๋งŒ ๋น„์šฉ์„ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๋‹ค. Rust์˜ ๊ฒฝ์šฐ์—๋Š” (trait object๋ฅผ ์ œ์™ธํ•˜๋ฉด) ๋ชจ๋‘ static dispatch๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด, ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์–ด๋А ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค(๋Œ€์‹  ์ด ๋˜ํ•œ Java์— ๋น„ํ•ด ์ด์งˆ์ ์ด๊ฑฐ๋‚˜ ๊ฒฝ์ง๋œ ์„ค๊ณ„๋ฅผ ์œ ๋„ํ•˜๋Š” ์›์ธ์ด ๋œ๋‹ค). Zero-cost abstraction์ด ์ฃผ๋Š” ์ œ์•ฝ๋„ ๋งŽ์ง€๋งŒ, ๋‚˜๋Š” Rust๊ฐ€ C++์™€ ๊ฒฝ์Ÿํ•˜๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜๋งŽ์€ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ๊ธฐ์—ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋Š” โ€˜Rust์˜ ์žฅ์ โ€™ ๋ฌธ๋‹จ์—์„œ ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜๊ฒ ๋‹ค. ์•”๋ฌต์ ๋ณด๋‹ค๋Š” ๋ช…์‹œ์  ํ‘œํ˜„์„ ์ง€ํ–ฅ C์—์„œ์˜ integer promotion์„ ๊ธฐ์–ตํ•˜๋Š”๊ฐ€? If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions. 2 ๋Œ€์ถฉ ์š”์•ฝํ•˜๋ฉด C์—์„œ์˜ ์ •์ˆ˜ ์—ฐ์‚ฐ์€ ์†์‹ค์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•œ ์•”์‹œ์ ์œผ๋กœ ๊ฐ ๊ฐ’์„ int ํ˜น์€ unsigned int๋กœ ๋ณ€ํ™˜ ํ›„ ๊ณ„์‚ฐํ•œ๋‹ค. C๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, Javascript์˜ 1 + 'a' ๋ผ๋˜๊ฐ€ ํ•˜๋Š”, ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” footgun์ด๋‚˜ ์ˆจ๊ฒจ์ง„ ๋น„์šฉ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Rust๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…์‹œ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด dynamic dispatch๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” trait object๋Š” ์›๋ž˜ trait ์ด๋ฆ„ ๊ทธ ์ž์ฒด๋งŒ ์“ฐ๋ฉด ๋˜์—ˆ์ง€๋งŒ Rust 2018๋ถ€ํ„ฐ๋Š” dyn์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์•ž์— ๋ถ™์—ฌ์•ผ ํ•˜๋„๋ก ๋ฐ”๋€Œ์—ˆ๋‹ค. ์•ž์„œ ๋งํ•œ ํƒ€์ž…์บ์ŠคํŒ…๋„ ๋ชจ๋‘ as ํ‚ค์›Œ๋“œ๋‚˜ try_from (์ •๋ณด ์†์‹ค์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ๋Œ€๋ถ€๋ถ„ ํ›„์ž๊ฐ€ ๊ถŒ์žฅ๋œ๋‹ค) ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค. Rust์˜ ์žฅ์  ๋‚ด๊ฐ€ 4๋…„ ๋™์•ˆ, ์งˆ๋ฆฌ์ง€๋„ ์•Š๊ณ  Rust๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋ฅผ ์†Œ๊ฐœํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ ์ด์— ๋”ฐ๋ผ๋ถ™๋Š” ํ‘œํ˜„๋ ฅ Rust์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ชจ๋ธ๋งํ•  ๋•Œ ๊ฑฐ์Šฌ๋ฆด ์ผ์ด ์—†์„ ์ •๋„๋กœ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ , ํƒ€์ž… ์ถ”๋ก ๊ณผ ํƒ€์ž… ๋ ˆ๋ฒจ ์—ฐ์‚ฐ ๊ธฐ๋Šฅ๋„ ์•„์ฃผ ํ›Œ๋ฅญํ•ด์„œ zero-cost abstraction์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ์— ๋งŽ์€ ๋„์›€์„ ์ค€๋‹ค. ๊ทธ ์ค‘์—์„œ ๋ช‡ ๊ฐœ๋ฅผ ๊ผฝ์•„๋ณด์ž๋ฉดโ€ฆ Generics Rust์˜ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์•„์ฃผ ๊ฐ•๋ ฅํ•ด์„œ, ๋‹ค์Œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค Trait: ํƒ€์ž…์˜ โ€˜ํŠน์„ฑโ€™ ์„ ์„œ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํƒ€์ž…์€ ์ „์ˆœ์„œ๋ฅผ ๊ฐ€์ง„๋‹ค๊ฑฐ๋‚˜, ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค๋˜๊ฐ€โ€ฆ (interface์ฒ˜๋Ÿผ ๋‹ค์ค‘ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ abstract class์ฒ˜๋Ÿผ default implementation์ด ๊ฐ€๋Šฅํ•œ, ์ค‘๊ฐ„์˜ ๋ฌด์–ธ๊ฐ€๋กœ ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.) pub trait Ord : Eq + PartialOrd < Self > { fn cmp ( & self , other: & Self ) -> Ordering ; fn max ( self , other: Self ) -> Self { .. . } fn min ( self , other: Self ) -> Self { .. . } fn clamp ( self , min: Self , max: Self ) -> Self where Self : PartialOrd < Self > , { .. . } } ๊ฐ’์ด ์ „์ˆœ์„œ๋ฅผ ๊ฐ€์ง์„ ํ‘œํ˜„ํ•˜๋Š” Ord๋Š”, ์ˆœ์„œ ์ •์˜์ธ cmp๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด max, min, clamp ๋ฉ”์„œ๋“œ์˜ default implementation์ด ๋”ฐ๋ผ์˜จ๋‹ค. Type bound: ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— trait/lifetime ์กฐ๊ฑด์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. fn find_max < T: Ord > (xs: & [T]) -> & T { // T๊ฐ€ Ord๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค match xs.len() { 0 => panic! ( "xs is empty" ), 1 => & xs[ 0 ], _ => { let mut max = & xs[ 0 ]; for x in xs { if x > max { // ์—ฌ๊ธฐ์„œ T: Ord๊ฐ€ ํ•„์š”ํ•ด์ง„๋‹ค max = x; } } max } } } Generic trait: Trait์—๋„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ From<T> ๋ฅผ ๋ณด์ž. pub trait From < T > { fn from (T) -> Self ; } ์–ด๋–ค ํƒ€์ž…์ด From<T> ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, T๋กœ๋ถ€ํ„ฐ ์ž์‹ ( Self )์œผ๋กœ ์ž๋ช…ํ•˜๊ฒŒ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค. Associated type: Trait์— โ€˜์—ฐ๊ด€๋œโ€™ ํƒ€์ž…์„ ์ •์˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ํƒ€์ž…์ด ์ง€์ •ํ—ค์ฃผ๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค. From<T> ์˜ โ€˜์‹คํŒจ ๊ฐ€๋Šฅํ•œโ€™ ๋ฒ„์ „์ธ TryFrom<T> ๋ฅผ ๋ณด์ž. pub trait TryFrom < T > { type Error ; fn try_from (value: T ) -> Result < Self , Self::Error > ; } ์–ด๋–ค ํƒ€์ž…์ด TryFrom<T> ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด, โ€˜์‹คํŒจ ๊ฐ€๋Šฅํ•œโ€™ T ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๋ณ€ํ™˜๋„ ์ •์˜ํ•˜๊ณ , ๋ณ€ํ™˜์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜ํ•  ๋ฆฌํ„ด ํƒ€์ž…๋„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. Generic implementation: ํ•จ์ˆ˜์™€ trait๋งŒ ์ผ๋ฐ˜ํ™” ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, impl ๋ธ”๋ก๋„ ์ผ๋ฐ˜ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž… ๋ชจ๋‘์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ Trait์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. impl < T, U > Into < U > for T where U: From < T > , { fn into ( self ) -> U { U::from( self ) } } Into<U> ๋Š” From<T> ์˜ โ€˜์—ญ์ˆœโ€™ trait์œผ๋กœ, T -> U ๋ฐฉํ–ฅ์„ ๋’ค์ง‘์–ด์„œ U -> T ๋ฐฉํ–ฅ์œผ๋กœ ( something.into() ์™€ ๊ฐ™์ด) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด ์ฃผ๋Š” trait์ด๋‹ค( From ์ด ์กด์žฌํ•˜๋Š”๋ฐ Into ๊ฐ€ ์™œ ํ•„์š”ํ•˜๋ƒ๊ณ  ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งค์šฐ ์‚ฌ์†Œํ•œ(?) ์ด์œ ์ด๋ฏ€๋กœ ์ผ๋‹จ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ๊ณ  ๊ฐ€์ž). ์ด Into<U> ๋ฅผ U: From<T> ๋ฅผ ๋งŒ์กฑํ•˜๋Š” U์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ๊ฐ์˜ ํƒ€์ž…์— ๋Œ€๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์ผ๋ฐ˜ํ™”๋œ impl ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํƒ€์ž…์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Generic associated type: associated type๋„ ์ผ๋ฐ˜ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด associated type๋„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์กฐ๊ธˆ ๋ณต์žกํ•œ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด๋ณด๋ฉด: trait PointerFamily { type Pointer < T > : Deref < Target = T > ; fn new < T > (value: T ) -> Self ::Pointer < T > ; } struct ArcFamily ; impl PointerFamily for ArcFamily { type Pointer < T > = Arc < T > ; fn new < T > (value: T ) -> Self ::Pointer < T > { Arc::new(value) } } struct RcFamily ; impl PointerFamily for RcFamily { type Pointer < T > = Rc < T > ; fn new < T > (value: T ) -> Self ::Pointer < T > { Rc::new(value) } } struct Foo < P: PointerFamily > { bar: P ::Pointer < String > , } 3 ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ (์Šค๋งˆํŠธ) ํฌ์ธํ„ฐ๋ฅผ PointerFamily๋ผ๋Š” ํ•˜๋‚˜์˜ trait์œผ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ํฌ์ธํ„ฐ๋Š” Rc<T> , Arc<T> ์™€ ๊ฐ™์ด ๊ทธ ์ž์ฒด๋กœ ์ผ๋ฐ˜ํ™”๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ํ•œ ์ฐจ์› ์œ„์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ๋ฐ, ์ด๋ฅผ GAT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ Rust์˜ ๊ฐ•๋ ฅํ•œ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์•„๋ž˜์˜ ADT์™€ ์กฐํ•ฉํ•˜๋ฉด, ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฌธ์ œ์ƒํ™ฉ์„ ํƒ€์ž…์œผ๋กœ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ADT: enum ๊ณผ ํŒจํ„ด ๋งค์นญ Algebraic Data Type์˜ ์ค„์ž„๋ง๋กœ, ํƒ€์ž…์„ ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ์ง‘ํ•ฉ ๊ฐ„์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋Š” ํƒ€์ž…์„ ๋งํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ โ€˜ํ•ฉ์—ฐ์‚ฐโ€™๊ณผ โ€˜๊ณฑ์—ฐ์‚ฐโ€™์„ ๋”ฐ์ง€๋Š”๋ฐ, ๊ฐ๊ฐ Rust์˜ enum ๊ณผ struct ์— ๋Œ€์‘๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, enum ์€ โ€˜orโ€™, struct ๋Š” โ€˜andโ€™๋ฅผ ๋œปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์„ ํƒ€์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ์— ๋งค์šฐ ์ ํ•ฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 3์ธต์งœ๋ฆฌ ์ฐฌ์žฅ์— ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ์ƒ‰๊น”์˜ ์ปต์ด ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ์ฐฌ์žฅ์˜ ๊ฐ โ€˜์ธตโ€™์€ ๋™์‹œ์— ์กด์žฌํ•˜๋ฏ€๋กœ, โ€˜andโ€™ ์—ฐ์‚ฐ์ธ struct ๋ฅผ ์ด์šฉํ•˜๋„๋ก ํ•œ๋‹ค. struct Cupboard { first: Vec < Cup > , second: Vec < Cup > , third: Vec < Cup > , } ์ปต์˜ ๊ฒฝ์šฐ์—๋Š” ์„ธ ๊ฐ€์ง€ ์ƒ‰๊น”์ด ์žˆ๊ณ  ๋™์‹œ์— ๋‘ ๊ฐ€์ง€ ์ƒ‰์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ โ€˜orโ€™ ์—ฐ์‚ฐ์ธ โ€™enumโ€™์„ ์ด์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. enum Cup { Red, Blue, Green, } ๋” ๋‚˜์•„๊ฐ€์„œ, Rust์˜ enum์—๋Š” ๊ฐ variant๋งˆ๋‹ค ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ฐฌ์žฅ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ ‘์‹œ๋„ ์žˆ๋‹ค๋ฉด? enum Object { Cup(Cup), Dish(Dish), } ์ด๋ฒˆ์—๋Š”, ์ ‘์‹œ๋ฅผ ์Œ“์•„์„œ ๋ณด๊ด€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋ฉด? enum Object { Cup(Cup), Dish(Dish), StackedDish( Vec < Dish > ), } ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ enum์ด๋‚˜ struct์—์„œ ๊ฐ’์„ ๋ฝ‘์•„์˜ค๋ ค๋ฉด, ํŒจํ„ด ๋งค์นญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(struct์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋™์ผํ•˜๊ฒŒ . ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค). match object { Cup(cup) => { /* ... */ } Dish(dish) => { /* ... */ } StackedDish(stacked_dish) => { /* ... */ } } ๊ฐ๊ฐ์˜ match ๊ณ๊ฐ€์ง€๋“ค์—์„œ ๊ฐ variant๊ฐ€ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํŒจํ„ด ๋งค์นญ์€ ๋‹จ์ˆœํžˆ โ€˜ํ•œ ๊ฒนโ€™ ๋ฒ—๊ธฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด ์ค‘์ฒฉ๋œ ํŒจํ„ด์—๋„ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋‹ค. match (object1, object2) { // ๋‘ ๊ฐ’์— ๋Œ€ํ•ด ๋™์‹œ์— ๋งค์นญํ•˜๋ฉด์„œ, ์•ˆ์ชฝ์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋„ ํ•œ๋ฒˆ ๋” ๋งค์นญ (Cup(Cup::Red), Cup(Cup::Blue)) => { /* ... */ } // ๋‘ ๊ฐ’์— ๋Œ€ํ•ด ๋™์‹œ์— ๋งค์นญํ•˜๋ฉด์„œ, ์•ˆ์ชฝ์˜ ๊ฐ’์„ ์จ์„œ ์ถ”๊ฐ€์ ์ธ ์กฐ๊ฑด ์ œ์‹œ (Cup(a), Cup(b)) if a == b => { /* ... */ } // Cup: Eq ๋ผ ๊ฐ€์ •ํ•˜์ž. // _ ๋Š” ํ•ญ์ƒ ๋งค์นญ์— ์„ฑ๊ณตํ•˜๋Š” ๊ฐ’์ด๋‹ค. (Dish(dish), _) => { /* ... */ } (StackedDish(stacked_dish), _) => { /* ... */ } // ์œ„์˜ ํŒจํ„ด๋“ค ์ค‘ ์•„๋ฌด๊ฒƒ๋„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด... _ => { /* ... */ } } ์กฐ๊ธˆ ๋” ํ˜„์‹ค์ ์ธ enum์˜ ์˜ˆ์‹œ๋กœ๋Š”, ์—๋Ÿฌ ํ•ธ๋“ค๋ง์˜ ์ค‘์ถ”๊ฐ€ ๋˜๋Š” Result<T, E> ํƒ€์ž…์ด ์žˆ๋‹ค. enum Result < T, E > { Ok (T), Err (E) } (์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ enum์ด๋‚˜ struct๋„ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.) ๋†’์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ Rust์˜ zero-cost abstraction ๋•๋ถ„์—, Rust ํ”„๋กœ๊ทธ๋žจ์€ ์–ผ๋งˆ๋“ ์ง€ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์‚ฌ์šฉํ•˜๋Š” โ€˜๊ฐ€๋ฒผ์šดโ€™ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค(์ฃผ์˜: ์•ฝ๊ฐ„์˜ ์˜ˆ์™ธ ์žˆ์Œ). ์ด๋Š” ๋†’์€ ๋ฒ”์šฉ์„ฑ๊ณผ๋„ ๋งž๋ฌผ๋ฆฌ๋Š”๋ฐ, ์ข€ ๋” ์•„๋ž˜์—์„œ ์„œ์ˆ ํ•˜๊ฒ ๋‹ค. Zero-cost Asynchronous Programming Rust์—์„œ ์ œ์ผ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ผฝ์œผ๋ผ๋ฉด, ๋‚˜๋Š” ๋ง์„ค์ž„ ์—†์ด async / await ์„ ์„ ํƒํ•  ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ๋Š” ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ(์ฒด๊ณ„ ์ž์ฒด๊ฐ€ ์กฐ๊ธˆ ๋” ๋ช…์‹œ์ ์ด๋‹ค), ์†์œผ๋กœ state machine์„ ์งœ์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๋Œ€๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋ฉฐ 4 GC๊ฐ€ ํ•„์š”์—†๋Š” ์–ธ์–ด ์ค‘์—์„œ๋Š” Rust๊ฐ€ ๋…๋ณด์ ์œผ๋กœ ํŽธ์˜์„ฑ๊ณผ ์•ˆ์ „์„ฑ ๋ฉด์—์„œ ์šฐ์œ„๋ฅผ ์ ํ•˜๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ์ด๋Š” ๋Œ€๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์—…์—์„œ ์ €์ง€์—ฐ, ๊ณ ๋ถ€ํ•˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•  ๋•Œ ํฌ๊ฒŒ ์ž‘์šฉํ•˜๋Š”๋ฐ, Discord๋Š” GC๋กœ ์ธํ•œ ์ง€์—ฐ์‹œ๊ฐ„ ํŽธ์ฐจ๋กœ ์ธํ•ด Rust๋กœ ํŠน์ • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์žฌ์ž‘์„ฑํ•˜์—ฌ ํฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์—ˆ๊ณ  , CloudFlare๋Š” ๋‚ด/์™ธ๋ถ€๋ง์„ ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋ก์‹œ๋ฅผ NGINX์—์„œ ์ž์ฒด Rust ๊ตฌํ˜„์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ CPU ์ž์›์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค . ๋ค์œผ๋กœ ์–ป๋Š” memory safety ๋•์— CloudFlare๋Š” ์ˆ˜๋ฐฑ์กฐ ๋‹จ์œ„์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํžˆ๋ฉด์„œ ๋‹จ ํ•œ๋ฒˆ์˜ ํ”„๋ก์‹œ ๋ฒ„๊ทธ๋กœ ์ธํ•œ ํฌ๋ž˜์‹œ๋„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•œ๋‹ค. ์˜คํžˆ๋ ค ํ•˜๋“œ์›จ์–ด ๋ฌธ์ œ์™€ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๋ฒ„๊ทธ ๋ฅผ ์ฐพ๊ธฐ๊นŒ์ง€ ํ–ˆ๋‹ค๊ณ โ€ฆ ๊ฐœ๋ฐœ ๋„๊ตฌ์˜ ์„ฑ์ˆ™ํ•จ ๊ฐœ์ธ์ ์œผ๋กœ Visual Studio๋ณด๋‹ค๋Š” ํ•œ ์ˆ˜ ์•„๋ž˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ โ€˜์‹ ์ƒโ€™ ์–ธ์–ด๋“ค๊ณผ ๋น„๊ตํ•˜๋ฉด ๋…๋ณด์ ์ธ 1์ˆœ์œ„๋ฅผ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ์ง€ ์•Š๋‚˜ ์ƒ๊ฐํ•œ๋‹ค. ๋นŒ๋“œ ์‹œ์Šคํ…œ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์—ญํ• ์„ ํ•ด ์ฃผ๋Š” cargo ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋ฒค์น˜๋งˆํ‚นํ•  ์ •๋„๋กœ 5 Rust์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋กœ ๊ผฝํžˆ๊ณ , Rust ํˆด์ฒด๋“ค์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ์„ค์น˜๋ฅผ ๋„์™€์ฃผ๋Š” rustup ๋„ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค. LSP ๊ตฌํ˜„์ฒด์ธ rust-analyzer ๋•๋ถ„์— LSP ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‚ด์žฅ๋œ ๋งŽ์€ ์—๋””ํ„ฐ์—์„œ IDE์™€ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. Memory Safety ์•ž์„œ ๋งํ•œ zero-cost abstraction์„ ํ†ตํ•ด ๊ถ๊ทน์ ์œผ๋กœ Rust๋Š” โ€˜memory safetyโ€™๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค. Rust์—์„œ unsafe ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ, ์ปดํŒŒ์ผ๋˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Œ์ด ๋ณด์žฅ๋œ๋‹ค . ์•„์ฃผ ๊ฐ€๋”์”ฉ safe ์ฝ”๋“œ๋งŒ์œผ๋กœ undefined behavior๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฉ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ(soundness hole), ๊ทธ๋Ÿฌํ•œ ๋™์ž‘๋“ค์€ ๋ช…๋ฐฑํžˆ ๋ฒ„๊ทธ๋กœ ๊ทœ์ •๋˜์–ด ์ตœ์šฐ์„ ์ ์œผ๋กœ ์ˆ˜์ •๋œ๋‹ค. ๋ฒ”์šฉ์„ฑ ์œ„์—์„œ ๊ณ„์† ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, Rust ์ฝ”๋“œ๋Š” ์ˆ˜๋งŽ์€ ํ”Œ๋žซํผ์—์„œ ๊ตฌ๋™๋˜๊ณ  ์žˆ๋‹ค. ๋ฐ์Šคํฌํƒ‘ ๋ฐ ์Šค๋งˆํŠธํฐ OS์˜ ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Windows, Linux, MacOS, Android, iOS ๊ณ ์„ฑ๋Šฅ ์›น ๋ฐฑ์—”๋“œ Linux Kernel ๋“œ๋ผ์ด๋ฒ„ (>= 6.1) eBPF ๋ฐ WebAssembly ๋ธ”๋ก์ฒด์ธ(๋ธ”๋ก์ฒด์ธ ๋…ธ๋“œ, ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ตฌํ˜„ ๋“ฑ์— ๋ชจ๋‘ ์“ฐ์ธ๋‹ค). ์ž„๋ฒ ๋””๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(์ด ์ชฝ์€ ๋น„๊ต์  ์ƒํƒœ๊ณ„๊ฐ€ ์•ฝํ•˜๋‹ค) ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Rust๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ zero-cost abstraction์„ ์ง€ํ–ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํ”Œ๋žซํผ์— ์˜ฌ๋ ค๋†“์•„๋„ ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Javascript๋ฅผ eBPF ์œ„์— ์˜ฌ๋ฆฌ๋ ค ํ•˜๋ฉด, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด๋‚˜ ์•ฝํ•œ ๋™์  ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๋น„์šฉ์ด ํ•„์—ฐ์ ์œผ๋กœ ๋”ฐ๋ผ์˜ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. (AssemblyScript์™€ ๊ฐ™์ด ํŒŒํŽธํ™”๋œ ์ƒํƒœ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค). Rust์˜ ๋‹จ์  ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๋ณด๋ฉด Rust๋Š” โ€˜์™„์ „ํ•œโ€™ ์–ธ์–ด ๊ฐ™์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. Rust๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ๊ทธ๋Ÿฌํ•œ ๊ฒฐ์ ๋“ค์„ ํฌ๊ฒŒ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋†’์€ ์ง„์ž… ์žฅ๋ฒฝ Rust๋Š” ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค(์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋Š” ์ง€์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค) 6 . ์˜ˆ๋ฅผ ๋“ค์–ด, Rust์—์„œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ์˜ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค: String (ํž™์— ํ• ๋‹น๋œ UTF-8 ๋ฌธ์ž์—ด) &str (๋ฌธ์ž์—ด โ€˜์Šฌ๋ผ์ด์Šคโ€™. UTF-8๋กœ ํ‘œํ˜„๋œ ๋ฐ”์ดํŠธ์—ด์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค) &String์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— &str์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. &[u8] (๋ฐ”์ดํŠธ์—ด. ๊ทธ ์ž์ฒด๋กœ ๋ฌธ์ž์—ด์€ ์•„๋‹ˆ์ง€๋งŒ ํŒŒ์‹ฑ ์ „์— ๋งŒ๋‚  ํ™•๋ฅ ์ด ๋†’๋‹ค) Cow<str> (โ€˜Copy-on-Writeโ€™ ๋ฌธ์ž์—ด. ๋ณต์‚ฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค) impl AsRef<str> (๊ทธ ์ž์ฒด๋กœ ํƒ€์ž…์€ ์•„๋‹ˆ์ง€๋งŒ, &str ๊ณผ String ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค) OsString , CString , Path ์™€ ๊ฐ™์ด ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์„ ์ง€๋‹Œ ํƒ€์ž…๋“ค์„ ๊ฑฐ๋ก ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ๋ฒŒ์จ ๊ณต๋ถ€ํ•  ๊ฒƒ์ด ์‚ฐ๋”๋ฏธ๊ฐ€ ๋˜์—ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์€ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์„ ๋ฐฐ์ œํ•˜๊ณ  ์‰ฌ์šด ๊ธธ๋กœ (๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ณ )๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ, Rust์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„ ํ•™์Šต์ž๋ฅผ ์ขŒ์ ˆ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ—ˆ๋‹คํ•˜๋‹ค. ๋ฌผ๋ก  Rust๋„ โ€˜์‰ฌ์šด ๊ธธโ€™์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ „ ์ฝ”๋“œ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๋Š”์ง€์กฐ์ฐจ๋„ ์•Œ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์„ค๊ณ„์˜ ์ œ์•ฝ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ADT๋ฅผ ์ฐฌ์–‘ํ–ˆ๋‹ค๊ฐ€ ์ œ์•ฝ์ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๋ชจ์ˆœ๋˜์ง€ ์•Š๋ƒ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Rust์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์ด โ€˜์•ˆ์ „ํ•˜๋ฉฐ ๋น„์šฉ ์—†์ดโ€™ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋„ ์žˆ๋‹ค. ์ž๊ธฐ์ฐธ์กฐ/์ˆœํ™˜์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ€ ๊ทธ๊ฒƒ์ธ๋ฐ, lifetime์˜ ์กด์žฌ๋กœ ์ธํ•ด ๋ชจ๋“  Rust์˜ ๊ฐ’๋“ค ๊ฐ„์˜ ์ฐธ์กฐ ๊ด€๊ณ„๋Š” DAG(๋ฐฉํ–ฅ ์žˆ๊ณ  ์ˆœํ™˜ ์—†๋Š” ๊ทธ๋ž˜ํ”„)๋กœ ํ‘œํ˜„๋  ์ˆ˜๋ฐ–์— ์—†๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„ lifetime์„ ์ •์˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ๋‹ค. ๋ฌผ๋ก  Arc::new_cyclic ๊ณผ ๊ฐ™์ด ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ๋„๊ตฌ๋“ค๋„ ์žˆ์œผ๋‚˜, weak pointer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ์‹์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํฌํ•จ)์„ ์ง€๋ถˆํ•˜๊ฑฐ๋‚˜, Pin::new_unchecked ๋ฅผ ์จ์„œ unsafeํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. (ํ›„์ž๋Š” ouroboros ๋ผ๋Š” crate๊ฐ€ ์ž๊ธฐ์ฐธ์กฐ๋ฅผ ํŽธํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ง์ ‘ ์จ๋ณด์ง€๋Š” ์•Š์•„์„œ ์–ธ๊ธ‰ํ•˜์ง€๋Š” ์•Š๊ฒ ๋‹ค.) ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ธ๋ฐ, ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ์ง„์ž…ํ•œ ์ดˆ์‹ฌ์ž ์ž…์žฅ์—์„œ๋Š” ์–ด๋ ค์šธ ์ˆ˜๋ฐ–์— ์—†๋‹ค. C/C++/Java ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ•œ์ค„ ํ•œ์ค„(line-by-line) ๋ฒˆ์—ญํ•ด ์ด์‹ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฌํ•œ ์–ธ์–ด๋“ค์—์„œ๋Š” ์ž๊ธฐ์ฐธ์กฐ๋‚˜ ์ˆœํ™˜์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ํŒจํ„ด์ด ์ข…์ข… ๋ณด์ด๊ณค ํ•œ๋‹ค. (๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ผ๋˜๊ฐ€, ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ผ๋˜๊ฐ€) ์ž๊ธฐ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, Rust์˜ borrow checker์™€ ๊ถํ•ฉ์ด ๋งž์ง€ ์•Š๋Š” ํŒจํ„ด๋“ค์ด ์—ฌ๋Ÿฟ ์กด์žฌํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ callback์ด ์ฃผ๊ฐ€ ๋˜๋Š” ์˜ต์ €๋ฒ„ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ callback์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ํ• ๋‹น์ด๋‚˜ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…์ด ํ•„์š”ํ•ด์ง€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ์ฃผ์˜ ๊นŠ๊ฒŒ unsafe ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ์‹์œผ๋กœ ๊ฒฉ๋ฆฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ(Rust์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.) Rust๊ฐ€ ์˜๋„ํ•˜๋Š” ์ด์ƒ์ด ํ•ญ์ƒ ํ˜„์‹ค์— 100% ์ ์šฉ๋  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ โ€˜๊ฒฉ๋ฆฌโ€™ ์ž‘์—…์— unsafe๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ โ€˜์˜ฌ๋ฐ”๋ฅด๊ฒŒโ€™ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„์ฃผ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค. Rust์˜ memory safety ๋“ฑ์ด ์ œ๊ณตํ•˜๋Š” ๋ณด์žฅ์˜ ํŠน์„ฑ์ƒ, ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ทœ์น™์ด ์—„๊ฒฉํ•˜๊ณ  ์ด๋ฅผ ์œ„๋ฐ˜ํ•  ์‹œ์— ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ณต๊ฒฉ์ ์ธ ์ตœ์ ํ™”๋กœ ์ธํ•œ ์˜ค์ž‘๋™์ด ๋” ํฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋น„๊ต์  ๋‚ฎ์€ ์ƒ์‚ฐ์„ฑ(๊ฐœ๋ฐœ ์†๋„) ์ˆ™๋ จ๋œ Rust ํ”„๋กœ๊ทธ๋ž˜๋จธ๋„ lifetime, borrow checker, type checker์™€ ์”จ๋ฆ„ํ•˜๋Š” ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค. ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์„œ ๋‚ด๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •๋ฆฝ๋œ B2C ์„œ๋น„์Šค๋“ค์„ ์šด์˜ํ•˜๋Š” ๊ธฐ์—…์˜ ๊ฒฝ์šฐ์—๋Š” Rust๋ฅผ ๋„์ž…ํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋น„๊ต์  ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Œ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ๊ฒฌ์œผ๋กœ, ์ด๋Š” Go๊ฐ€ ์›น ๋ฐฑ์—”๋“œ ๋ถ„์•ผ์—์„œ ํฌ๊ฒŒ ์œ ํ–‰ํ•œ ์ด์œ ์™€ ๊ฑฐ์˜ ์ •๋ฐ˜๋Œ€๋˜๋Š”๋ฐ, Go๋Š” ๋ณต์žกํ•œ ๋ฌธ์ œ๋„ ๋น„์šฉ์„ ๋‚ด๊ณ  ์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉฐ, ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋ณ„๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์—†๊ณ (1.18์—์•ผ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ •์‹์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค), ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋„ ๋งŽ์ง€ ์•Š์•„ ์ง„์ž…์žฅ๋ฒฝ์ด ๋งค์šฐ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋†’์€ ์ƒ์‚ฐ์„ฑ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งคํฌ๋กœ ์ด ๊ธฐ๋Šฅ์€ Rust์—์„œ ๋ฌด์ œํ•œ์— ๊ฐ€๊นŒ์šด ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ฉ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ์„œ์ˆ ํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ, ๋งคํฌ๋กœ๋Š” ๋ฌธ๋ฒ• ํ† ํฐ ํŠธ๋ฆฌ๋ฅผ ๋ฐ›์•„์„œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ• ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ทœ์น™์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์„ค๋ช…์—์„œ๋„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๊ธฐ์กด์˜ Rust ์ง€์‹๊ณผ๋Š” ํŒ์ดํ•œ, Rust์˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ์— ๊ด€ํ•œ ์ง€์‹์„ ์Šต๋“ํ•ด์•ผ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋งคํฌ๋กœ๋Š” ์‚ฌ์‹ค์ƒ Rust ๋ฌธ๋ฒ•๋งŒ ์ฐจ์šฉํ•œ ๋˜๋‹ค๋ฅธ Rust ์•ˆ์˜ ๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ์„œ ๊ธฐ๋Šฅํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์˜ ๊ดด๋ฆฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. (์ด ๋‹จ์ ์€ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋งคํฌ๋กœ ์ •์˜ ๋ฐฉ์‹์ธ procedural macro์™€ declarative macro์— ๋ชจ๋‘ ํ•ด๋‹น๋œ๋‹ค.) ๋‘ ๋ฒˆ์งธ๋กœ, proc-macro๋Š” ๋งคํฌ๋กœ๋ฅผ ์ ์šฉํ•˜๋ ค๋Š” ์ฝ”๋“œ ์ด์ „์— ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ํŠนํžˆ ์ด๋Š” ์†Œ์Šค์ฝ”๋“œ๋งŒ์„ ์••์ถ•ํ•ด์„œ ์˜ฌ๋ฆฌ๋Š” Rust์˜ crate ์‹œ์Šคํ…œ๊ณผ ๋งž๋ฌผ๋ ค ๋ฌธ์ œ๋ฅผ ๊ฐ€์ค‘์‹œํ‚ค๋Š”๋ฐ, proc-macro๋ฅผ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๊ด€๋ จํ•˜์—ฌ watt ๋ผ๋Š” ์‹คํ—˜์ ์ธ WebAssembly ๊ธฐ๋ฐ˜ proc-macro ๋Ÿฐํƒ€์ž„์ด ์žˆ์ง€๋งŒ ๋ฉ”์ธ์ŠคํŠธ๋ฆผ์— ๋“ค์–ด์˜ค๊ธฐ๋Š” ์•„์ง ๊ณค๋ž€ํ•˜๋‹ค.) ์„ธ ๋ฒˆ์งธ๋กœ, IDE์™€ proc-macro ๊ฐ„์˜ ์กฐํ™”๊ฐ€ ์ข‹์€ ํŽธ์€ ์•„๋‹ˆ๋ผ proc-macro๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์˜คํžˆ๋ ค ๊ฐ์†Œํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. โ€˜์ „ํ†ต์ ์ธโ€™ ๋งคํฌ๋กœ ์ •์˜ ๋ฐฉ๋ฒ•์ธ โ€˜decl-macroโ€™, ๋‹ค๋ฅธ ๋ง๋กœ macros by example ๋ฐฉ์‹์€ ์ƒ์ˆ ํ•œ ๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋น„๊ต์  ์ž์œ ๋กญ์ง€๋งŒ, proc-macro๋ณด๋‹ค๋„ ๋” ์ด์งˆ์ ์ธ ๋ฌธ๋ฒ•๊ณผ ์ •์˜ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ (๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด, Rust ์ฝ”๋“œ์˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ์— ๋Œ€ํ•ด ํŒจํ„ด ๋งค์นญ์„ ์‹œ๋„ํ•œ๋‹ค), ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„์—๋„ ์ œ์•ฝ์ด ์žˆ์–ด์„œ ๊ธฐ๋Šฅ์˜ ๋ณต์žก๋„๊ฐ€ ํŠน์ • ์ง€์ ์„ ๋„˜์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. (๊ทธ ์˜ˆ์‹œ๋กœ, ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” pin-project ์™€ pin-project-lite ๋ฅผ ๋ณด๋ฉด ์ „์ž๋Š” proc-macro, ํ›„์ž๋Š” macros by example ๋ฐฉ์‹์ธ๋ฐ ํ›„์ž๋Š” ์ „์ž์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ›จ์”ฌ ๋” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค). ๋งˆ์ด๋„ˆ๋ฆฌํ‹ฐ Rust ๊ตฌ์ธ/๊ตฌ์ง ์‹œ์žฅ์€ Go์™€ ๋น„๊ตํ•ด์„œ๋„ ๋งค์šฐ ์ข๋‹ค. ํŠนํžˆ ํ•œ๊ตญ์€ ๊ฒฉ์ฐจ๊ฐ€ ํ›จ์”ฌ ์‹ฌํ•˜๋‹ค. ๊ฒฐ๋ก : 10๋…„ ๋’ค์—๋„ Rust๋กœ ๋ฐฅ๋ฒŒ์ด๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ? ๋‹จ์ ์„ ์ค„์ค„์ด ๋‚˜์—ดํ–ˆ์ง€๋งŒ ๋‹ต์€ โ€˜yesโ€™๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ˜„์žฌ(๊ทธ๋ฆฌ๊ณ  ๊ทผ๋ฏธ๋ž˜)์˜ Rust ์‚ฌ์šฉ์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ ํ˜„์žฌ๋กœ์„œ๋Š”, ๊ฐํžˆ ๋งํ•˜๊ฑด๋ฐ ๋‹ค์Œ์˜ ์ƒํ™ฉ์—์„œ Rust๋ฅผ ์ด๊ธธ ๋Œ€์•ˆ์€ ์—†๋‹ค. ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜์—ฌ ๋†’์€ ์›Œํฌ๋กœ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  I/O๊ฐ€ ๋งค์šฐ ์žฆ์œผ๋ฉฐ ๋ถˆํŠน์ • ๋‹ค์ˆ˜์—๊ฒŒ ์„œ๋น„์Šค(B2C)ํ•˜์—ฌ ๊ฐ•๊ฑด์„ฑ์„ ํŠนํžˆ ์‹ ๊ฒฝ์จ์•ผ ํ•˜๋Š” (์ด๋“ค ์ค‘ ๋‘ ๊ฐœ๋งŒ ํ•ด๋‹น๋˜์–ด๋„ ์•„์ฃผ ๋งค๋ ฅ์ ์ธ ์„ ํƒ์ด ๋œ๋‹ค) ํ”ํžˆ ๋งํ•˜๋Š” โ€˜๋น…ํ…Œํฌโ€™ ๋ฐฑ์—”๋“œ ๋ถ„์•ผ์—์„œ๋Š” Rust์˜ zero-cost abstraction, async / await , memory safety๋Š” ๋…๋ณด์ ์ธ ๋งค๋ ฅ์„ ๊ฐ€์ง„๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์€ ์ด๋Ÿฌํ•œ ๋งค๋ ฅ์ด ๋น„๊ต์  ์ž‘์€ ์กฐ์ง์—์„œ๋Š” ์–ดํ•„๋˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์ด๋‹ค. ํฌ๋กœ์Šคํ”Œ๋žซํผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ชจ๋“ˆ Rust์˜ ํ‘œํ˜„๋ ฅ๊ณผ ๋ฒ”์šฉ์„ฑ์€ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•  ๋•Œ ํฐ ์ด์ ์ด ๋œ๋‹ค. rustc์˜ ํƒ€๊นƒ ๋ชฉ๋ก ์„ ๋ณด๋ฉด, ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” PC/๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ๋“ค์€ ๋ชจ๋‘ Tier 1/2์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ Rust ์ฝ”๋“œ๋ฅผ ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋นŒ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๋˜ํ•œ rust-bindgen , cbindgen ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด C FFI๋ฅผ ํ†ตํ•ด ํ”Œ๋žซํผ ๊ณ ์œ  ์ฝ”๋“œ์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐ์—๋„ ์–ด๋ ค์›€์ด ์—†๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ธํ”„์ฝ˜ 2022์—์„œ ํฌ๋กœ์Šคํ”Œ๋žซํผ Rust๋ฅผ ๋ฐœํ‘œํ•œ ์ž๋ฃŒ ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. FFI๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ณ ์„ฑ๋Šฅ ์—ฐ์‚ฐ ๋ชจ๋“ˆ ์ตœ๊ทผ์— ์•Œ๊ฒŒ ๋˜์–ด ์•„์ง ๊ฒ€ํ† ๊ฐ€ ๋ถ€์กฑํ•˜์ง€๋งŒ ๋ถˆํ™•์‹คํ•จ์„ ๋ฌด๋ฆ…์“ฐ๊ณ  ์—ฌ๊ธฐ์— ์ฃผ์žฅ์„ ๋‚จ๊ฒจ ๋ณด๋ฉด, Rust์˜ ๋น„๊ต์  ๊ฒฝ์ง๋œ ์„ค๊ณ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์  ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์™€์˜ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ํšจํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Python์— ์‰ฝ๊ฒŒ Rust ์ฝ”๋“œ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” PyO3 ๋‚˜, Ruby ์ต์Šคํ…์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Magnus ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŒ…์„ ์œ„์ฃผ๋กœ ์ž‘์„ฑํ•˜๋˜ ๋ณ‘๋ชฉ ์ง€์ ์—์„œ Rust๋กœ ์ž‘์„ฑํ•œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ์„ ๊พ€ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” LuaJIT๊ณผ์˜ ์—ฐ๋™์— ๊ด€์‹ฌ์ด ์žˆ๋Š”๋ฐ, mlua ๋ผ๋Š” crate๊ฐ€ ์žˆ์–ด ์ฃผ์˜๊นŠ๊ฒŒ ์ง€์ผœ๋ณด๊ณ  ์žˆ๋‹ค. ๋งˆ๋ฌด๋ฆฌ Rust๋ฅผ ์„ ๋„์ ์œผ๋กœ ๋„์ž…ํ•œ ์‚ฌ๋ก€๋“ค์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์†Œ์ˆ˜์˜ ๋น…ํ…Œํฌ ํšŒ์‚ฌ๋“ค์„ ์‹œ์ž‘์œผ๋กœ ํ•œ Rust์˜ ๋ฌผ๊ฒฐ์€ ์ด์ œ ๋ถ€์ •ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋˜์—ˆ๋‹ค. ์ƒ์ˆ ํ•˜์˜€๋“ฏ์ด Rust๊ฐ€ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋งŒ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์€ํƒ„ํ™˜์ด ๋  ์ˆ˜๋Š” ์—†๋Š” ๊ฑธ ์•Œ๋ฉด์„œ๋„, Rust๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” Rust๊ฐ€ ์ง€๊ธˆ๋ณด๋‹ค ํ›จ์”ฌ ํญ๋„“์€ ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ด ์žˆ๋‹ค. ์•ž์œผ๋กœ๋„ Rust๋ฅผ ์จ์„œ ์ข‹์•„ํ•˜๋Š” ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋ฉฐ ๋ถ€์กฑํ•œ ํšŒ๊ณ ๋ก์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ๋‹ค. https://stackoverflow.com/a/73518476 ย  โ†ฉ๏ธŽ https://stackoverflow.com/a/44456310 ย  โ†ฉ๏ธŽ https://rust-lang.github.io/rfcs/1598-generic_associated_types.html#associated-type-constructors-of-type-arguments ย  โ†ฉ๏ธŽ http://aturon.github.io/tech/2016/08/11/futures ย  โ†ฉ๏ธŽ https://github.com/python-poetry/poetry/tree/c5c7624ef64f34d9f50c3b7e8118f7f652fddbbd#why ย  โ†ฉ๏ธŽ https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride#parting-words ย  โ†ฉ๏ธŽ
Markdown
[Option::None](https://blog.cro.sh/ "Option::None (Alt + H)") - [Search](https://blog.cro.sh/search/ "Search (Alt + /)") # 4๋…„๊ฐ„์˜ Rust ์‚ฌ์šฉ ํ›„๊ธฐ December 11, 2022 2018๋…„ ์ค‘์ˆœ๋ถ€ํ„ฐ 4๋…„๊ฐ„ Rust๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๊ณ , ์ตœ๊ทผ 1๋…„ ๋ฐ˜ ๊ฐ€๋Ÿ‰์€ ๋ณ‘์—ญํŠน๋ก€๋ฅผ ํ•˜๋ฉด์„œ ํ”„๋กœ๋•์…˜์—์„œ๋„ ์‚ฌ์šฉ์„ ํ•ด ๋ณด์•˜๋‹ค. ์—ฐ๋ง์ด๊ธฐ๋„ ํ•˜๋‹ˆ, ๊ทธ ๋™์•ˆ ๋‚ด๊ฐ€ Rust๋ฅผ ํ•˜๋ฉด์„œ ์–ด๋–ค ์ธ์ƒ์„ ๋ฐ›์•˜๋Š”์ง€๋ฅผ ์ค‘์ ์œผ๋กœ ํ•˜์—ฌ ๋˜๋Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. ``` ์ฃผ์˜: ์ž‘์„ฑ์ž์˜ ์‚ฌ๊ฒฌ์ด ๋‹ค๋Ÿ‰ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ``` # Rust์˜ ์ฒ ํ•™[\#](https://blog.cro.sh/posts/four-years-of-rust/#rust%EC%9D%98-%EC%B2%A0%ED%95%99) Rust๋Š” ํญ๋„“๊ฒŒ ์“ฐ์ด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ด์งˆ์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ๊ธฐ๋Šฅ์˜ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ํŠน์ •ํ•œ ์ฒ ํ•™ ํ˜น์€ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๊ดด๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋ฉด ์กฐ๊ธˆ ๋” Rust๋ฅผ ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ## Zero-cost Abstraction[\#](https://blog.cro.sh/posts/four-years-of-rust/#zero-cost-abstraction) > The concept of zero cost abstractions originally came from the functional world. However, the terminology comes from C++. According to Bjarne Stroustrup, > > > In general, C++ implementations obey the zero-overhead principle: What you donโ€™t use, you donโ€™t pay for. And further: What you do use, you couldnโ€™t hand code any better. [1](https://blog.cro.sh/posts/four-years-of-rust/#fn:1) ๋ณดํ†ต zero-cost abstraction์„ ๋‘ ๊ฐœ์˜ ๋ฌธ์žฅ์œผ๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ณค ํ•œ๋‹ค. 1. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์—๋Š” ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€ ์•Š๋Š”๋‹ค. 2. ์ถ”์ƒํ™”ํ•œ ์ฝ”๋“œ์˜ ๋น„์šฉ์ด ์ถ”์ƒํ™”ํ•˜์ง€ ์•Š์€ ๋‚ ๊ฒƒ์˜ ๊ตฌํ˜„๊ณผ ๋™์ผํ•˜๋‹ค. 1๋ฒˆ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, Rust ์–ธ์–ด์˜ ์ฃผ์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ lifetime์€ ํฌ์ธํ„ฐ(ํ˜น์€ ๋ ˆํผ๋Ÿฐ์Šค)์˜ ์œ ํšจ์„ฑ์„ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค. JavaScript๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค๋Š” ๊ฒƒ์€, ์‚ฌ์‹ค์€ ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ž…(`=`) ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ โ€˜๋ณต์ œโ€™ํ•˜์—ฌ๋„, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋ณต์ œ๋˜์–ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํ•ญ์ƒ โ€˜์‚ด์•„ ์žˆ๋Š”โ€™ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋‹ต์€ ์—ญ์„ค์ ์ด๊ฒŒ๋„ โ€˜์ž์‹ ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ์—๋Š” ๊ฐ์ฒด๊ฐ€ ํ•ญ์‚ด ์‚ด์•„ ์žˆ๋Š”๋‹คโ€™๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, JavaScript๋Š” ๋Ÿฐํƒ€์ž„์— ์ž์‹ ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค์˜ ์ˆ˜, ์œ ์‹ํ•œ ๋ง๋กœ refcount๋ฅผ ์ถ”์ ํ•˜๋Š” ๋น„์šฉ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„์™€ ๊ด€๊ณ„์—†์ด ๊ณ ์ •์œผ๋กœ ์ง€์ถœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. (์š”์ฆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ƒ๋‹นํ•œ ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด ์žˆ์–ด์„œ ์ž๋ช…ํ•œ ๊ฒฝ์šฐ์—๋Š” ์—†์•จ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.) Rust์˜ ๊ฒฝ์šฐ์—๋Š” ๋” ์—„๊ฒฉํ•œ ๊ทœ์น™์„ ์ ์šฉํ•ด์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ๊ฐ์˜ ๊ฐ’๋“ค์ด ์–ธ์ œ ์‚ฌ๋ผ์ ธ๋„ ์•ˆ์ „ํ•œ์ง€๋ฅผ ์ถ”์ ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์—๋Š” ๊ทธ๋Ÿฌํ•œ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ–ˆ๋Š”๋ฐ, ์ด โ€˜์–ธ์ œโ€™ ์‹œ์ ์„ lifetime์ด ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. 2๋ฒˆ์˜ ์˜ˆ๋„ ๋“ค์–ด๋ณด์ž. Java์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹ค์ œ ๊ตฌํ˜„์„ ์ฐพ์€ ๋’ค์— ํ•ด๋‹น ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ์—, dynamic dispatch๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค. Dynamic์ด๋ผ๋Š” ๋ง์ด ๋“ค์–ด๊ฐ„ ๊ธฐ๋Šฅ๋‹ต๊ฒŒ, ์ด๋Š” ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค. JVM์—์„œ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜๋Š” ์žˆ๊ฒ ์ง€๋งŒ ๋น„์šฉ์„ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๋‹ค. Rust์˜ ๊ฒฝ์šฐ์—๋Š” (trait object๋ฅผ ์ œ์™ธํ•˜๋ฉด) ๋ชจ๋‘ static dispatch๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด, ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์–ด๋А ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค(๋Œ€์‹  ์ด ๋˜ํ•œ Java์— ๋น„ํ•ด ์ด์งˆ์ ์ด๊ฑฐ๋‚˜ ๊ฒฝ์ง๋œ ์„ค๊ณ„๋ฅผ ์œ ๋„ํ•˜๋Š” ์›์ธ์ด ๋œ๋‹ค). Zero-cost abstraction์ด ์ฃผ๋Š” ์ œ์•ฝ๋„ ๋งŽ์ง€๋งŒ, ๋‚˜๋Š” Rust๊ฐ€ C++์™€ ๊ฒฝ์Ÿํ•˜๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜๋งŽ์€ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ๊ธฐ์—ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋Š” โ€˜Rust์˜ ์žฅ์ โ€™ ๋ฌธ๋‹จ์—์„œ ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜๊ฒ ๋‹ค. ## ์•”๋ฌต์ ๋ณด๋‹ค๋Š” ๋ช…์‹œ์  ํ‘œํ˜„์„ ์ง€ํ–ฅ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EC%95%94%EB%AC%B5%EC%A0%81%EB%B3%B4%EB%8B%A4%EB%8A%94-%EB%AA%85%EC%8B%9C%EC%A0%81-%ED%91%9C%ED%98%84%EC%9D%84-%EC%A7%80%ED%96%A5) C์—์„œ์˜ integer promotion์„ ๊ธฐ์–ตํ•˜๋Š”๊ฐ€? > If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions. [2](https://blog.cro.sh/posts/four-years-of-rust/#fn:2) ๋Œ€์ถฉ ์š”์•ฝํ•˜๋ฉด C์—์„œ์˜ ์ •์ˆ˜ ์—ฐ์‚ฐ์€ ์†์‹ค์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•œ ์•”์‹œ์ ์œผ๋กœ ๊ฐ ๊ฐ’์„ int ํ˜น์€ unsigned int๋กœ ๋ณ€ํ™˜ ํ›„ ๊ณ„์‚ฐํ•œ๋‹ค. C๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, Javascript์˜ `1 + 'a'`๋ผ๋˜๊ฐ€ ํ•˜๋Š”, ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” footgun์ด๋‚˜ ์ˆจ๊ฒจ์ง„ ๋น„์šฉ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Rust๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…์‹œ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด dynamic dispatch๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” trait object๋Š” ์›๋ž˜ trait ์ด๋ฆ„ ๊ทธ ์ž์ฒด๋งŒ ์“ฐ๋ฉด ๋˜์—ˆ์ง€๋งŒ Rust 2018๋ถ€ํ„ฐ๋Š” dyn์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์•ž์— ๋ถ™์—ฌ์•ผ ํ•˜๋„๋ก ๋ฐ”๋€Œ์—ˆ๋‹ค. ์•ž์„œ ๋งํ•œ ํƒ€์ž…์บ์ŠคํŒ…๋„ ๋ชจ๋‘ `as` ํ‚ค์›Œ๋“œ๋‚˜ `try_from`(์ •๋ณด ์†์‹ค์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ๋Œ€๋ถ€๋ถ„ ํ›„์ž๊ฐ€ ๊ถŒ์žฅ๋œ๋‹ค) ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค. # Rust์˜ ์žฅ์ [\#](https://blog.cro.sh/posts/four-years-of-rust/#rust%EC%9D%98-%EC%9E%A5%EC%A0%90) ๋‚ด๊ฐ€ 4๋…„ ๋™์•ˆ, ์งˆ๋ฆฌ์ง€๋„ ์•Š๊ณ  Rust๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋ฅผ ์†Œ๊ฐœํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ## ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ ์ด์— ๋”ฐ๋ผ๋ถ™๋Š” ํ‘œํ˜„๋ ฅ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%A4%EC%9A%B0-%EA%B0%95%EB%A0%A5%ED%95%9C-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EA%B3%BC-%EC%9D%B4%EC%97%90-%EB%94%B0%EB%9D%BC%EB%B6%99%EB%8A%94-%ED%91%9C%ED%98%84%EB%A0%A5) Rust์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ชจ๋ธ๋งํ•  ๋•Œ ๊ฑฐ์Šฌ๋ฆด ์ผ์ด ์—†์„ ์ •๋„๋กœ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ณ , ํƒ€์ž… ์ถ”๋ก ๊ณผ ํƒ€์ž… ๋ ˆ๋ฒจ ์—ฐ์‚ฐ ๊ธฐ๋Šฅ๋„ ์•„์ฃผ ํ›Œ๋ฅญํ•ด์„œ zero-cost abstraction์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ์— ๋งŽ์€ ๋„์›€์„ ์ค€๋‹ค. ๊ทธ ์ค‘์—์„œ ๋ช‡ ๊ฐœ๋ฅผ ๊ผฝ์•„๋ณด์ž๋ฉดโ€ฆ ### Generics[\#](https://blog.cro.sh/posts/four-years-of-rust/#generics) Rust์˜ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์•„์ฃผ ๊ฐ•๋ ฅํ•ด์„œ, ๋‹ค์Œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค - Trait: ํƒ€์ž…์˜ โ€˜ํŠน์„ฑโ€™ ์„ ์„œ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํƒ€์ž…์€ ์ „์ˆœ์„œ๋ฅผ ๊ฐ€์ง„๋‹ค๊ฑฐ๋‚˜, ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค๋˜๊ฐ€โ€ฆ (interface์ฒ˜๋Ÿผ ๋‹ค์ค‘ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ abstract class์ฒ˜๋Ÿผ default implementation์ด ๊ฐ€๋Šฅํ•œ, ์ค‘๊ฐ„์˜ ๋ฌด์–ธ๊ฐ€๋กœ ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.) ``` pub trait Ord: Eq + PartialOrd<Self> { fn cmp(&self, other: &Self) -> Ordering; fn max(self, other: Self) -> Self { ... } fn min(self, other: Self) -> Self { ... } fn clamp(self, min: Self, max: Self) -> Self where Self: PartialOrd<Self>, { ... } } ``` ๊ฐ’์ด ์ „์ˆœ์„œ๋ฅผ ๊ฐ€์ง์„ ํ‘œํ˜„ํ•˜๋Š” Ord๋Š”, ์ˆœ์„œ ์ •์˜์ธ cmp๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด max, min, clamp ๋ฉ”์„œ๋“œ์˜ default implementation์ด ๋”ฐ๋ผ์˜จ๋‹ค. - Type bound: ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— trait/lifetime ์กฐ๊ฑด์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ``` fn find_max<T: Ord>(xs: &[T]) -> &T { // T๊ฐ€ Ord๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค match xs.len() { 0 => panic!("xs is empty"), 1 => &xs[0], _ => { let mut max = &xs[0]; for x in xs { if x > max { // ์—ฌ๊ธฐ์„œ T: Ord๊ฐ€ ํ•„์š”ํ•ด์ง„๋‹ค max = x; } } max } } } ``` - Generic trait: Trait์—๋„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ `From<T>`๋ฅผ ๋ณด์ž. ``` pub trait From<T> { fn from(T) -> Self; } ``` ์–ด๋–ค ํƒ€์ž…์ด `From<T>` ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, T๋กœ๋ถ€ํ„ฐ ์ž์‹ (`Self`)์œผ๋กœ ์ž๋ช…ํ•˜๊ฒŒ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค. - Associated type: Trait์— โ€˜์—ฐ๊ด€๋œโ€™ ํƒ€์ž…์„ ์ •์˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ํƒ€์ž…์ด ์ง€์ •ํ—ค์ฃผ๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค. `From<T>`์˜ โ€˜์‹คํŒจ ๊ฐ€๋Šฅํ•œโ€™ ๋ฒ„์ „์ธ `TryFrom<T>`๋ฅผ ๋ณด์ž. ``` pub trait TryFrom<T> { type Error; fn try_from(value: T) -> Result<Self, Self::Error>; } ``` ์–ด๋–ค ํƒ€์ž…์ด `TryFrom<T>`๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด, โ€˜์‹คํŒจ ๊ฐ€๋Šฅํ•œโ€™ `T`๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๋ณ€ํ™˜๋„ ์ •์˜ํ•˜๊ณ , ๋ณ€ํ™˜์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜ํ•  ๋ฆฌํ„ด ํƒ€์ž…๋„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. - Generic implementation: ํ•จ์ˆ˜์™€ trait๋งŒ ์ผ๋ฐ˜ํ™” ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, `impl` ๋ธ”๋ก๋„ ์ผ๋ฐ˜ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํƒ€์ž… ๋ชจ๋‘์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ Trait์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ``` impl<T, U> Into<U> for T where U: From<T>, { fn into(self) -> U { U::from(self) } } ``` `Into<U>` ๋Š” `From<T>` ์˜ โ€˜์—ญ์ˆœโ€™ trait์œผ๋กœ, `T -> U` ๋ฐฉํ–ฅ์„ ๋’ค์ง‘์–ด์„œ `U -> T` ๋ฐฉํ–ฅ์œผ๋กœ (`something.into()`์™€ ๊ฐ™์ด) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด ์ฃผ๋Š” trait์ด๋‹ค(`From`์ด ์กด์žฌํ•˜๋Š”๋ฐ `Into`๊ฐ€ ์™œ ํ•„์š”ํ•˜๋ƒ๊ณ  ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งค์šฐ ์‚ฌ์†Œํ•œ(?) ์ด์œ ์ด๋ฏ€๋กœ ์ผ๋‹จ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ๊ณ  ๊ฐ€์ž). ์ด `Into<U>`๋ฅผ `U: From<T>`๋ฅผ ๋งŒ์กฑํ•˜๋Š” U์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ๊ฐ์˜ ํƒ€์ž…์— ๋Œ€๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์ผ๋ฐ˜ํ™”๋œ `impl`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํƒ€์ž…์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. - Generic associated type: associated type๋„ ์ผ๋ฐ˜ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด associated type๋„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์กฐ๊ธˆ ๋ณต์žกํ•œ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด๋ณด๋ฉด: ``` trait PointerFamily { type Pointer<T>: Deref<Target = T>; fn new<T>(value: T) -> Self::Pointer<T>; } struct ArcFamily; impl PointerFamily for ArcFamily { type Pointer<T> = Arc<T>; fn new<T>(value: T) -> Self::Pointer<T> { Arc::new(value) } } struct RcFamily; impl PointerFamily for RcFamily { type Pointer<T> = Rc<T>; fn new<T>(value: T) -> Self::Pointer<T> { Rc::new(value) } } struct Foo<P: PointerFamily> { bar: P::Pointer<String>, } ``` [3](https://blog.cro.sh/posts/four-years-of-rust/#fn:3) ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ (์Šค๋งˆํŠธ) ํฌ์ธํ„ฐ๋ฅผ PointerFamily๋ผ๋Š” ํ•˜๋‚˜์˜ trait์œผ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ํฌ์ธํ„ฐ๋Š” `Rc<T>`, `Arc<T>`์™€ ๊ฐ™์ด ๊ทธ ์ž์ฒด๋กœ ์ผ๋ฐ˜ํ™”๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ํ•œ ์ฐจ์› ์œ„์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ๋ฐ, ์ด๋ฅผ GAT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ Rust์˜ ๊ฐ•๋ ฅํ•œ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์•„๋ž˜์˜ ADT์™€ ์กฐํ•ฉํ•˜๋ฉด, ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฌธ์ œ์ƒํ™ฉ์„ ํƒ€์ž…์œผ๋กœ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ### ADT: `enum`๊ณผ ํŒจํ„ด ๋งค์นญ[\#](https://blog.cro.sh/posts/four-years-of-rust/#adt-enum%EA%B3%BC-%ED%8C%A8%ED%84%B4-%EB%A7%A4%EC%B9%AD) Algebraic Data Type์˜ ์ค„์ž„๋ง๋กœ, ํƒ€์ž…์„ ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ์ง‘ํ•ฉ ๊ฐ„์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋Š” ํƒ€์ž…์„ ๋งํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ โ€˜ํ•ฉ์—ฐ์‚ฐโ€™๊ณผ โ€˜๊ณฑ์—ฐ์‚ฐโ€™์„ ๋”ฐ์ง€๋Š”๋ฐ, ๊ฐ๊ฐ Rust์˜ `enum`๊ณผ `struct`์— ๋Œ€์‘๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, `enum`์€ โ€˜orโ€™, `struct`๋Š” โ€˜andโ€™๋ฅผ ๋œปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์„ ํƒ€์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ์— ๋งค์šฐ ์ ํ•ฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 3์ธต์งœ๋ฆฌ ์ฐฌ์žฅ์— ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ์ƒ‰๊น”์˜ ์ปต์ด ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ์ฐฌ์žฅ์˜ ๊ฐ โ€˜์ธตโ€™์€ ๋™์‹œ์— ์กด์žฌํ•˜๋ฏ€๋กœ, โ€˜andโ€™ ์—ฐ์‚ฐ์ธ `struct`๋ฅผ ์ด์šฉํ•˜๋„๋ก ํ•œ๋‹ค. ``` struct Cupboard { first: Vec<Cup>, second: Vec<Cup>, third: Vec<Cup>, } ``` ์ปต์˜ ๊ฒฝ์šฐ์—๋Š” ์„ธ ๊ฐ€์ง€ ์ƒ‰๊น”์ด ์žˆ๊ณ  ๋™์‹œ์— ๋‘ ๊ฐ€์ง€ ์ƒ‰์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ โ€˜orโ€™ ์—ฐ์‚ฐ์ธ โ€™enumโ€™์„ ์ด์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ``` enum Cup { Red, Blue, Green, } ``` ๋” ๋‚˜์•„๊ฐ€์„œ, Rust์˜ enum์—๋Š” ๊ฐ variant๋งˆ๋‹ค ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ฐฌ์žฅ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ ‘์‹œ๋„ ์žˆ๋‹ค๋ฉด? ``` enum Object { Cup(Cup), Dish(Dish), } ``` ์ด๋ฒˆ์—๋Š”, ์ ‘์‹œ๋ฅผ ์Œ“์•„์„œ ๋ณด๊ด€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋ฉด? ``` enum Object { Cup(Cup), Dish(Dish), StackedDish(Vec<Dish>), } ``` ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ enum์ด๋‚˜ struct์—์„œ ๊ฐ’์„ ๋ฝ‘์•„์˜ค๋ ค๋ฉด, ํŒจํ„ด ๋งค์นญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(struct์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋™์ผํ•˜๊ฒŒ `.`์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค). ``` match object { Cup(cup) => { /* ... */ } Dish(dish) => { /* ... */ } StackedDish(stacked_dish) => { /* ... */ } } ``` ๊ฐ๊ฐ์˜ match ๊ณ๊ฐ€์ง€๋“ค์—์„œ ๊ฐ variant๊ฐ€ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํŒจํ„ด ๋งค์นญ์€ ๋‹จ์ˆœํžˆ โ€˜ํ•œ ๊ฒนโ€™ ๋ฒ—๊ธฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด ์ค‘์ฒฉ๋œ ํŒจํ„ด์—๋„ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋‹ค. ``` match (object1, object2) { // ๋‘ ๊ฐ’์— ๋Œ€ํ•ด ๋™์‹œ์— ๋งค์นญํ•˜๋ฉด์„œ, ์•ˆ์ชฝ์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋„ ํ•œ๋ฒˆ ๋” ๋งค์นญ (Cup(Cup::Red), Cup(Cup::Blue)) => { /* ... */ } // ๋‘ ๊ฐ’์— ๋Œ€ํ•ด ๋™์‹œ์— ๋งค์นญํ•˜๋ฉด์„œ, ์•ˆ์ชฝ์˜ ๊ฐ’์„ ์จ์„œ ์ถ”๊ฐ€์ ์ธ ์กฐ๊ฑด ์ œ์‹œ (Cup(a), Cup(b)) if a == b => { /* ... */ } // Cup: Eq ๋ผ ๊ฐ€์ •ํ•˜์ž. // _ ๋Š” ํ•ญ์ƒ ๋งค์นญ์— ์„ฑ๊ณตํ•˜๋Š” ๊ฐ’์ด๋‹ค. (Dish(dish), _) => { /* ... */ } (StackedDish(stacked_dish), _) => { /* ... */ } // ์œ„์˜ ํŒจํ„ด๋“ค ์ค‘ ์•„๋ฌด๊ฒƒ๋„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด... _ => { /* ... */ } } ``` ์กฐ๊ธˆ ๋” ํ˜„์‹ค์ ์ธ enum์˜ ์˜ˆ์‹œ๋กœ๋Š”, ์—๋Ÿฌ ํ•ธ๋“ค๋ง์˜ ์ค‘์ถ”๊ฐ€ ๋˜๋Š” `Result<T, E>` ํƒ€์ž…์ด ์žˆ๋‹ค. ``` enum Result<T, E> { Ok(T), Err(E) } ``` (์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ enum์ด๋‚˜ struct๋„ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.) ## ๋†’์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%86%92%EC%9D%80-%EB%9F%B0%ED%83%80%EC%9E%84-%EC%84%B1%EB%8A%A5) Rust์˜ zero-cost abstraction ๋•๋ถ„์—, Rust ํ”„๋กœ๊ทธ๋žจ์€ ์–ผ๋งˆ๋“ ์ง€ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์‚ฌ์šฉํ•˜๋Š” โ€˜๊ฐ€๋ฒผ์šดโ€™ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค(์ฃผ์˜: ์•ฝ๊ฐ„์˜ ์˜ˆ์™ธ ์žˆ์Œ). ์ด๋Š” ๋†’์€ ๋ฒ”์šฉ์„ฑ๊ณผ๋„ ๋งž๋ฌผ๋ฆฌ๋Š”๋ฐ, ์ข€ ๋” ์•„๋ž˜์—์„œ ์„œ์ˆ ํ•˜๊ฒ ๋‹ค. ### Zero-cost Asynchronous Programming[\#](https://blog.cro.sh/posts/four-years-of-rust/#zero-cost-asynchronous-programming) Rust์—์„œ ์ œ์ผ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ผฝ์œผ๋ผ๋ฉด, ๋‚˜๋Š” ๋ง์„ค์ž„ ์—†์ด `async`/`await`์„ ์„ ํƒํ•  ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ๋Š” ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ(์ฒด๊ณ„ ์ž์ฒด๊ฐ€ ์กฐ๊ธˆ ๋” ๋ช…์‹œ์ ์ด๋‹ค), ์†์œผ๋กœ state machine์„ ์งœ์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๋Œ€๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋ฉฐ[4](https://blog.cro.sh/posts/four-years-of-rust/#fn:4) GC๊ฐ€ ํ•„์š”์—†๋Š” ์–ธ์–ด ์ค‘์—์„œ๋Š” Rust๊ฐ€ ๋…๋ณด์ ์œผ๋กœ ํŽธ์˜์„ฑ๊ณผ ์•ˆ์ „์„ฑ ๋ฉด์—์„œ ์šฐ์œ„๋ฅผ ์ ํ•˜๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ์ด๋Š” ๋Œ€๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์—…์—์„œ ์ €์ง€์—ฐ, ๊ณ ๋ถ€ํ•˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•  ๋•Œ ํฌ๊ฒŒ ์ž‘์šฉํ•˜๋Š”๋ฐ, Discord๋Š” [GC๋กœ ์ธํ•œ ์ง€์—ฐ์‹œ๊ฐ„ ํŽธ์ฐจ๋กœ ์ธํ•ด Rust๋กœ ํŠน์ • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์žฌ์ž‘์„ฑํ•˜์—ฌ ํฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์—ˆ๊ณ ](https://discord.com/blog/why-discord-is-switching-from-go-to-rust), CloudFlare๋Š” [๋‚ด/์™ธ๋ถ€๋ง์„ ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋ก์‹œ๋ฅผ NGINX์—์„œ ์ž์ฒด Rust ๊ตฌํ˜„์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ CPU ์ž์›์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค](https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet). ๋ค์œผ๋กœ ์–ป๋Š” memory safety ๋•์— CloudFlare๋Š” **์ˆ˜๋ฐฑ์กฐ ๋‹จ์œ„์˜** ์š”์ฒญ์„ ์ฒ˜๋ฆฌํžˆ๋ฉด์„œ ๋‹จ ํ•œ๋ฒˆ์˜ ํ”„๋ก์‹œ ๋ฒ„๊ทธ๋กœ ์ธํ•œ ํฌ๋ž˜์‹œ๋„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•œ๋‹ค. ์˜คํžˆ๋ ค ํ•˜๋“œ์›จ์–ด ๋ฌธ์ œ์™€ ์•Œ๋ ค์ง€์ง€ ์•Š์€ [๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๋ฒ„๊ทธ](https://lkml.org/lkml/2022/3/15/6)๋ฅผ ์ฐพ๊ธฐ๊นŒ์ง€ ํ–ˆ๋‹ค๊ณ โ€ฆ ## ๊ฐœ๋ฐœ ๋„๊ตฌ์˜ ์„ฑ์ˆ™ํ•จ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EA%B0%9C%EB%B0%9C-%EB%8F%84%EA%B5%AC%EC%9D%98-%EC%84%B1%EC%88%99%ED%95%A8) ๊ฐœ์ธ์ ์œผ๋กœ Visual Studio๋ณด๋‹ค๋Š” ํ•œ ์ˆ˜ ์•„๋ž˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ โ€˜์‹ ์ƒโ€™ ์–ธ์–ด๋“ค๊ณผ ๋น„๊ตํ•˜๋ฉด ๋…๋ณด์ ์ธ 1์ˆœ์œ„๋ฅผ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ์ง€ ์•Š๋‚˜ ์ƒ๊ฐํ•œ๋‹ค. ๋นŒ๋“œ ์‹œ์Šคํ…œ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์—ญํ• ์„ ํ•ด ์ฃผ๋Š” `cargo`๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋ฒค์น˜๋งˆํ‚นํ•  ์ •๋„๋กœ[5](https://blog.cro.sh/posts/four-years-of-rust/#fn:5) Rust์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋กœ ๊ผฝํžˆ๊ณ , Rust ํˆด์ฒด๋“ค์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ์„ค์น˜๋ฅผ ๋„์™€์ฃผ๋Š” `rustup`๋„ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค. LSP ๊ตฌํ˜„์ฒด์ธ `rust-analyzer` ๋•๋ถ„์— LSP ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‚ด์žฅ๋œ ๋งŽ์€ ์—๋””ํ„ฐ์—์„œ IDE์™€ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ## Memory Safety[\#](https://blog.cro.sh/posts/four-years-of-rust/#memory-safety) ์•ž์„œ ๋งํ•œ zero-cost abstraction์„ ํ†ตํ•ด ๊ถ๊ทน์ ์œผ๋กœ Rust๋Š” โ€˜memory safetyโ€™๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค. Rust์—์„œ unsafe ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ, ์ปดํŒŒ์ผ๋˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋Š” **๋ฉ”๋ชจ๋ฆฌ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Œ์ด ๋ณด์žฅ๋œ๋‹ค**. ์•„์ฃผ ๊ฐ€๋”์”ฉ safe ์ฝ”๋“œ๋งŒ์œผ๋กœ undefined behavior๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฉ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ(soundness hole), ๊ทธ๋Ÿฌํ•œ ๋™์ž‘๋“ค์€ ๋ช…๋ฐฑํžˆ ๋ฒ„๊ทธ๋กœ ๊ทœ์ •๋˜์–ด ์ตœ์šฐ์„ ์ ์œผ๋กœ ์ˆ˜์ •๋œ๋‹ค. ## ๋ฒ”์šฉ์„ฑ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%B2%94%EC%9A%A9%EC%84%B1) ์œ„์—์„œ ๊ณ„์† ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, Rust ์ฝ”๋“œ๋Š” ์ˆ˜๋งŽ์€ ํ”Œ๋žซํผ์—์„œ ๊ตฌ๋™๋˜๊ณ  ์žˆ๋‹ค. - ๋ฐ์Šคํฌํƒ‘ ๋ฐ ์Šค๋งˆํŠธํฐ OS์˜ ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Windows, Linux, MacOS, Android, iOS - ๊ณ ์„ฑ๋Šฅ ์›น ๋ฐฑ์—”๋“œ - Linux Kernel ๋“œ๋ผ์ด๋ฒ„ (\>= 6.1) - eBPF ๋ฐ WebAssembly - ๋ธ”๋ก์ฒด์ธ(๋ธ”๋ก์ฒด์ธ ๋…ธ๋“œ, ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ตฌํ˜„ ๋“ฑ์— ๋ชจ๋‘ ์“ฐ์ธ๋‹ค). - ์ž„๋ฒ ๋””๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(์ด ์ชฝ์€ ๋น„๊ต์  ์ƒํƒœ๊ณ„๊ฐ€ ์•ฝํ•˜๋‹ค) ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Rust๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ zero-cost abstraction์„ ์ง€ํ–ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํ”Œ๋žซํผ์— ์˜ฌ๋ ค๋†“์•„๋„ ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Javascript๋ฅผ eBPF ์œ„์— ์˜ฌ๋ฆฌ๋ ค ํ•˜๋ฉด, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด๋‚˜ ์•ฝํ•œ ๋™์  ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๋น„์šฉ์ด ํ•„์—ฐ์ ์œผ๋กœ ๋”ฐ๋ผ์˜ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. (AssemblyScript์™€ ๊ฐ™์ด ํŒŒํŽธํ™”๋œ ์ƒํƒœ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค). # Rust์˜ ๋‹จ์ [\#](https://blog.cro.sh/posts/four-years-of-rust/#rust%EC%9D%98-%EB%8B%A8%EC%A0%90) ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๋ณด๋ฉด Rust๋Š” โ€˜์™„์ „ํ•œโ€™ ์–ธ์–ด ๊ฐ™์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. Rust๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ๊ทธ๋Ÿฌํ•œ ๊ฒฐ์ ๋“ค์„ ํฌ๊ฒŒ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ## ๋†’์€ ์ง„์ž… ์žฅ๋ฒฝ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%86%92%EC%9D%80-%EC%A7%84%EC%9E%85-%EC%9E%A5%EB%B2%BD) Rust๋Š” ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค(์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋Š” ์ง€์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค)[6](https://blog.cro.sh/posts/four-years-of-rust/#fn:6). ์˜ˆ๋ฅผ ๋“ค์–ด, Rust์—์„œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ์˜ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค: - `String` (ํž™์— ํ• ๋‹น๋œ UTF-8 ๋ฌธ์ž์—ด) - `&str` (๋ฌธ์ž์—ด โ€˜์Šฌ๋ผ์ด์Šคโ€™. UTF-8๋กœ ํ‘œํ˜„๋œ ๋ฐ”์ดํŠธ์—ด์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ ˆํผ๋Ÿฐ์Šค) ``` &String์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— &str์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. ``` - `&[u8]` (๋ฐ”์ดํŠธ์—ด. ๊ทธ ์ž์ฒด๋กœ ๋ฌธ์ž์—ด์€ ์•„๋‹ˆ์ง€๋งŒ ํŒŒ์‹ฑ ์ „์— ๋งŒ๋‚  ํ™•๋ฅ ์ด ๋†’๋‹ค) - `Cow<str>` (โ€˜Copy-on-Writeโ€™ ๋ฌธ์ž์—ด. ๋ณต์‚ฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค) - `impl AsRef<str>` (๊ทธ ์ž์ฒด๋กœ ํƒ€์ž…์€ ์•„๋‹ˆ์ง€๋งŒ, `&str`๊ณผ `String`์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค) `OsString`, `CString`, `Path`์™€ ๊ฐ™์ด ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์„ ์ง€๋‹Œ ํƒ€์ž…๋“ค์„ ๊ฑฐ๋ก ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ๋ฒŒ์จ ๊ณต๋ถ€ํ•  ๊ฒƒ์ด ์‚ฐ๋”๋ฏธ๊ฐ€ ๋˜์—ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์€ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์„ ๋ฐฐ์ œํ•˜๊ณ  ์‰ฌ์šด ๊ธธ๋กœ (๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ณ )๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ, Rust์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„ ํ•™์Šต์ž๋ฅผ ์ขŒ์ ˆ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ—ˆ๋‹คํ•˜๋‹ค. ๋ฌผ๋ก  Rust๋„ โ€˜์‰ฌ์šด ๊ธธโ€™์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ „ ์ฝ”๋“œ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๋Š”์ง€์กฐ์ฐจ๋„ ์•Œ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ## ์„ค๊ณ„์˜ ์ œ์•ฝ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EC%84%A4%EA%B3%84%EC%9D%98-%EC%A0%9C%EC%95%BD) ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ADT๋ฅผ ์ฐฌ์–‘ํ–ˆ๋‹ค๊ฐ€ ์ œ์•ฝ์ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๋ชจ์ˆœ๋˜์ง€ ์•Š๋ƒ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Rust์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์ด โ€˜์•ˆ์ „ํ•˜๋ฉฐ ๋น„์šฉ ์—†์ดโ€™ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋„ ์žˆ๋‹ค. ์ž๊ธฐ์ฐธ์กฐ/์ˆœํ™˜์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ€ ๊ทธ๊ฒƒ์ธ๋ฐ, lifetime์˜ ์กด์žฌ๋กœ ์ธํ•ด ๋ชจ๋“  Rust์˜ ๊ฐ’๋“ค ๊ฐ„์˜ ์ฐธ์กฐ ๊ด€๊ณ„๋Š” DAG(๋ฐฉํ–ฅ ์žˆ๊ณ  ์ˆœํ™˜ ์—†๋Š” ๊ทธ๋ž˜ํ”„)๋กœ ํ‘œํ˜„๋  ์ˆ˜๋ฐ–์— ์—†๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„ lifetime์„ ์ •์˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ๋‹ค. ๋ฌผ๋ก  `Arc::new_cyclic` ๊ณผ ๊ฐ™์ด ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ๋„๊ตฌ๋“ค๋„ ์žˆ์œผ๋‚˜, weak pointer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ์‹์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํฌํ•จ)์„ ์ง€๋ถˆํ•˜๊ฑฐ๋‚˜, `Pin::new_unchecked`๋ฅผ ์จ์„œ unsafeํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. (ํ›„์ž๋Š” [`ouroboros`](https://docs.rs/ouroboros)๋ผ๋Š” crate๊ฐ€ ์ž๊ธฐ์ฐธ์กฐ๋ฅผ ํŽธํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ง์ ‘ ์จ๋ณด์ง€๋Š” ์•Š์•„์„œ ์–ธ๊ธ‰ํ•˜์ง€๋Š” ์•Š๊ฒ ๋‹ค.) ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ธ๋ฐ, ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ์ง„์ž…ํ•œ ์ดˆ์‹ฌ์ž ์ž…์žฅ์—์„œ๋Š” ์–ด๋ ค์šธ ์ˆ˜๋ฐ–์— ์—†๋‹ค. C/C++/Java ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ•œ์ค„ ํ•œ์ค„(line-by-line) ๋ฒˆ์—ญํ•ด ์ด์‹ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฌํ•œ ์–ธ์–ด๋“ค์—์„œ๋Š” ์ž๊ธฐ์ฐธ์กฐ๋‚˜ ์ˆœํ™˜์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ํŒจํ„ด์ด ์ข…์ข… ๋ณด์ด๊ณค ํ•œ๋‹ค. (๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ผ๋˜๊ฐ€, ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ผ๋˜๊ฐ€) ``` ์ž๊ธฐ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, Rust์˜ borrow checker์™€ ๊ถํ•ฉ์ด ๋งž์ง€ ์•Š๋Š” ํŒจํ„ด๋“ค์ด ์—ฌ๋Ÿฟ ์กด์žฌํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ callback์ด ์ฃผ๊ฐ€ ๋˜๋Š” ์˜ต์ €๋ฒ„ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ callback์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ํ• ๋‹น์ด๋‚˜ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…์ด ํ•„์š”ํ•ด์ง€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ``` ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ์ฃผ์˜ ๊นŠ๊ฒŒ unsafe ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ์‹์œผ๋กœ ๊ฒฉ๋ฆฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ(Rust์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.) Rust๊ฐ€ ์˜๋„ํ•˜๋Š” ์ด์ƒ์ด ํ•ญ์ƒ ํ˜„์‹ค์— 100% ์ ์šฉ๋  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ โ€˜๊ฒฉ๋ฆฌโ€™ ์ž‘์—…์— unsafe๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ โ€˜์˜ฌ๋ฐ”๋ฅด๊ฒŒโ€™ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„์ฃผ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค. Rust์˜ memory safety ๋“ฑ์ด ์ œ๊ณตํ•˜๋Š” ๋ณด์žฅ์˜ ํŠน์„ฑ์ƒ, ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ทœ์น™์ด ์—„๊ฒฉํ•˜๊ณ  ์ด๋ฅผ ์œ„๋ฐ˜ํ•  ์‹œ์— ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ณต๊ฒฉ์ ์ธ ์ตœ์ ํ™”๋กœ ์ธํ•œ ์˜ค์ž‘๋™์ด ๋” ํฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ## ๋น„๊ต์  ๋‚ฎ์€ ์ƒ์‚ฐ์„ฑ(๊ฐœ๋ฐœ ์†๋„)[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%B9%84%EA%B5%90%EC%A0%81-%EB%82%AE%EC%9D%80-%EC%83%9D%EC%82%B0%EC%84%B1%EA%B0%9C%EB%B0%9C-%EC%86%8D%EB%8F%84) ์ˆ™๋ จ๋œ Rust ํ”„๋กœ๊ทธ๋ž˜๋จธ๋„ lifetime, borrow checker, type checker์™€ ์”จ๋ฆ„ํ•˜๋Š” ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค. ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์„œ ๋‚ด๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •๋ฆฝ๋œ B2C ์„œ๋น„์Šค๋“ค์„ ์šด์˜ํ•˜๋Š” ๊ธฐ์—…์˜ ๊ฒฝ์šฐ์—๋Š” Rust๋ฅผ ๋„์ž…ํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋น„๊ต์  ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Œ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ``` ์‚ฌ๊ฒฌ์œผ๋กœ, ์ด๋Š” Go๊ฐ€ ์›น ๋ฐฑ์—”๋“œ ๋ถ„์•ผ์—์„œ ํฌ๊ฒŒ ์œ ํ–‰ํ•œ ์ด์œ ์™€ ๊ฑฐ์˜ ์ •๋ฐ˜๋Œ€๋˜๋Š”๋ฐ, Go๋Š” ๋ณต์žกํ•œ ๋ฌธ์ œ๋„ ๋น„์šฉ์„ ๋‚ด๊ณ  ์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉฐ, ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋ณ„๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์—†๊ณ (1.18์—์•ผ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ •์‹์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค), ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋„ ๋งŽ์ง€ ์•Š์•„ ์ง„์ž…์žฅ๋ฒฝ์ด ๋งค์šฐ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋†’์€ ์ƒ์‚ฐ์„ฑ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ``` ## ๋งคํฌ๋กœ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%A4%ED%81%AC%EB%A1%9C) ์ด ๊ธฐ๋Šฅ์€ Rust์—์„œ ๋ฌด์ œํ•œ์— ๊ฐ€๊นŒ์šด ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ฉ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ์„œ์ˆ ํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ, ๋งคํฌ๋กœ๋Š” ๋ฌธ๋ฒ• ํ† ํฐ ํŠธ๋ฆฌ๋ฅผ ๋ฐ›์•„์„œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ• ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ทœ์น™์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์„ค๋ช…์—์„œ๋„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๊ธฐ์กด์˜ Rust ์ง€์‹๊ณผ๋Š” ํŒ์ดํ•œ, Rust์˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ์— ๊ด€ํ•œ ์ง€์‹์„ ์Šต๋“ํ•ด์•ผ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋งคํฌ๋กœ๋Š” ์‚ฌ์‹ค์ƒ Rust ๋ฌธ๋ฒ•๋งŒ ์ฐจ์šฉํ•œ ๋˜๋‹ค๋ฅธ Rust ์•ˆ์˜ ๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ์„œ ๊ธฐ๋Šฅํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์˜ ๊ดด๋ฆฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. (์ด ๋‹จ์ ์€ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋งคํฌ๋กœ ์ •์˜ ๋ฐฉ์‹์ธ procedural macro์™€ declarative macro์— ๋ชจ๋‘ ํ•ด๋‹น๋œ๋‹ค.) ๋‘ ๋ฒˆ์งธ๋กœ, proc-macro๋Š” ๋งคํฌ๋กœ๋ฅผ ์ ์šฉํ•˜๋ ค๋Š” ์ฝ”๋“œ ์ด์ „์— ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ํŠนํžˆ ์ด๋Š” ์†Œ์Šค์ฝ”๋“œ๋งŒ์„ ์••์ถ•ํ•ด์„œ ์˜ฌ๋ฆฌ๋Š” Rust์˜ crate ์‹œ์Šคํ…œ๊ณผ ๋งž๋ฌผ๋ ค ๋ฌธ์ œ๋ฅผ ๊ฐ€์ค‘์‹œํ‚ค๋Š”๋ฐ, proc-macro๋ฅผ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๊ด€๋ จํ•˜์—ฌ [`watt`](https://github.com/dtolnay/watt)๋ผ๋Š” ์‹คํ—˜์ ์ธ WebAssembly ๊ธฐ๋ฐ˜ proc-macro ๋Ÿฐํƒ€์ž„์ด ์žˆ์ง€๋งŒ ๋ฉ”์ธ์ŠคํŠธ๋ฆผ์— ๋“ค์–ด์˜ค๊ธฐ๋Š” ์•„์ง ๊ณค๋ž€ํ•˜๋‹ค.) ์„ธ ๋ฒˆ์งธ๋กœ, IDE์™€ proc-macro ๊ฐ„์˜ ์กฐํ™”๊ฐ€ ์ข‹์€ ํŽธ์€ ์•„๋‹ˆ๋ผ proc-macro๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์˜คํžˆ๋ ค ๊ฐ์†Œํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. โ€˜์ „ํ†ต์ ์ธโ€™ ๋งคํฌ๋กœ ์ •์˜ ๋ฐฉ๋ฒ•์ธ โ€˜decl-macroโ€™, ๋‹ค๋ฅธ ๋ง๋กœ macros by example ๋ฐฉ์‹์€ ์ƒ์ˆ ํ•œ ๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋น„๊ต์  ์ž์œ ๋กญ์ง€๋งŒ, proc-macro๋ณด๋‹ค๋„ ๋” ์ด์งˆ์ ์ธ ๋ฌธ๋ฒ•๊ณผ ์ •์˜ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ (๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด, Rust ์ฝ”๋“œ์˜ ๋ฌธ๋ฒ• ๊ตฌ์กฐ์— ๋Œ€ํ•ด ํŒจํ„ด ๋งค์นญ์„ ์‹œ๋„ํ•œ๋‹ค), ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„์—๋„ ์ œ์•ฝ์ด ์žˆ์–ด์„œ ๊ธฐ๋Šฅ์˜ ๋ณต์žก๋„๊ฐ€ ํŠน์ • ์ง€์ ์„ ๋„˜์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. (๊ทธ ์˜ˆ์‹œ๋กœ, ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” [`pin-project`](https://github.com/taiki-e/pin-project)์™€ [`pin-project-lite`](https://github.com/taiki-e/pin-project)๋ฅผ ๋ณด๋ฉด ์ „์ž๋Š” proc-macro, ํ›„์ž๋Š” macros by example ๋ฐฉ์‹์ธ๋ฐ ํ›„์ž๋Š” ์ „์ž์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ›จ์”ฌ ๋” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค). ## ๋งˆ์ด๋„ˆ๋ฆฌํ‹ฐ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%88%EC%9D%B4%EB%84%88%EB%A6%AC%ED%8B%B0) Rust ๊ตฌ์ธ/๊ตฌ์ง ์‹œ์žฅ์€ Go์™€ ๋น„๊ตํ•ด์„œ๋„ ๋งค์šฐ ์ข๋‹ค. ํŠนํžˆ ํ•œ๊ตญ์€ ๊ฒฉ์ฐจ๊ฐ€ ํ›จ์”ฌ ์‹ฌํ•˜๋‹ค. # ๊ฒฐ๋ก : 10๋…„ ๋’ค์—๋„ Rust๋กœ ๋ฐฅ๋ฒŒ์ด๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ?[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EA%B2%B0%EB%A1%A0-10%EB%85%84-%EB%92%A4%EC%97%90%EB%8F%84-rust%EB%A1%9C-%EB%B0%A5%EB%B2%8C%EC%9D%B4%EA%B0%80-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C) ๋‹จ์ ์„ ์ค„์ค„์ด ๋‚˜์—ดํ–ˆ์ง€๋งŒ ๋‹ต์€ โ€˜yesโ€™๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ˜„์žฌ(๊ทธ๋ฆฌ๊ณ  ๊ทผ๋ฏธ๋ž˜)์˜ Rust ์‚ฌ์šฉ์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ## ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C) ํ˜„์žฌ๋กœ์„œ๋Š”, ๊ฐํžˆ ๋งํ•˜๊ฑด๋ฐ ๋‹ค์Œ์˜ ์ƒํ™ฉ์—์„œ Rust๋ฅผ ์ด๊ธธ ๋Œ€์•ˆ์€ ์—†๋‹ค. - ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜์—ฌ ๋†’์€ ์›Œํฌ๋กœ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  - I/O๊ฐ€ ๋งค์šฐ ์žฆ์œผ๋ฉฐ - ๋ถˆํŠน์ • ๋‹ค์ˆ˜์—๊ฒŒ ์„œ๋น„์Šค(B2C)ํ•˜์—ฌ ๊ฐ•๊ฑด์„ฑ์„ ํŠนํžˆ ์‹ ๊ฒฝ์จ์•ผ ํ•˜๋Š” (์ด๋“ค ์ค‘ ๋‘ ๊ฐœ๋งŒ ํ•ด๋‹น๋˜์–ด๋„ ์•„์ฃผ ๋งค๋ ฅ์ ์ธ ์„ ํƒ์ด ๋œ๋‹ค) ํ”ํžˆ ๋งํ•˜๋Š” โ€˜๋น…ํ…Œํฌโ€™ ๋ฐฑ์—”๋“œ ๋ถ„์•ผ์—์„œ๋Š” Rust์˜ zero-cost abstraction, `async`/`await`, memory safety๋Š” ๋…๋ณด์ ์ธ ๋งค๋ ฅ์„ ๊ฐ€์ง„๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์€ ์ด๋Ÿฌํ•œ ๋งค๋ ฅ์ด ๋น„๊ต์  ์ž‘์€ ์กฐ์ง์—์„œ๋Š” ์–ดํ•„๋˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์ด๋‹ค. ## ํฌ๋กœ์Šคํ”Œ๋žซํผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ชจ๋“ˆ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%ED%81%AC%EB%A1%9C%EC%8A%A4%ED%94%8C%EB%9E%AB%ED%8F%BC-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81-%EB%AA%A8%EB%93%88) Rust์˜ ํ‘œํ˜„๋ ฅ๊ณผ ๋ฒ”์šฉ์„ฑ์€ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•  ๋•Œ ํฐ ์ด์ ์ด ๋œ๋‹ค. rustc์˜ [ํƒ€๊นƒ ๋ชฉ๋ก](https://doc.rust-lang.org/nightly/rustc/platform-support.html)์„ ๋ณด๋ฉด, ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” PC/๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ๋“ค์€ ๋ชจ๋‘ Tier 1/2์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ Rust ์ฝ”๋“œ๋ฅผ ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋นŒ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๋˜ํ•œ [`rust-bindgen`](https://github.com/rust-lang/rust-bindgen), [`cbindgen`](https://github.com/eqrion/cbindgen) ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด C FFI๋ฅผ ํ†ตํ•ด ํ”Œ๋žซํผ ๊ณ ์œ  ์ฝ”๋“œ์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐ์—๋„ ์–ด๋ ค์›€์ด ์—†๋‹ค. ์ด ๋ถ€๋ถ„์€ [์ธํ”„์ฝ˜ 2022์—์„œ ํฌ๋กœ์Šคํ”Œ๋žซํผ Rust๋ฅผ ๋ฐœํ‘œํ•œ ์ž๋ฃŒ](https://www.slideshare.net/utilforever/2022-rust)๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ## FFI๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ณ ์„ฑ๋Šฅ ์—ฐ์‚ฐ ๋ชจ๋“ˆ[\#](https://blog.cro.sh/posts/four-years-of-rust/#ffi%EB%A1%9C-%ED%98%B8%EC%B6%9C-%EA%B0%80%EB%8A%A5%ED%95%9C-%EA%B3%A0%EC%84%B1%EB%8A%A5-%EC%97%B0%EC%82%B0-%EB%AA%A8%EB%93%88) ์ตœ๊ทผ์— ์•Œ๊ฒŒ ๋˜์–ด ์•„์ง ๊ฒ€ํ† ๊ฐ€ ๋ถ€์กฑํ•˜์ง€๋งŒ ๋ถˆํ™•์‹คํ•จ์„ ๋ฌด๋ฆ…์“ฐ๊ณ  ์—ฌ๊ธฐ์— ์ฃผ์žฅ์„ ๋‚จ๊ฒจ ๋ณด๋ฉด, Rust์˜ ๋น„๊ต์  ๊ฒฝ์ง๋œ ์„ค๊ณ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์  ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์™€์˜ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ํšจํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Python์— ์‰ฝ๊ฒŒ Rust ์ฝ”๋“œ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” [PyO3](https://pyo3.rs/)๋‚˜, Ruby ์ต์Šคํ…์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” [Magnus](https://github.com/matsadler/magnus) ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŒ…์„ ์œ„์ฃผ๋กœ ์ž‘์„ฑํ•˜๋˜ ๋ณ‘๋ชฉ ์ง€์ ์—์„œ Rust๋กœ ์ž‘์„ฑํ•œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ์„ ๊พ€ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” LuaJIT๊ณผ์˜ ์—ฐ๋™์— ๊ด€์‹ฌ์ด ์žˆ๋Š”๋ฐ, [mlua](https://github.com/khvzak/mlua)๋ผ๋Š” crate๊ฐ€ ์žˆ์–ด ์ฃผ์˜๊นŠ๊ฒŒ ์ง€์ผœ๋ณด๊ณ  ์žˆ๋‹ค. # ๋งˆ๋ฌด๋ฆฌ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%88%EB%AC%B4%EB%A6%AC) Rust๋ฅผ ์„ ๋„์ ์œผ๋กœ ๋„์ž…ํ•œ ์‚ฌ๋ก€๋“ค์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์†Œ์ˆ˜์˜ ๋น…ํ…Œํฌ ํšŒ์‚ฌ๋“ค์„ ์‹œ์ž‘์œผ๋กœ ํ•œ Rust์˜ ๋ฌผ๊ฒฐ์€ ์ด์ œ ๋ถ€์ •ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋˜์—ˆ๋‹ค. ์ƒ์ˆ ํ•˜์˜€๋“ฏ์ด Rust๊ฐ€ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋งŒ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์€ํƒ„ํ™˜์ด ๋  ์ˆ˜๋Š” ์—†๋Š” ๊ฑธ ์•Œ๋ฉด์„œ๋„, Rust๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” Rust๊ฐ€ ์ง€๊ธˆ๋ณด๋‹ค ํ›จ์”ฌ ํญ๋„“์€ ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ด ์žˆ๋‹ค. ์•ž์œผ๋กœ๋„ Rust๋ฅผ ์จ์„œ ์ข‹์•„ํ•˜๋Š” ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋ฉฐ ๋ถ€์กฑํ•œ ํšŒ๊ณ ๋ก์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ๋‹ค. *** 1. <https://stackoverflow.com/a/73518476> [โ†ฉ๏ธŽ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:1) 2. <https://stackoverflow.com/a/44456310> [โ†ฉ๏ธŽ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:2) 3. <https://rust-lang.github.io/rfcs/1598-generic_associated_types.html#associated-type-constructors-of-type-arguments> [โ†ฉ๏ธŽ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:3) 4. <http://aturon.github.io/tech/2016/08/11/futures> [โ†ฉ๏ธŽ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:4) 5. <https://github.com/python-poetry/poetry/tree/c5c7624ef64f34d9f50c3b7e8118f7f652fddbbd#why> [โ†ฉ๏ธŽ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:5) 6. <https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride#parting-words> [โ†ฉ๏ธŽ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:6) ยฉ 2019-2023 Nam Junghyun Powered by [Hugo](https://gohugo.io/) & [PaperMod](https://github.com/adityatelange/hugo-PaperMod/)
Readable Markdownnull
Shard141 (laksa)
Root Hash15231987969443479941
Unparsed URLsh,cro!blog,/posts/four-years-of-rust/ s443