[Rust 시리즈 1편] 왜 지금 Rust를 공부할까

English version

Rust는 C처럼 시스템에 가까운 언어이지만, 메모리 실수를 프로그래머가 저지르기 전에 더 많이 막아 주려는 언어라는 점에서 근본적으로 다른 점이 있습니다. 이번 글에서는 왜 Coding 카테고리의 다음 언어로 Rust를 선택했는지, 그리고 어떤 순서로 공부하면 좋은지 정리합니다. 1편에서는 모든 문법을 한꺼번에 배우기보다, "Rust는 무엇을 해결하려는 언어인가"와 "어떤 흐름으로 익히면 덜 막히는가"를 먼저 잡는 데 집중합니다.

이번 글에서 먼저 잡을 용어

  1. ownership: 각 값이 누구에게 속해 있고, scope이 끝날 때 언제 정리되는지를 Rust가 추적하는 핵심 규칙
  2. borrowing: 값의 소유권은 유지한 채, 참조를 통해 잠시 접근 권한만 빌려 쓰는 방식
  3. Cargo: Rust 프로젝트 생성, 빌드, 실행, 테스트를 관리하는 기본 도구

앞으로 배울 용어 미리 보기

  1. lifetime: 참조가 유효한 범위를 설명하는 규칙으로, 14편에서 본격적으로 다룹니다.
  2. trait: 타입이 어떤 행동을 지원하는지 나타내는 인터페이스 개념으로, 13편에서 다룹니다.
  3. pattern matching: 값의 모양에 따라 분기하는 표현 방식으로, 9편에서 자세히 다룹니다.

핵심 개념

Rust 트랙 로드맵(학습 순서 지도)은 아래와 같습니다. 중요한 점은, Rust를 단순히 "안전한 C 대체 문법"으로 보는 것이 아니라 "ownership과 타입 시스템으로 프로그램 구조를 설계하는 언어"로 이해하는 것입니다.

회차 주제 핵심 역량
01 왜 지금 Rust를 공부할까 학습 이유와 로드맵 이해
02 Rust 개발 환경 준비와 첫 실행 rustup, cargo, 빌드 흐름 익히기
03 변수, 불변성, 기본 자료형 let, mut, 스칼라·튜플·배열 이해
04 함수와 제어 흐름 fn, if, loop, while, for 익히기
05 ownership 기초 move, scope, drop 감각 잡기
06 참조와 borrowing &, &mut, 참조 규칙 이해
07 슬라이스와 문자열 String, &str, 슬라이스 차이 이해
08 구조체와 메서드 struct, impl, 메서드 설계
09 열거형과 패턴 매칭 enum, match, Option 활용
10 컬렉션 다루기 Vec, HashMap, 반복 처리
11 에러 처리 기초 Result, panic!, ? 연산자 익히기
12 모듈과 패키지 구조 mod, crate, 파일 분리
13 제네릭과 트레이트 재사용 가능한 타입·행동 설계
14 lifetime 입문 참조 유효 범위 읽기
15 이터레이터와 클로저 함수형 스타일 데이터 처리
16 스마트 포인터와 힙 데이터 Box, Rc, RefCell 감각
17 테스트와 문서화 cargo test, doc comment
18 동시성 기초 thread, channel, Send/Sync 감각
19 비동기 기초 맛보기 async, await, 런타임 개념 이해
20 캡스톤: 안전한 CLI 도구 만들기 파일, 에러 처리, 모듈, 테스트 통합

1~4편은 문법과 실행 흐름을 익히는 토대, 5~9편은 ownership과 타입 시스템을 몸에 붙이는 핵심 블록, 10~15편은 컬렉션과 추상화·함수형 도구를 연결하는 실전 블록, 16~20편은 메모리 모델 확장과 테스트·동시성·캡스톤으로 이어지는 심화 블록입니다.

