Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Drop 트레이트 (정리 트레이트)

우리는 앞서 소멸자(Destructor)에 대해 배우면서, 변수가 수명을 다해 사라질 때 drop 함수가 두 가지 일을 한다고 배웠습니다.

  1. 타입이 차지하고 있던 스택 메모리(즉, std::mem::size_of 바이트)를 회수합니다.
  2. 해당 값이 관리하던 추가 리소스(예: String의 힙 버퍼)를 정리합니다.

이 중 두 번째 단계인 ’추가 리소스 정리’를 담당하는 것이 바로 Drop 트레이트입니다.

pub trait Drop {
    fn drop(&mut self);
}

Drop 트레이트는 컴파일러가 기본적으로 처리하는 메모리 회수 작업 외에, 우리가 직접 추가적인 정리 로직을 정의할 수 있게 해주는 도구입니다. drop 메서드 안에 작성한 코드는 해당 값이 범위를 벗어나 소멸되는 순간 자동으로 실행됩니다.

DropCopy는 함께할 수 없습니다

앞서 Copy 트레이트를 공부할 때, 스택 메모리 이상의 추가 리소스를 관리하는 타입은 Copy를 구현할 수 없다고 배웠습니다.

그런데 컴파일러는 특정 타입이 추가 리소스를 관리하는지 아닌지 어떻게 알 수 있을까요? 바로 Drop 트레이트의 구현 여부를 보고 판단합니다. 만약 어떤 타입에 명시적인 Drop 구현이 있다면, 컴파일러는 “아, 이 타입은 정리가 필요한 무거운 리소스를 들고 있구나“라고 생각합니다. 그래서 이런 타입에는 Copy를 구현하는 것을 허용하지 않습니다.

// 필드가 없는 빈 구조체(단위 구조체)입니다.
#[derive(Clone, Copy)]
struct MyType;

impl Drop for MyType {
    fn drop(&mut self) {
       // 아무 내용이 없는 빈 구현이라도 상관없습니다.
    }
}

위의 코드를 컴파일하려고 하면, 컴파일러는 다음과 같은 오류를 띄우며 거절할 것입니다.

error[E0184]: the trait `Copy` cannot be implemented for this type; 
              the type has a destructor
 --> src/lib.rs:2:17
  |
2 | #[derive(Clone, Copy)]
  |                 ^^^^ 소멸자가 있는 타입에는 `Copy`를 구현할 수 없습니다.

Exercise

The exercise for this section is located in 04_traits/13_drop