[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
์๋ฅผ ๋ค๋ฉด, ์ด๋ ๊ฒ ๋ง์ด๋ค.

๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ Object safetyํ์ง ์์ trait์ ์์๋ฐ๋ trait๋ค๋ ์ ๋ถ object safetyํ์ง ์๋ค.
์ฐธ์กฐ
https://rust-lang.github.io/rfcs/0255-object-safety.html