[Rust 공식문서 한국어 정리] 66. Rust 클로저 타입 가이드
[Rust 공식문서 한국어 정리] 66. Rust 클로저 타입 가이드
원문 제목: Closure types — The Rust Reference
작성자: Rust Language Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust의 클로저(Closure) 타입 시스템과 그 내부 동작을 설명합니다.
Fn, FnMut, FnOnce 트레이트의 차이, 캡처 방식, 그리고 클로저의 익명 타입 특성을 다룹니다.
클로저가 환경을 어떻게 캡처하는지(참조 vs 소유권 이전), 그리고 이것이 수명과 소유권에 미치는 영향을 중심으로 설명합니다.
클로저를 함수 포인터나 트레이트 객체로 변환하는 방법, 그리고 move 클로저의 의미도 포함합니다.
Rust의 함수형 프로그래밍 패턴과 콜백 설계를 하는 개발자에게 필수적인 내용입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Fn: 환경을 불변 참조로 캡처하여 여러 번 호출 가능한 클로저 트레이트입니다.
② FnMut: 환경을 가변 참조로 캡처하여 여러 번 호출 가능하지만, 호출 시 가변 소유권이 필요합니다.
③ FnOnce: 환경의 소유권을 이전받아 한 번만 호출 가능한 클로저 트레이트입니다.
④ move 키워드: 클로저가 캡처한 값의 소유권을 강제로 이전받아, 수명을 독립적으로 만듭니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust의 클로저는 익명 구조체로 구현되며, 컴파일러가 각 클로저마다 고유한 타입을 생성합니다.
두 개의 동일한 문법을 가진 클로저라도 서로 다른 타입이며, 이를 trait object(&dyn Fn)로 통일해야 합니다.
클로저는 환경에서 필요한 변수만 선택적으로 캡처하며, 사용 패턴에 따라 참조나 소유권을 취합니다.
Fn은 &self로 호출되며, 불변 참조 캡처만 가능합니다.
|x| x + 1처럼 외부 변수를 수정하지 않는 클로저는 Fn으로 동작합니다.
Fn은 다른 코드와 공유할 수 있으며, 동시 호출도 가능합니다.
FnMut는 &mut self로 호출되며, 가변 참조로 환경을 캡처합니다.
외부 변수를 수정하는 클로저는 FnMut이며, 호출할 때마다 가변 소유권이 필요합니다.
동시에 여러 곳에서 FnMut 클로저를 호출할 수 없으며, 이는 borrow checker가 컴파일 타임에 방지합니다.
FnOnce는 self로 호출되며, 환경의 소유권을 소비합니다.
move 클로저나, drop된 값을 캡처하는 클로저는 FnOnce가 됩니다.
한 번 호출되면 클로저 자체가 소비되므로, 이후 재사용이 불가능합니다.
move 키워드는 클로저가 캡처한 모든 값의 소유권을 강제로 이전합니다.
let closure = move || println!("{}", s);는 s의 소유권을 클로저로 이동시킵니다.
이는 수명이 짧은 지역 변수를 비동기 태스크나 다른 스레드로 전달할 때 필수적입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
멀티스레드에서 클로저를 전달할 때는 move로 소유권을 이전하여 수명 문제를 해결합니다.
Iterator::map에는 Fn 클로저를, Iterator::for_each에는 FnMut 클로저를 사용합니다.
콜백을 트레이트 객체(&dyn Fn)로 저장하여, 여러 클로저를 동형 컬렉션에 담습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust 클로저는 Fn/FnMut/FnOnce 트레이트로 타입 시스템에 통합되어 있습니다.
캡처 방식(불변/가변/소유)에 따라 자동으로 적절한 트레이트가 선택됩니다.
move 클로저는 소유권 이전이 필요한 상황에서 수명 문제를 해결하는 핵심 도구입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/reference/types/closure.html
Rust Book Closures: https://doc.rust-lang.org/book/ch13-01-closures.html
#Rust #Closures #Fn #FnMut #FnOnce #Move #FunctionalProgramming #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30