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

Drop 과 RAII

~12 min · ownership, drop, raii, scope

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

'owner 가 스코프를 벗어나면 해제된다' 는 말을 이제 몇 번 봤지. 이 레슨이 그 메커니즘을 명시해 — RAII 라고 부르고, 언어에서 가장 조용하면서 가장 강력한 아이디어 중 하나야.

스코프가 끝나면 값이 drop 돼

변수가 스코프를 벗어나면 Rust 가 자동으로 drop 을 호출해서 그게 소유한 걸 풀어줘. String 이면 힙 버퍼를 해제하고. 너는 free() 를 절대 안 써; 닫는 중괄호가 free 야. 결정론적으로, 컴파일 타임에 아는 지점에서 일어나 — 가비지 컬렉터처럼 '언젠가' 가 아니라.

RAII — 자원을 스코프에 묶기

이건 메모리를 한참 넘어 일반화돼. 파일 핸들, 네트워크 소켓, mutex 락 — 전부 정리를 drop 에 묶을 수 있어. 파일을 열면, 소유 변수가 스코프를 떠날 때 파일이 닫혀. 락을 잡으면, guard 가 drop 될 때 락이 풀려. 자원의 수명이 변수의 스코프야. 그게 RAII: Resource Acquisition Is Initialization.

닫는 중괄호가 곧 정리야. 메모리, 파일, 락, 소켓 — 타입이 자원을 소유하면, 그 Drop 구현이 owner 의 스코프가 끝나는 정확히 그 순간 풀어줘. 누수 없음, '그거 닫았던가?' 없음, GC 멈춤 없음.

커스텀 Drop

네 타입에 Drop 을 구현해서 스코프 끝에 코드를 돌릴 수 있어 — 버퍼 flush, 종료 로그, 핸들 해제. drop 을 손으로 부를 일은 거의 없어 (컴파일러가 해); 정리가 뭘 의미하는지만 정의하면 자동으로 돌아.

왜 이게 이후 전부에 중요하냐

소유권은 누가 해제하는지를 정했어. Drop 은 언제 를 정해: 정확히 owner 의 스코프 끝에서. 이 둘을 같이 쥐면 Rust 의 척추를 이해한 거야 — 이후 모든 주제 (borrowing, lifetimes, smart pointers) 가 '이거 누가 소유하고, 언제 drop 돼?' 의 정교화야.

Code

Drop 은 스코프 끝에 돈다·rust
struct Guard { label: String }

impl Drop for Guard {
    fn drop(&mut self) {
        // Guard 가 스코프를 떠나면 자동으로 돈다
        println!("releasing {}", self.label);
    }
}

fn main() {
    let _outer = Guard { label: String::from("outer") };
    {
        let _inner = Guard { label: String::from("inner") };
        println!("inner scope");
    } // _inner 가 여기서 drop -> "releasing inner" 출력
    println!("outer scope");
} // _outer 가 여기서 drop -> "releasing outer" 출력 (역순)

External links

Exercise

메시지를 출력하는 struct 에 Drop 을 구현해. 중첩 스코프에서 두 개를 만들고, 실행하기 전에 메시지가 출력되는 순서를 예측해봐. 역순 맞았어?
Hint
마지막에 만든 게 먼저 drop. 안쪽 스코프 값은 그 닫는 중괄호에서 drop 되고, 바깥 건 main 끝에서 drop 돼.

Progress

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

댓글 0

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

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