소유권은 언어 전체가 그 위에 세워진 단 하나의 아이디어야. 근데 왜 존재하는지 알려면 네 데이터가 어디 사는지 부터 또렷이 그려야 해: 스택이냐 힙이냐.
스택
스택은 빠르고 빡빡해. 값이 순서대로 올라가고 내려와 (나중에 들어간 게 먼저 나옴), 모든 값은 알려진 고정 크기 를 가져야 해. i32, bool, char — 고정 크기, 스택에 살고, 만들고 부수는 게 거의 공짜야.
힙
힙은 유연하지만 느려. 자라날 수 있는 크기가 필요할 때 — append 할 String, 자라는 벡터 — 프로그램이 allocator 한테 힙 공간을 달라고 하고 포인터를 돌려받아. 그 포인터(고정 크기) 는 스택에 앉고; 실제 바이트는 힙에 살아. 힙 메모리를 할당하고 해제하는 건 진짜 비용이 들고, 해제를 까먹으면 누수, 두 번 해제하면 크래시야.
힙은 누가 해제해?
이게 언어마다 다르게 답하는 질문이야. C 는 네가 free() 를 부르게 하고 실수는 크래시로 벌해. Java 와 Python 은 가비지 컬렉터 를 돌려서 나중에 스캔하고 해제하면서 런타임에 비용을 내. Rust 의 답은 소유권 이야: 각 힙 값은 소유 변수가 정확히 하나고, 그 owner 가 스코프를 벗어나면 메모리가 해제돼 — 자동으로, 결정론적으로, 런타임 컬렉터 0 으로.
왜 사방에서 느끼게 되냐면
i32, bool 같은 스택 값은 복사가 싸서 Rust 는 얘들을 자유롭게 복사해. String 같은 힙 값은 암묵적으로 복사하면 비싸고 위험해서, Rust 는 대신 move 해 — 그게 바로 다음 레슨에서 만날 동작이야.