Rust Reference
Rust 프로그래밍 레퍼런스
Rust Reference 소개
이 Rust 레퍼런스는 기본문법, 소유권, 구조체, 열거형, 트레이트, 에러처리, 동시성, 매크로의 여덟 가지 카테고리로 구성된 검색 가능한 치트시트입니다. 모든 Rust 프로젝트에서 사용하는 언어 기능을 다루며, 각 항목에는 최신 안정 Rust 툴체인으로 바로 컴파일할 수 있는 코드 예제가 포함되어 있어 에디터에 붙여넣기만 하면 즉시 빌드할 수 있습니다.
Rust는 가비지 컬렉터 없이 컴파일 타임에 메모리 안전성을 보장하는 소유권 모델로 다른 시스템 언어와 차별화됩니다. 이 레퍼런스는 소유권, 빌림(&, &mut), 라이프타임, 클로닝, 슬라이스를 별도 카테고리로 분리하여 이 개념들이 올바른 Rust 코드 작성에 얼마나 핵심적인지를 반영합니다. 빌림 검사기(borrow checker)를 이해하는 것이 Rust 학습에서 가장 가파른 부분인데, 구체적인 예제를 바로 참고할 수 있으면 그 과정이 크게 빨라집니다.
메모리 관리 외에도 이 레퍼런스는 Rust의 표현력 있는 타입 시스템을 다룹니다. impl 블록이 있는 구조체, 데이터를 담는 열거형(Option<T>, Result<T, E>), 트레이트 정의와 바운드, 인체공학적 에러 전파를 위한 ? 연산자 등이 포함됩니다. 동시성 항목에서는 thread::spawn, Arc와 함께 쓰는 Mutex<T>, MPSC 채널, async/await를 설명하여 스레드 기반과 비동기 Rust 애플리케이션 모두의 구성 요소를 제공합니다.
주요 기능
- move 시맨틱, 불변/가변 참조, clone, 라이프타임, 슬라이스를 다루는 소유권 및 빌림 섹션
- 범위 패턴과 다중 값 매칭 구문을 포함한 match, if let, while let 패턴 매칭
- impl 메서드, 튜플 구조체, Debug/Clone/PartialEq를 위한 #[derive]를 포함한 구조체 정의
- 데이터 페이로드가 있는 열거형 변형 및 Option<T>, Result<T, E> 사용 패턴 상세 설명
- 정의, 구현, 트레이트 바운드, where 절, dyn Trait 객체를 포괄하는 트레이트 시스템
- ? 연산자, unwrap/expect, 사용자 정의 에러 열거형, panic!을 활용한 에러 처리 패턴
- thread::spawn, move 클로저, Arc<Mutex<T>>, mpsc 채널, async/await 등 동시성 기본 요소
- vec!, macro_rules!, filter/map/sum 이터레이터 체이닝, collect 터보피시 구문을 포함한 매크로 예제
자주 묻는 질문
이 레퍼런스는 어떤 Rust 에디션을 기준으로 하나요?
모든 예제는 Rust 2021 에디션 규칙을 따르며 안정 버전 Rust 1.70 이상에서 컴파일됩니다. nightly 전용 기능은 사용하지 않으므로 어떤 최근 안정 툴체인의 rustc나 cargo에서든 모든 예제를 실행할 수 있습니다.
Rust의 소유권(ownership)이란 무엇이고 왜 중요한가요?
소유권은 Rust의 핵심 메모리 안전 메커니즘입니다. 모든 값은 정확히 하나의 소유자를 가지며, 소유자가 스코프를 벗어나면 값이 해제됩니다. 값을 이동(move)하면 소유권이 이전되어 해제 후 사용(use-after-free) 버그를 방지합니다. 빌림(&, &mut)은 소유권을 가져가지 않고 데이터를 참조할 수 있게 하며, 동시에 가변 참조 하나 또는 불변 참조 여러 개만 허용하는 규칙을 따릅니다.
String과 &str은 언제 구분해서 사용하나요?
&str(문자열 슬라이스)은 문자열 데이터를 읽기만 하고 소유하거나 수정할 필요가 없을 때 사용합니다. String이나 문자열 리터럴을 빌려온 뷰입니다. String은 동적으로 문자열을 구성하거나 구조체에 저장하는 등 힙 할당, 확장 가능한 소유 문자열 데이터가 필요할 때 사용합니다.
Option<T>과 Result<T, E>는 에러 처리와 어떤 관계인가요?
Option<T>은 존재할 수도, 존재하지 않을 수도 있는 값(Some(T) 또는 None)을 표현하여 널 포인터를 대체합니다. Result<T, E>는 성공(Ok(T)) 또는 실패(Err(E))할 수 있는 연산을 표현합니다. 둘 다 match와 ? 연산자와 통합되어 예외 없이 간결하고 타입 안전한 에러 전파를 지원합니다.
트레이트(trait)와 인터페이스(interface)는 어떻게 다른가요?
Rust 트레이트는 다른 언어의 인터페이스와 유사하지만 더 강력합니다. 기본 메서드 구현을 제공할 수 있고, 제네릭 바운드로 사용할 수 있으며, dyn Trait를 통한 동적 디스패치가 가능합니다. 인터페이스와 달리 자신이 소유하지 않는 타입에도 트레이트를 구현할 수 있고(고아 규칙 허용 시), 연관 타입과 연관 상수를 지원합니다.
Rust는 동시성 안전을 어떻게 보장하나요?
Rust의 타입 시스템은 컴파일 타임에 스레드 안전성을 강제합니다. Send 트레이트는 스레드 간 전송이 안전한 타입을 표시하고, Sync는 공유가 안전한 타입을 표시합니다. 소유권 규칙과 결합하여 데이터 경쟁을 방지합니다. 공유 가변 상태는 명시적 동기화(Arc<Mutex<T>>)를 요구하며, 컴파일러가 이 제약을 위반하는 코드를 거부합니다.
? 연산자란 무엇이고 에러 처리를 어떻게 단순화하나요?
? 연산자는 Result나 Option 값을 언래핑하는 문법 설탕입니다. Ok(v)나 Some(v)이면 v로 언래핑하고, Err(e)나 None이면 함수가 에러와 함께 조기 반환합니다. 중첩된 match 블록을 깔끔한 선형 코드로 대체하며, 반환 타입이 Result나 Option인 함수에서만 사용할 수 있습니다.
Rust에서 매크로와 함수는 어떻게 다른가요?
매크로는 컴파일 타임에 구문 토큰을 대상으로 동작하고, 함수는 런타임에 값을 대상으로 동작합니다. macro_rules! 매크로는 토큰 트리의 패턴 매칭을 사용하여 코드를 생성하므로 vec![1,2,3]처럼 가변 인자 수와 컴파일 타임 코드 생성이 가능합니다. 절차적 매크로(derive, attribute)는 메타프로그래밍을 위한 더 강력한 기능을 제공합니다.