Drop 트레이트
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 56번째.
Rust에서 값이 스코프를 벗어나면 자동으로 정리됩니다. 하지만 로깅, 리소스 해제, 또는 마지막 메시지 전송과 같이 그 순간에 커스텀 코드를 실행해야 한다면 어떻게 해야 할까요? Drop 트레이트를 사용하면 구조체가 파괴되기 직전에 어떤 일이 일어날지 정확하게 정의할 수 있습니다.
Drop 트레이트는 &mut self를 인자로 받는 drop이라는 단일 메서드를 가집니다:
struct Connection {
id: u32,
}
impl Drop for Connection {
fn drop(&mut self) {
println!("Connection {} closed.", self.id);
}
}
여러분은 drop을 직접 호출하지 않습니다. 값이 스코프를 벗어날 때 Rust가 자동으로 이를 호출합니다:
fn main() {
let conn = Connection { id: 42 };
println!("Using connection...");
} // "Connection 42 closed."가 여기서 자동으로 출력됩니다
출력 결과는 다음과 같습니다:
Using connection...
Connection 42 closed.
이것은 Rust 버전의 소멸자(destructor)입니다. 이것은 파일 핸들 닫기, 서버 연결 해제, 또는 Rust가 자동으로 관리할 수 없는 리소스 해제와 같은 정리 작업에 흔히 사용됩니다. Drop 트레이트는 조기 반환(early return)으로 인해 스코프가 종료되더라도 정리 코드가 실행되도록 보장합니다.
챌린지
쉬움자동 정리를 시연하는 리소스 관리 시스템을 만들어 봅시다! 파일 열기와 닫기를 시뮬레이션하는 FileHandle 구조체를 만들 것입니다. 핸들이 범위를 벗어나면 파일이 닫혔음을 자동으로 알리게 됩니다.
코드는 두 개의 파일로 구성됩니다:
file_handle.rs: 공개filename필드(String)를 가진 공개FileHandle구조체를 정의합니다. FileHandle을 생성하고 파일이 "열렸을" 때 메시지를 출력하는new연관 함수를 구현하세요. 그런 다음 핸들이 드롭될 때 닫기 메시지를 출력하도록Drop트레이트를 구현하세요.main.rs: file_handle 모듈을 가져오고, 파일 이름을 인자로 받아 로컬 범위 내에서 FileHandle을 생성하고 파일이 "열려 있는" 동안 처리 메시지를 출력하는process_file함수를 만드세요. 범위가 끝나면 Drop 구현이 자동으로 실행됩니다. 제공된 입력값으로 이 함수를 호출하세요.
FileHandle이 생성될 때, 다음을 출력해야 합니다:
Opening file: {filename}처리 중일 때(범위 내부), 다음을 출력하세요:
Processing {filename}...FileHandle이 드롭될 때(범위 종료), 다음을 출력해야 합니다:
Closing file: {filename}예를 들어, 입력값이 data.txt인 경우:
Opening file: data.txt
Processing data.txt...
Closing file: data.txt그리고 입력값이 config.json인 경우:
Opening file: config.json
Processing config.json...
Closing file: config.json하나의 입력을 받게 됩니다: 파일 이름 문자열.
치트 시트
Drop 트레이트를 사용하면 값이 스코프를 벗어날 때 자동으로 실행되는 사용자 정의 정리 코드를 정의할 수 있습니다.
Drop 트레이트에는 &mut self를 매개변수로 받는 drop이라는 단일 메서드가 있습니다:
struct Connection {
id: u32,
}
impl Drop for Connection {
fn drop(&mut self) {
println!("Connection {} closed.", self.id);
}
}
drop을 직접 호출할 필요는 없습니다. 값이 스코프를 벗어날 때 Rust가 자동으로 호출합니다:
fn main() {
let conn = Connection { id: 42 };
println!("Using connection...");
} // 여기서 "Connection 42 closed."가 자동으로 출력됩니다.
Drop 트레이트는 파일 핸들 닫기, 서버 연결 해제 또는 리소스 해제와 같은 정리 작업에 흔히 사용됩니다. 이는 조기 반환(early return)으로 인해 스코프가 종료되더라도 정리 코드가 실행되도록 보장합니다.
직접 해보기
mod file_handle;
use file_handle::FileHandle;
// TODO: process_file 함수 구현하기
// 다음을 수행해야 합니다:
// 1. 로컬 스코프 생성 (중괄호 {} 사용)
// 2. 해당 스코프 내부에서 FileHandle::new()를 사용하여 FileHandle 생성
// 3. 처리 메시지 출력: "Processing {filename}..."
// 4. 스코프가 종료될 때, Drop이 자동으로 호출됨
fn process_file(filename: &str) {
// TODO: 이 함수를 구현하세요
}
fn main() {
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let filename = input.trim();
process_file(filename);
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.