이 시리즈는 일부러 1~4편에서 문법과 실행 흐름을 먼저 익힌 뒤, 5편부터 ownership과 borrowing을 본격적으로 다룹니다. 처음부터 모든 제약을 한꺼번에 던지면 막히기 쉬워서, 문법 감각을 먼저 만든 뒤 핵심 철학으로 들어가는 순서를 택했습니다.

  • 1~4편을 마치면 작은 콘솔 프로그램을 직접 만들고, Rust 문법의 기본 흐름을 읽을 수 있습니다.
  • 5~9편을 마치면 ownership, borrowing, 구조체, enum으로 Rust다운 코드를 설명할 수 있습니다.
  • 10~15편을 마치면 컬렉션, 에러 처리, 모듈, trait, lifetime을 연결해 더 실제적인 프로그램 구조를 설계할 수 있습니다.
  • 16~20편을 마치면 스마트 포인터, 테스트, 동시성, 비동기를 거쳐 안전한 CLI 도구까지 완성할 수 있습니다.

시리즈 설계 철학은 "Rust의 문법보다, Rust가 왜 이런 제약을 강하게 거는지 설명할 수 있어야 한다"는 한 문장으로 요약됩니다.

  • 안전성 중심: 메모리와 참조를 더 조심스럽게 다루게 만드는 규칙을 언어의 중심으로 배웁니다.
  • 작은 예제, 선명한 제약: 짧은 코드에서도 왜 컴파일이 성공하거나 실패하는지 이유를 함께 관찰합니다.
  • 실전 확장성: 문자열, 컬렉션, 에러 처리, 모듈, 테스트, 동시성까지 자연스럽게 연결해 실제 도구 만들기로 이어집니다.
기초 문법변수 · 함수 · 제어 흐름Rust 핵심ownership · borrowing · enum구조화컬렉션 · 에러 처리 · trait확장스마트 포인터 · 동시성 · CLI

로드맵에서 말하는 핵심 역량은 "그 회차를 마친 뒤, 컴파일러가 왜 그런 제약을 거는지 스스로 설명할 수 있는 능력"을 뜻합니다.

코드로 따라하기

가장 먼저 볼 것은, Rust도 컴파일을 거쳐 실행된다는 사실입니다. 아래는 가장 작은 형태의 Rust 프로그램입니다.

fn main() {
    println!("Hello, Rust!");
}

main은 프로그램이 시작되는 함수이고, println!은 화면에 문자열을 출력하는 매크로입니다. 처음에는 함수처럼 보이지만, !가 붙어 있다는 점이 Rust 문법에서 눈에 띄는 특징입니다.

Rust는 기본적으로 값을 바꾸지 못하게 만드는 쪽에서 시작합니다. 이 점이 다른 언어와 처음부터 다른 감각을 줍니다.

fn main() {
    let language = "Rust";
    let mut year = 2026;

    println!("language = {}", language);
    println!("year = {}", year);

    year += 1;
    println!("next year = {}", year);
}

let으로 변수를 만들고, 값을 바꿀 수 있게 하려면 mut를 명시해야 합니다. Rust는 "실수로 바뀌면 안 되는 값"을 기본적으로 더 강하게 보호하려고 합니다.

ownership은 Rust를 배우는 가장 큰 이유이자 가장 많이 막히는 지점입니다. 하지만 1편에서는 규칙을 완전히 이해하려 하기보다, "값이 복사되는가, 이동되는가, 빌려지는가"를 Rust가 엄격하게 따진다는 사실만 먼저 기억해도 충분합니다. 특히 borrowing에서는 여러 불변 참조는 함께 허용하지만, 가변 참조는 더 엄격하게 관리한다는 정도만 가볍게 알고 넘어가면 됩니다.

fn main() {
    let score = 95;
    let borrowed = &score;

    println!("score = {}", score);
    println!("borrowed = {}", borrowed);
}

여기서 &score는 값을 넘겨주지 않고 잠시 빌려 쓰겠다는 뜻입니다. 6편에서 borrowing을 본격적으로 다루기 전에는, &가 "참조를 만든다"는 문법과 Rust가 참조를 매우 엄격하게 관리한다는 감각만 잡아도 충분합니다.

왜 중요한가

