Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

서론 및 동기: C# 개발자가 Rust를 배워야 하는 이유

학습 목표: C#의 매니지드(Managed) 환경과 Rust의 시스템 프로그래밍 환경을 비교하고, Rust가 어떻게 런타임 오버헤드 없이 메모리 안전성과 성능을 동시에 달성하는지 이해합니다. 또한, C#에서 흔히 겪는 'Null 참조 예외'나 '예측 불가능한 GC 중단' 등의 문제를 Rust가 어떻게 근본적으로 해결하는지 살펴봅니다.


1. 런타임 비용 없는 압도적 성능

C#은 생산성이 매우 높지만, 가비지 컬렉터(GC)와 가상 머신(CLR)으로 인한 런타임 오버헤드가 불가피합니다. 반면 Rust는 **제로 비용 추상화(Zero-cost Abstraction)**를 통해 네이티브 코드 수준의 속도를 제공합니다.

비교 항목C# (.NET)Rust
메모리 관리가비지 컬렉터 (런타임 오버헤드)소유권 시스템 (컴파일 타임 결정)
실행 방식JIT 컴파일 (실행 시 최적화)AOT 컴파일 (빌드 시 최적화)
성능 예측GC 중단으로 인한 가변적 지연일관된 마이크로초 단위 지연
메모리 사용객체 헤더 및 GC 메타데이터 필요데이터 본연의 크기만 점유
#![allow(unused)]
fn main() {
// [C# 수준의 표현력, C 수준의 속도]
fn process_data(items: &[i32]) -> i32 {
    items.iter()
        .filter(|&&x| x > 0)
        .map(|&x| x * 2)
        .sum()
}
// 이 코드는 수동으로 작성한 루프만큼 빠르며, 
// 루프 본문의 모든 추상화는 컴파일 타임에 제거됩니다.
}

2. '10억 달러짜리 실수' Null 참조의 종말

C# 8.0에서 'Nullable Reference Types'가 도입되었지만, 여전히 런타임에 NullReferenceException이 발생할 가능성은 열려 있습니다. Rust는 Option<T> 타입을 통해 이를 원천 차단합니다.

  • C#: "이 변수는 null일 수도 있으니 조심하세요 (하지만 강제는 아닙니다)."
  • Rust: "값이 없을 수도 있는 데이터는 Option으로 감싸야만 하며, 이를 처리하지 않으면 컴파일 자체가 되지 않습니다."
#![allow(unused)]
fn main() {
// Rust: 컴파일러가 강제하는 안전성
fn get_user_name(id: u32) -> Option<String> {
    // ... DB 조회 ...
}

let name = get_user_name(123);
// name.to_uppercase(); // 컴파일 에러! (Option에는 해당 메서드가 없음)

let display_name = name.unwrap_or("Guest".to_string()); // 안전하게 기본값 처리
}

3. 정확성 증명 도구로서의 타입 시스템

Rust의 타입 시스템은 단순히 '데이터의 종류'를 정의하는 것을 넘어, 비즈니스 로직의 정확성을 컴파일 타임에 증명합니다.

  • 철저한 패턴 매칭: 새로운 열거형(Enum) 타입을 추가했을 때, 이를 처리하지 않은 모든 코드를 컴파일러가 정확히 찾아내어 수정을 요구합니다.
  • 기본 불변성(Default Immutability): 모든 변수는 기본적으로 불변입니다. 상태 변경이 필요한 곳만 명시적으로 mut을 붙여야 하므로, 의도치 않은 상태 변화로 인한 버그를 방지합니다.

4. C# 대신 Rust를 선택해야 할 때

이럴 땐 Rust가 정답입니다:

  • 실시간 응답이 중요한 시스템 (임베디드, 고주파 거래 등)
  • 메모리 사용량을 최소화해야 하는 클라우드 마이크로서비스 (인프라 비용 절감)
  • 보안이 최우선인 라이브러리 (메모리 오염 취약점 방지)
  • C#으로 작성된 앱의 특정 병목 지점 성능 개선 (FFI 활용)

이럴 땐 C#을 유지하세요:

  • 빠른 UI 프로토타이핑 (WPF, WinForms 등)
  • 데이터베이스 위주의 전형적인 사내 업무 시스템(CRUD)
  • 복잡한 엔터프라이즈 통합 솔루션 (기존 .NET 연동 필수)

💡 핵심 요약: 철학의 차이

C#은 개발자가 '실수하지 않도록' 가이드라인을 제공하지만, Rust는 개발자가 '실수할 수 없도록' 시스템적으로 제약합니다. 처음에는 이 제약이 까다롭게 느껴질 수 있지만, 일단 컴파일을 통과한 코드는 놀라울 정도로 견고하고 빠릅니다.