[Rust] trait: object safety

Trait์€ ์ •์  ๋””์ŠคํŒจ์น˜๋ฅผ ํ†ตํ•œ ์ปดํŒŒ์ผํƒ€์ž„ Generic ๊ธฐ๋Šฅ ๋˜ํ•œ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋ณธ์งˆ์ ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•˜์œ„ ๊ตฌํ˜„ ํƒ€์ž…์— ๋Œ€ํ•œ ๊ณตํ†ต์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค(interface)๋‹ค.
๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ํž™ ๋ฐ์ดํ„ฐ์— ๋‹คํ˜•์„ฑ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ์šฉ๋„๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ trait์˜ ๋ฉ”์„œ๋“œ๋“ค์€ ๊ณตํ†ต์ ์œผ๋กœ vtable์— ์ ์žฌ๋˜์–ด ๋Ÿฐํƒ€์ž„์— ๋ช…ํ™•ํ•˜๊ฒŒ ์‹๋ณ„์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์—ฌ์•ผ ํ•˜๊ณ , ๊ทธ๋Ÿฐ ํ˜•ํƒœ๋ฅผ object safety๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
object safety๋ฅผ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์•„๋„ ํŠธ๋ ˆ์ž‡์„ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๋™์ ํ• ๋‹น์— ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ํŠธ๋ ˆ์ž‡์€ object safety๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ค€์ˆ˜ํ•˜๋Š” ํŠธ๋ ˆ์ž‡ ์ •์˜ ๋ฐ ๊ตฌํ˜„์ด๋‹ค.

์ž˜ ์‹คํ–‰๋œ๋‹ค.

๊ทธ๋Ÿผ object safety๊ฐ€ ๋ฌด๋„ˆ์ง€๋Š” ์กฐ๊ฑด์ด ๋ญ˜๊นŒ?
๊ฝค ๋งŽ๋‹ค.
ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.




Self ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

๊ทธ๋Ÿฐ ํ•˜์œ„ ๊ตฌํ˜„ํƒ€์ž…์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์—์„œ๋Š” Self ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์Šค์Šค๋กœ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.

์ƒ๊ฐํ•ด๋ณด์ž. C++์„ ์‚ฌ์šฉํ•ด๋ดค๋‹ค๋ฉด, ์ด์ƒํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ผ๋‹จ ์ด๊ฑด ์ •์  ๋””์ŠคํŒจ์น˜๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

๋ฌธ์ œ๋Š” ์—†๋‹ค. ์–ด์ฐจํ”ผ ์ œ๋„ˆ๋ฆญ์œผ๋กœ ๋™์ž‘ํ•˜๋‹ˆ๊นŒ.

ํ•˜์ง€๋งŒ Box ๋“ฑ์„ ํ†ตํ•ด ๋™์  ๋””์ŠคํŒจ์น˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

trait์ด object safetyํ•˜์ง€ ์•Š์•„์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹ค์‹œ ๋ณด์ž.

์—ฌ๊ธฐ์„œ Self๋Š” ํ•˜์œ„ ๊ตฌํ˜„ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด Foo ๊ตฌ์กฐ์ฒด๋Š” &Foo๋ฅผ, Bar ๊ตฌ์กฐ์ฒด๋Š” &Bar๋ฅผ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง€๊ฒŒ ๋ ํ…๋ฐ, ํ•ญ์ƒ ๋™์ผํ•œ ํƒ€์ž…์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š” trait ๋ฉ”์„œ๋“œ๊ฐ€ ํƒ€์ž…๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฒŒ ๋ง์ด ๋˜๊ฒ ๋Š”๊ฐ€?

๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” vtable์— ์ ์žฌ๋  ์ˆ˜ ์—†๊ณ , ๊ทธ ๋•Œ๋ฌธ์— ๋™์  ๊ฐ์ฒด์— ํ• ๋‹น๋  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฑด ๋ฆฌํ„ดํƒ€์ž…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์— ์“ธ ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ ๋ถ€๋ถ„์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋ณ„๋„ ํŠธ๋ ˆ์ž‡์œผ๋กœ ๋ถ„๋ฆฌํ•ด๋‚ด๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœ ๊ตฌ์กฐ์ฒด ๊ตฌํ˜„๋ถ€์— ๊ฐ๊ฐ ๋‘๋Š”๊ฒŒ ๋งž๋‹ค.
์• ์ดˆ์— ์ž˜๋ชป๋œ ์„ค๊ณ„๋ผ๊ณ  ๋ด์•ผํ•œ๋‹ค.




์ œ๋„ˆ๋ฆญ

object safety๋ฅผ ํŒŒ๊ดดํ•˜๋Š” ๋˜ ํ•˜๋‚˜์˜ ์˜ˆ๋Š” ์ œ๋„ˆ๋ฆญ์ด๋‹ค.
trait ๋‚ด์— ์ž„์˜์˜ ์ œ๋„ˆ๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด,

์ด๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง„๋‹ค.
์• ์ดˆ์— ๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ๋ถˆ์™„์ „ํ•˜๊ฒŒ ์ •์˜๋œ ์ƒํƒœ์ธ๋ฐ, ์–ด๋–ป๊ฒŒ ์ €๊ฑธ๋กœ ๋™์  ๋งค์นญ์„ ํ•˜๊ฒ ๋Š”๊ฐ€?




Associated Constants

ํŠธ๋ ˆ์ž‡ ๋‚ด์— ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ๊ฒฝ์šฐ์—๋„ object safety๊ฐ€ ๋ฌด๋„ˆ์ง„๋‹ค.
์ปดํŒŒ์ผํƒ€์ž„์— ๊ฐ•์ œ๋กœ ์ธ๋ผ์ด๋‹์„ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
https://blog.naver.com/sssang97/223141563733




&self๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ

&self๊ฐ€ ์—†๋Š” ์ •์ ๋ฉ”์„œ๋“œ๋„ Object Safeyํ•˜์ง€ ์•Š์€ ํ˜•ํƒœ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ํ˜•ํƒœ ๋ง์ด๋‹ค.

object safey๋ฅผ ์ค€์ˆ˜ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ &self๋‚˜, Box, Rc, Arc, Pin ๋“ฑ์„ ํ†ตํ•ด์„œ๋ผ๋„ ๊ฐ์ฒด ์ž๊ธฐ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”์„œ๋“œ์—ฌ์•ผ๋งŒ ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ด๋ ‡๊ฒŒ ๋ง์ด๋‹ค.



๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ Object safetyํ•˜์ง€ ์•Š์€ trait์„ ์ƒ์†๋ฐ›๋Š” trait๋“ค๋„ ์ „๋ถ€ object safetyํ•˜์ง€ ์•Š๋‹ค.



์ฐธ์กฐ
https://rust-lang.github.io/rfcs/0255-object-safety.html