Drop 트레이트
Coddy Rust 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 56번째.
Rust에서 값이 스코프를 벗어나면 자동으로 정리됩니다. 하지만 로깅, 리소스 해제 또는 최종 message 전송과 같이 그 순간에 사용자 지정 코드를 실행해야 한다면 어떻게 해야 할까요? Drop 트레이트를 사용하면 구조체가 소멸되기 직전에 정확히 어떤 일이 일어날지 Define할 수 있습니다.
Drop 트레이트에는 drop이라는 단일 메서드가 있으며 &mut self를 받습니다:
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에서 소멸자에 해당하는 기능입니다. 일반적으로 정리 작업에 사용됩니다. 예를 들어 file 핸들을 닫거나, 서버와의 연결을 끊거나, Rust가 automatically 관리할 수 없는 리소스를 해제할 때 사용합니다. Drop 트레이트는 조기 반환으로 인해 스코프가 종료되더라도 정리 코드가 실행되도록 보장합니다.
챌린지
쉬움자동 정리를 보여 주는 리소스 관리 시스템을 만들어 보겠습니다! 파일을 열고 닫는 동작을 시뮬레이션하는 FileHandle 구조체를 만들고, 핸들이 스코프를 벗어나면 file이 닫혔음을 automatically 알리도록 하겠습니다.
코드를 두 개의 파일에 나누어 구성합니다:
file_handle.rs: publicFileHandle구조체를 Define하고, publicfilenamefield(String)를 포함합니다. FileHandle을 create하고 file이 "opened"될 때 message를 prints하는newassociated function을 Implement합니다. 그런 다음 핸들이 삭제될 때 closing message를 prints하도록Droptrait을 Implement합니다.main.rs: file_handle module을 가져오고, filename을 전달받아 local 스코프 Inside에 FileHandle을 create한 뒤 file이 "open"인 동안 processing message를 prints하는process_filefunction을 called합니다. 스코프가 ends될 때 Drop 구현이 automatically 실행됩니다. 제공된 input으로 이 function을 호출합니다.
FileHandle이 create되면 다음을 prints해야 합니다:
Opening file: {filename}processing 중(스코프 Inside)에는 다음을 prints합니다:
Processing {filename}...FileHandle이 dropped될 때(스코프가 ends될 때) 다음을 prints해야 합니다:
Closing file: {filename}예를 들어, input이 data.txt인 경우:
Opening file: data.txt
Processing data.txt...
Closing file: data.txt그리고 input이 config.json인 경우:
Opening file: config.json
Processing config.json...
Closing file: config.json하나의 input을 받습니다. input은 filename 문자열입니다.
REQUIRED OUTPUT FORMAT:
직접 해보기
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);
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Rust 컴파일러