Rust를 배우는 이유는 단순히 "요즘 인기 있는 시스템 언어"를 따라가기 위해서가 아닙니다.

  • 메모리 안전성과 성능을 함께 잡아야 하는 시스템 소프트웨어, CLI 도구, 서버, 임베디드 분야에서 강한 선택지가 됩니다.
  • C나 C++에서 자주 문제 되는 메모리 오류를 컴파일 단계에서 더 일찍 발견하도록 도와줍니다.
  • ownership, borrowing, trait 같은 개념을 익히면 다른 언어를 볼 때도 타입 설계와 자원 관리 관점이 훨씬 선명해집니다.
  • 대신 컴파일러가 초반부터 많은 제약을 확인하기 때문에, 처음에는 러닝 커브가 더 가파르게 느껴질 수 있습니다.

이 글에서 정리한 핵심은 세 가지입니다.

  • Rust는 단순히 빠른 언어가 아니라, 안전성 제약을 설계에 적극적으로 반영하는 언어라는 점
  • ownership과 borrowing이 시리즈 전체를 묶는 중심축이라는 점
  • 앞으로의 학습이 기초 문법에서 안전한 CLI 도구 만들기로 자연스럽게 확장된다는 점

이후 학습은 아래 블록을 순서대로 밟습니다.

  • 기초 블록 (1~4): 변수, 자료형, 함수, 제어 흐름으로 문법 감각과 실행 흐름을 먼저 익힙니다.
  • 핵심 블록 (5~9): ownership, borrowing, 문자열, 구조체, enum으로 Rust의 핵심 철학을 몸에 붙입니다.
  • 구조 블록 (10~15): 컬렉션, 에러 처리, 모듈, trait, lifetime, iterator로 코드를 더 실제적으로 구조화합니다.
  • 확장 블록 (16~20): 스마트 포인터, 테스트, 동시성, 비동기, 캡스톤으로 언어의 확장 가능성을 확인합니다.

각 편의 예제는 작아 보여도 다음 편의 제약과 오류 메시지를 이해하는 발판이 되므로, "왜 이 코드는 되고 저 코드는 막히는가"를 함께 기록하며 따라오는 것이 좋습니다.

CodeSandbox로 이어서 실습하기

아래 샌드박스는 CodeSandbox의 Rust starter입니다. 이번 글의 핵심 코드를 src/main.rs에 옮기고, cargo checkcargo run 결과를 나란히 보면서 컴파일 메시지와 실행 출력을 비교해 보세요.

Live Practice

Rust Practice Sandbox

CodeSandbox

Run the starter project in CodeSandbox, compare it with the lesson code, and keep experimenting.

Rust startercargoterminal
  1. starter를 fork한 뒤 src/main.rs를 연다
  2. 본문 예제를 붙여 넣고 cargo check와 cargo run을 차례로 실행한다
  3. 타입, 값, 참조 흐름을 바꿔 컴파일 피드백과 출력 차이를 비교한다

Rust 실습은 브라우저 미리보기보다 터미널 피드백이 더 중요합니다. 여러 파일 구조나 추가 crate가 필요한 예제는 파일 배치를 조금 더 손봐야 할 수 있습니다.

실습

  • 따라 하기: 로드맵 표를 보고, ownership·borrowing·trait 중 지금 가장 낯선 단어를 하나 골라 한 문장으로 예상 뜻을 적어 봅니다.
  • 확장하기: 학교나 개인 프로젝트에서 "성능도 중요하지만 오류를 줄이고 싶은 도구"가 무엇인지 떠올리고, Rust로 만들면 좋을 예시를 3개 적어 봅니다.
  • 디버깅: let language = "Rust"; language = "Go";처럼 불변 변수에 값을 다시 넣는 상황을 상상해 보고, 왜 Rust가 이를 기본적으로 막으려 하는지 설명해 봅니다.
  • 완료 기준: Cargo, ownership, borrowing, mut를 각각 한 문장으로 설명하고, Rust 시리즈를 어떤 순서로 공부할지 스스로 말할 수 있으면 됩니다.

마무리

Rust는 "어려운 시스템 언어"라서 공부할 가치가 있는 것이 아니라, "어려운 문제를 더 안전하게 다루게 만드는 언어"라서 공부할 가치가 있습니다. 처음에는 제약이 많은 언어처럼 느껴질 수 있지만, 그 제약이 왜 필요한지 이해하기 시작하면 오히려 설계가 더 선명해집니다. 다음 글에서는 Mac에서 Rust 개발 환경을 준비하고 cargo로 첫 프로젝트를 만들고 실행해 보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요