| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- amazon ecs
- docker
- AWS 비용 절감
- 디자인 패턴
- 논문 정리
- ssh
- Playwright
- 구조 패턴
- MAPF
- 커머스
- 오블완
- github
- PostgreSQL
- 지표
- Rust
- leetcode
- 청첩장 모임
- 경로 계획 알고리즘
- 신혼 여행
- DevOps
- 생성 패턴
- 티스토리챌린지
- Go-lang
- study
- Til
- terraform
- 14일 공부
- AWS
- 회고
- 실용주의 프로그래머
- Today
- Total
밤 늦게까지 여는 카페
[rust 공식 문서 14일 공부] 11일차 본문
12. An I/O Project: Building a Command Line Program
챕터 12에서는 지금까지 공부한 내용을 바탕으로 grep 이라는 유닉스 프로그램을 간단하게 만들어봅니다.
정말 친절하게 설명해주니 꼭 읽어보고 실습해보는 것을 추천합니다!
13. Functional Language Features: Iterators and Closures
이번에는 rust의 기능 중에서 함수형 프로그래밍 언어와 유사한 기능들을 알아보겠습니다.
대표적으로 closure, iterator가 있는데 알아보시죠!
13.1. Closures: Anonymous Functions that Capture Their Environment
일반적으로 clousre는 변수에 저장하거나 다른 함수의 인자로 전달할 수 있는 익명 함수입니다.
함수와는 다르게 closure가 정의되었을 때 같은 scope에 있는 값들을 저장할 수 있다는 특징이 있습니다.
rust의 closure에서 제가 궁금했던 것은 type annotation과 메모리 관리입니다.
첫째로 타입 검사를 엄밀히 하는 rust는 closure를 어떻게 정의할까요?
closure는 일반적인 함수에 비해서 짧고 사용 방식이 제한적입니다. 그래서 생략도 가능합니다.
예시 1과 같이 파라미터와 반환값의 타입을 명시해도 되고, 예시 2와 같이 파라미터와 반환값의 타입을 명시하지 않아도 괜찮습니다.

단, 타입을 명시하지 않을 때에는 컴파일러가 타입을 유추할 수 있도록 closure가 실제로 사용되어야 합니다.
closure가 호출되면서 파라미터와 반환값의 타입이 정해지는 것이죠.
예시 3과 같이 다른 타입으로 호출하게 되면 에러가 발생하게 됩니다.

두번째로 rust의 closure는 메모리 관리가 어떻게 될까요? 이 질문의 답은 생각보다 간단했습니다.
일반적인 함수로 변수를 전달할 때와 똑같이 ownership이 관리됩니다.
단, 스레드에 closure와 파라미터를 전달할 때는 일반적인 함수에 파라비터를 전달할 때와는 다르게 immutable reference를 사용할 때에도 ownership을 완전히 넘겨줘야 합니다.
main함수가 thread보다 일찍 종료될 수 있는데 이러면 스레드가 참조하는 메모리가 해제되버리기 때문입니다.
조금 더 자세히 살펴보면 Fn trait이 있습니다.
- FnOnce: closure를 한번만 호출할 수 있음
- FnMut: 전달 받은 값을 closure 바깥으로 이동시키지는 않지만 변경할 수는 있음 + 여러 번 호출할 수 있음
- Fn: 값을 변경시키지 않고 여러번 호출할 수 있음
13.2. Processing a Series of Items with Iterators
iterator 자체는 사실 많은 프로그래밍 언어에서 지원해주는 기능입니다.
하지만 rust의 iterator는 ownership 때문에 조금 다르겠죠? ㅋㅋㅋ
맞습니다. sum, map, filter 등의 iterator를 활용하는 메소드들의 사용이 여타 프로그래밍 언어들과는 조금 다릅니다.
13.3. Improving Our I/O Project
챕터12에서 만들었던 grep 프로그램을 간단하게 리팩토링 해보는 내용입니다.
기존 코드를 iterator로 변경하는 내용이 주를 이루는데 마지막에 질문이 나옵니다.
loop 대신에 iterator을 사용하는 것이 정말 효율적일까요?
13.4. Comparing Performance: Loops vs. Iterators
Loop와 Iterator의 성능 차이는 두구두구...
결과는 거의 없다! 입니다.
iterator와 closure를 사용하면 코드의 표현력이 조금 더 좋아지는데 이것이 rust가 추구하는 zero cost abstraction이라고 하네요?
'For Fun' 카테고리의 다른 글
| [rust 공식 문서 14일 공부] 12 일차 (0) | 2025.01.07 |
|---|---|
| 일상 내용을 네이버 블로그로 옮기게 된 이유 - 티스토리 댓글/좋아요 매크로 (3) | 2025.01.01 |
| [rust 공식 문서 14일 공부] 10일차 (0) | 2024.12.21 |
| [rust 공식 문서 14일 공부] 9일차 (1) | 2024.12.20 |
| [rust 공식 문서 14일 공부] 8일차 (0) | 2024.12.17 |