C/C++ 프로그래머를 위한 Rust 부트캠프
과정 안내
- 학습 내용
- Rust 도입 배경 (C 및 C++ 개발자의 관점에서)
- 로컬 환경 설정 및 설치
- 기본 문법: 타입, 함수, 제어 흐름, 패턴 매칭
- 프로젝트 관리: 모듈 시스템과 Cargo 활용
- 추상화: 트레이트(Traits)와 제네릭(Generics)
- 데이터 다루기: 컬렉션(Collections)과 에러 처리
- 심화 개념: 클로저(Closures), 메모리 관리, 수명(Lifetimes), 스마트 포인터
- 동시성(Concurrency) 프로그래밍
- 저수준 제어: Unsafe Rust와 FFI(Foreign Function Interface)
- 임베디드 핵심: 펌웨어 팀을 위한
no_std환경 이해 - 실전 사례 연구: C++ 프로젝트의 Rust 전환 패턴 분석
- 참고 사항: 본 과정에서는 비동기(Async) Rust를 깊게 다루지 않습니다. Future, Executor,
Pin, Tokio 등 운영 환경의 비동기 패턴은 자매 과정인 비동기 Rust 교육(Async Rust Training)에서 상세히 확인하실 수 있습니다.
자기 주도 학습 가이드
본 자료는 강사 주도 교육뿐만 아니라 자기 주도 학습용으로도 정교하게 설계되었습니다. 혼자 공부하시는 분들은 아래 가이드를 참고하여 학습 효과를 극대화해 보시기 바랍니다.
📅 권장 학습 일정
| 단계 | 주제 | 권장 시간 | 학습 목표 (체크포인트) |
|---|---|---|---|
| 1~4장 | 환경 설정, 타입, 제어 흐름 | 1일 | 기본적인 CLI 온도 변환기를 작성할 수 있습니다. |
| 5~7장 | 데이터 구조와 소유권 | 1~2일 | let s2 = s1 실행 시 왜 s1을 더 사용할 수 없는지 설명할 수 있습니다. |
| 8~9장 | 모듈화와 에러 처리 | 1일 | ? 연산자로 에러를 전파하는 멀티 파일 프로젝트를 설계할 수 있습니다. |
| 10~12장 | 트레이트, 제네릭, 클로저 | 1~2일 | 트레이트 경계(Trait Bounds)를 활용한 제네릭 함수를 작성할 수 있습니다. |
| 13~14장 | 동시성과 Unsafe/FFI | 1일 | Arc<Mutex<T>>를 사용해 스레드 안전한 카운터를 구현할 수 있습니다. |
| 15~16장 | 심층 분석 섹션 | 자율 학습 | 실무에서 해당 기술이 필요할 때 참조 자료로 활용하세요. |
| 17~19장 | 모범 사례 및 참조 | 자율 학습 | 실제 프로젝트를 구현할 때 기술적인 완성도를 높이기 위해 참고하세요. |
📝 연습 문제 활용 팁
- 모든 장에는 난이도별 실습 문제가 포함되어 있습니다: 🟢 초급, 🟡 중급, 🔴 도전
- 반드시 해답을 보기 전에 직접 코드를 작성해 보세요. 빌림 검사기(Borrow Checker)와 씨름하며 고민하는 과정 자체가 성장의 핵심입니다. 컴파일러가 내뱉는 에러 메시지는 여러분의 실력을 키워줄 최고의 스승입니다.
- 15분 이상 진전이 없다면 해답을 보고 원리를 파악한 뒤, 다시 해답을 덮고 처음부터 직접 구현해 보는 방식을 추천합니다.
- Rust Playground를 이용하면 별도의 설치 없이 브라우저에서 바로 코드를 실행해 볼 수 있습니다.
💡 학습 중 난관에 부딪혔을 때
- 에러 메시지를 정독하세요: Rust의 컴파일러 에러 메시지는 해결 방법까지 제시할 정도로 친절하고 상세합니다.
- 기초를 다시 복습하세요: 소유권(7장) 같은 핵심 개념은 반복해서 읽을 때 비로소 진정한 의미가 이해되는 경우가 많습니다.
- 공식 문서를 활용하세요: Rust 표준 라이브러리 문서는 매우 훌륭한 자원입니다. 궁금한 타입이나 메서드는 항상 검색해 보는 습관을 들이세요.
- 비동기 개념이 필요하다면: 자매 과정인 비동기 Rust 교육(Async Rust Training)이 큰 도움이 될 것입니다.
상세 목차
제 I 부 — 기초 다지기
1. 서론 및 동기
- 강사 소개와 학습 방법
- Rust 도입 배경
- Rust의 문제 해결 방식
- Rust만의 독보적인 강점
- 한눈에 보는 비교: Rust vs C/C++
- C/C++ 개발자에게 Rust가 필요한 이유
2. 시작하기
3. 기본 타입과 변수
4. 제어 흐름
5. 데이터 구조와 컬렉션
- 배열(Array) 타입의 특징
- 복합 타입: 튜플(Tuples)
- 참조자(References)의 개념
- C++와 Rust 참조자의 결정적 차이
- 슬라이스(Slices)로 데이터 다루기
- 상수(Constants)와 정적 변수(Statics)
- 문자열 심층 분석: String vs &str
- 구조체(Structs) 정의와 활용
- 동적 배열: Vec<T>
- 키-값 저장소: HashMap
- 연습 문제: Vec과 HashMap 실습
6. 패턴 매칭과 열거형
7. 소유권과 메모리 관리
- Rust만의 독특한 메모리 관리 철학
- 소유권, 빌림, 그리고 수명(Lifetimes)
- 이동 의미론(Move Semantics)의 실체
- 데이터 복제: Clone 트레이트
- 자동 복사: Copy 트레이트
- 리소스 해제: Drop 트레이트
- 연습 문제: Move, Copy, Drop 마스터하기
- 수명(Lifetimes)과 빌림의 관계
- 수명 매개변수(Lifetime Annotations) 명시하기
- 연습 문제: 수명을 활용한 데이터 저장
- 심층 분석: 수명 생략 규칙(Lifetime Elision Rules)
- 힙 할당 포인터: Box<T>
- 내부 가변성 패턴: Cell<T>과 RefCell<T>
- 공유 소유권: Rc<T>
- 연습 문제: 공유 소유권과 내부 가변성 조합
8. 모듈과 크레이트
- 프로젝트 구조화: 크레이트와 모듈
- 연습 문제: 모듈과 함수 설계
- 멀티 프로젝트 관리: 워크스페이스(Workspaces)
- 연습 문제: 워크스페이스 의존성 설정
- 외부 생태계 활용: crates.io 사용법
- 의존성 관리와 SemVer 규칙
- 연습 문제: rand 크레이트 실습
- 설정 파일 이해: Cargo.toml과 Cargo.lock
- 테스트 자동화 도구: Cargo test
- Cargo의 부가 기능 활용
- 실전 테스트 패턴 분석
9. 에러 처리
- 열거형을 활용한 Option과 Result 프로그래밍
- 값이 없을 때의 처리: Option 타입
- 실패 가능성 다루기: Result 타입
- 연습 문제: Option을 활용한 로깅 시스템
- Rust 에러 처리의 정석
- 연습 문제: 실전 에러 핸들링
- 에러 처리 모범 사례(Best Practices)
10. 트레이트와 제네릭
- Rust의 인터페이스: 트레이트(Traits)
- 연산자 오버로딩과 std::ops 트레이트
- 연습 문제: Logger 트레이트 설계
- 선택의 기로: 열거형 vs dyn Trait
- 연습 문제: 설계 역량 강화 퀴즈
- 코드 재사용의 핵심: 제네릭(Generics)
- 연습 문제: 제네릭 프로그래밍 실습
- 트레이트와 제네릭의 강력한 결합
- 타입 안전성 강화: 트레이트 제약(Trait Bounds)
- 연습 문제: 트레이트 제약 조건 활용
- 고급 패턴: 타입 상태(Type State)와 제네릭
- 객체 생성 패턴: Rust 빌더(Builder)
11. 타입 시스템 심화
12. 함수형 프로그래밍 요소
- 유연한 코드 블록: 클로저(Closures)
- 연습 문제: 클로저와 환경 캡처 실습
- 데이터 스트림 처리: 반복자(Iterators)
- 연습 문제: 선언적 반복자 활용하기
- 참조: 반복자 강력한 도구들(Iterator Power Tools)
13. 동시성 프로그래밍
14. Unsafe Rust와 FFI
- 두려움 없는 저수준 제어: Unsafe Rust
- 기초 FFI: C에서 호출하는 Rust 라이브러리
- 심화 FFI: 복잡한 데이터 구조 공유
- Unsafe 코드의 안전성 검증 방법
- 연습 문제: 안전한 FFI 래퍼(Wrapper) 설계
제 II 부 — 심층 분석 및 운영
15. no_std: 베어메탈 환경을 위한 Rust
- no_std 환경의 정의와 제약 사항
- 선택 가이드: no_std vs std 사용 시점
- 연습 문제: no_std 링 버퍼(Ring Buffer) 구현
- 심층 탐구: 임베디드 Rust 시스템
16. 사례 연구: C++에서 Rust로의 전환 실전
- 전략 1: 상속 구조 → 열거형 디스패치 전환
- 전략 2: 포인터 트리 → 아레나(Arena) 기반 설계
- 전략 3: 시스템 통신 → 수명 기반 빌림 모델
- 전략 4: 거대 객체(God Object) → 조합 가능한 상태 분리
- 전략 5: 트레이트 객체의 올바른 사용 시점
제 III 부 — 모범 사례와 참조 자료
17. 실전 모범 사례
- Rust 개발 핵심 수칙 요약
- 효율성 극대화: 과도한 clone() 호출 방지
- 안전성 확보: 검사되지 않은 인덱싱 지양
- 코드 클린업: 할당 피라미드 구조 개선
- 최종 과제: 진단 이벤트 파이프라인 설계
- 현대적인 모니터링: 로깅 및 트레이싱 생태계