C.W.K.
Stream
Lesson 01 of 05 · published

스택, 힙, 그리고 소유권이 존재하는 이유

~12 min · ownership, stack, heap, memory

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

소유권은 언어 전체가 그 위에 세워진 단 하나의 아이디어야. 근데 존재하는지 알려면 네 데이터가 어디 사는지 부터 또렷이 그려야 해: 스택이냐 힙이냐.

스택

스택은 빠르고 빡빡해. 값이 순서대로 올라가고 내려와 (나중에 들어간 게 먼저 나옴), 모든 값은 알려진 고정 크기 를 가져야 해. i32, bool, char — 고정 크기, 스택에 살고, 만들고 부수는 게 거의 공짜야.

힙은 유연하지만 느려. 자라날 수 있는 크기가 필요할 때 — append 할 String, 자라는 벡터 — 프로그램이 allocator 한테 힙 공간을 달라고 하고 포인터를 돌려받아. 그 포인터(고정 크기) 는 스택에 앉고; 실제 바이트는 힙에 살아. 힙 메모리를 할당하고 해제하는 건 진짜 비용이 들고, 해제를 까먹으면 누수, 두 번 해제하면 크래시야.

힙은 누가 해제해?

이게 언어마다 다르게 답하는 질문이야. C 는 네가 free() 를 부르게 하고 실수는 크래시로 벌해. Java 와 Python 은 가비지 컬렉터 를 돌려서 나중에 스캔하고 해제하면서 런타임에 비용을 내. Rust 의 답은 소유권 이야: 각 힙 값은 소유 변수가 정확히 하나고, 그 owner 가 스코프를 벗어나면 메모리가 해제돼 — 자동으로, 결정론적으로, 런타임 컬렉터 0 으로.

소유권은 '힙은 누가 해제해?' 에 대한 Rust 의 답이야. 네가 아니라 (C), 런타임 컬렉터도 아니라 (Java) — owner 가, 컴파일 타임에 아는 그 순간에. 그 규칙 하나가 이 퀘스트의 나머지 전부의 뿌리야.

왜 사방에서 느끼게 되냐면

i32, bool 같은 스택 값은 복사가 싸서 Rust 는 얘들을 자유롭게 복사해. String 같은 힙 값은 암묵적으로 복사하면 비싸고 위험해서, Rust 는 대신 move 해 — 그게 바로 다음 레슨에서 만날 동작이야.

Code

스택 값 vs 힙을 소유하는 String·rust
fn main() {
    // 스택: 고정 크기, 쌈. 값 전체가 인라인으로 살아.
    let age: i32 = 42;
    let ready: bool = true;

    // 힙: String 은 자라는 버퍼를 소유해. 스택의 구조체는
    // 포인터 + 길이 + 용량을 들고; 바이트는 힙에 살아.
    let mut name = String::from("Ferris");
    name.push_str(" the crab"); // 힙에서 재할당될 수 있음

    println!("{age} {ready} {name}");
} // `name` 이 여기서 스코프를 벗어남 -> 힙 버퍼가 한 번 해제됨

External links

Exercise

네가 짠 프로그램에서 값 다섯 개를 골라 각각 '스택' 또는 '힙' 으로 라벨 붙여봐: 정수 카운터, 런타임에 사용자가 입력한 이름, 고정 boolean 플래그, 자라는 리스트, 글자 하나. 자라는 데이터는 왜 힙에 살아야 해?
Hint
컴파일 타임에 크기를 모르거나 런타임에 자랄 수 있는 건 힙이 필요해. 고정 크기 스칼라는 스택에 남고.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.