본문 바로가기

들어가기에 앞서

온라인·오프라인 학습 환경과 예제 실행 준비 사항을 확인하고 현재 수준에 맞는 러스트 학습 시작점을 선택합니다.

러스트(Rust)는 C나 C++처럼 메모리를 직접 다루는 프로그램을 쓰면서도, 해제한 메모리를 다시 쓰거나 여러 스레드가 같은 데이터를 동시에 고치는 오류를 컴파일할 때 막아 주는 언어입니다. 그 대신 컴파일러가 따지는 규칙이 많아서, 처음에는 코드가 왜 거부되는지 이해하는 데 시간이 걸립니다. 이 교재는 그 규칙이 무엇을 지키려고 있는지를 작은 예제로 하나씩 보여 주며, 컴파일러의 오류 메시지를 읽고 코드를 고치는 방법을 함께 익히도록 구성했습니다.

이 교재의 기준

이 교재는 러스트 프로젝트가 펴내는 공식 입문서 The Rust Programming Language(이하 공식 Book)의 순서를 따라가며 설명과 예제를 다시 썼습니다. 기준은 2026년 10월에 나온 stable 러스트 1.99.1과 2024 에디션(edition)이며, 공식 Book도 러스트 1.97.0 이상과 2024 에디션을 전제로 합니다. 러스트는 6주마다 새 stable 버전을 내지만 이전 버전에서 컴파일되던 코드가 계속 컴파일되도록 유지하므로, 더 새 버전으로도 예제를 그대로 따라 할 수 있습니다. 다만 오류 메시지의 문구와 Cargo가 출력하는 내용은 버전마다 조금씩 다를 수 있습니다.

본문에 실은 실행 결과와 오류 메시지는 공식 Book, 표준 라이브러리 문서, 러스트 레퍼런스(Reference), 컴파일러 오류 코드 색인에 적힌 동작에 따라 정리한 것이며, 실제로 실행해 맞춘 것은 아닙니다. 오류 메시지는 오류 코드와 주된 문장, 문제가 된 위치를 중심으로 싣고, 컴파일러가 덧붙이는 긴 설명은 줄였습니다. 빌드에 걸린 시간이나 무작위로 고른 수처럼 실행할 때마다 달라지는 값은 무엇이 달라지는지만 적었습니다.

막혔을 때 볼 자료

공식 Book은 온라인에서 볼 수 있고, 러스트를 설치하면 함께 설치되므로 rustup doc --book 명령으로 인터넷 없이도 열 수 있습니다. 퀴즈와 시각화를 더한 브라운 대학교의 실험판도 있습니다. 막힌 곳의 종류에 따라 찾아볼 자료가 다르며, 아래 그림이 그 갈래를 보여 줍니다.

설치 환경, 개념과 용어, 에디션과 경계 문제를 공식 설치 절, Rust Book, Edition Guide로 라우팅하는 흐름

Rust · official docs · routing

막힌 종류를 분류하면 돌아갈 공식 자료가 선명해진다

환경, 개념, 에디션·경계를 먼저 나눕니다. 현재 공식 Book은 Rust 2024 관용구를 기준으로 하며, 에디션은 크레이트별 선택이라 기존 에디션 지원과 별개입니다.

막힌 종류의 세 갈래와 작은 예제로의 합류환경은설치절,개념은Book,경계는EditionGuide/Reference의서로다른선택3갈래다.각자료에서확인한뒤작은예제로합류한다.3자료사이에실행순서간선은없다.외부unsafe전제는Reference범위로같이확인한다.문제 종류환경 · 개념 · 경계설치·PATH1장 설치 절rustc --version개념·용어공식 Rust Bookrustup doc --book에디션·FFIEdition GuideReference · ABIunsafe extern작은 예제로 복귀같은 명령으로 확인환경개념경계세 자료는 선택 갈래위→아래로 모두 읽는 순서 아님
Rust 학습 중 막힌 지점에 따른 자료 선택 흐름 막힌 종류를 판단해 설치와 PATH는 1장 설치 절, 개념과 용어는 공식 Book과 오프라인 문서, 에디션과 unsafe FFI 경계는 부록 E, Edition Guide, Reference로 나눈다. 경계 자료에서는 Rust 2024의 unsafe extern과 ABI, 시그니처 계약을 확인한 다음 가장 작은 예제로 돌아간다. 무엇이 막혔나?환경 · 개념 · 경계환경개념경계설치·PATH1장 설치 절rustc --version개념·용어공식 Rust Bookrustup doc --book에디션·FFI 경계Edition GuideReference2024 · unsafe extern가장 작은 예제로 복귀같은 명령으로 기준점 확인
환경

설치·업데이트·PATH

1장 설치 절에서 rustc --version으로 도구 체인을 먼저 분리합니다.

개념

공식 Rust Book

온라인 Book을 기준으로 용어를 맞춥니다. 오프라인에서는 rustup doc --book을 실행합니다.

경계

에디션·FFI 경계

부록 E, Edition Guide, Reference에서 Rust 2024 맥락과 unsafe extern, ABI와 시그니처 책임을 함께 확인합니다.

최신 컴파일러는 이전 에디션의 크레이트도 지원합니다. 버전 문제와 에디션 선택을 섞지 말고, 자료를 확인한 뒤 재현 가능한 최소 예제로 돌아옵니다.

명령을 찾을 수 없다는 오류나 링커 오류가 난다면 설치 환경의 문제이므로 러스트 설치를 다시 확인하고, rustc --version으로 지금 어떤 컴파일러를 쓰는지 봅니다. 소유권이나 트레이트처럼 개념과 용어에서 막혔다면 이 교재의 해당 장과 공식 Book을 함께 읽습니다. 에디션마다 다른 문법은 부록 E 에디션과 공식 Edition Guide에서, unsafe extern 같은 외부 함수 선언의 규칙은 안전하지 않은 러스트와 Reference에서 확인합니다. 그림은 둘을 한 갈래로 묶었지만, 부록 E는 에디션의 뜻과 마이그레이션을 다루고 unsafe extern 블록은 18장에서 다룹니다. 세 자료는 위에서부터 모두 읽는 순서가 아니라 막힌 종류에 따라 고르는 갈래이며, 어느 쪽에서 답을 찾았든 작은 예제로 돌아와 같은 명령으로 다시 확인합니다.

러스트가 막아 주는 오류와 그렇지 않은 오류

러스트 코드 대부분은 안전한 러스트(safe Rust)로 쓰입니다. 이 범위에서는 컴파일러가 소유권과 대여(borrowing), 타입 규칙으로 해제한 메모리의 사용, 유효하지 않은 참조, 데이터 경쟁(data race) 같은 메모리 안전성 오류를 컴파일할 때 거부합니다. 메모리를 정리하는 가비지 컬렉터(garbage collector) 없이, 값의 소유자가 범위를 벗어날 때 그 값을 정리하는 방식으로 이를 이룹니다.

그렇다고 모든 오류가 사라지는 것은 아닙니다. 계산이 틀리는 논리 오류, 두 스레드가 서로의 잠금을 기다리며 멈추는 교착 상태(deadlock), 범위를 벗어난 인덱스로 생기는 패닉(panic)은 안전한 러스트에서도 생기므로 테스트와 실행으로 확인해야 합니다. 또 컴파일러가 확인할 수 없는 일을 하려면 unsafe 블록을 쓰는데, 이때는 컴파일러 대신 코드를 쓴 사람이 메모리 안전성의 조건이 지켜지는지 확인해야 합니다. 2024 에디션에서는 다른 언어의 함수를 선언하는 블록도 unsafe extern으로 적어, 선언이 실제 함수와 맞는지를 작성자가 확인해야 한다는 점을 드러냅니다.

러스트는 운영체제나 임베디드 장치처럼 저수준 제어가 필요한 곳뿐 아니라 명령줄 도구나 웹 서버 같은 일반 프로그램에도 쓰입니다. 이 교재에서도 11장에서 명령줄 검색 도구를, 19장에서 여러 스레드로 요청을 처리하는 웹 서버를 직접 만듭니다.

오류 메시지를 읽는 순서

러스트를 배우는 시간의 상당 부분은 컴파일러가 거부한 코드를 고치는 데 쓰입니다. 오류 메시지는 첫 줄에 error[E0382]처럼 오류 코드와 주된 문장을 보여 주고, 그 아래에 문제가 된 소스의 위치와 밑줄, 그리고 help:나 note:로 시작하는 도움말을 덧붙입니다. 오류가 여러 개 나오면 앞의 오류가 뒤의 오류를 일으킨 경우가 많으므로 첫 오류부터 읽고, 오류 코드가 낯설면 rustc --explain E0382처럼 그 코드의 설명을 엽니다.

소유권 오류라면 값의 소유자가 누구인지, 어디서 다른 변수로 이동(move)했는지, 참조가 언제까지 쓰이는지를 차례로 정리해 봅니다. 그다음 참조로 빌려 쓰기, 실행 순서 바꾸기, 소유권을 돌려받기, 자료 구조 바꾸기, clone으로 복사하기 가운데 원래 의도에 맞는 방법을 고릅니다. 모든 대여 오류에 통하는 한 가지 해결책은 없으며, 오류를 없애려고 clone을 붙이기만 하면 의도와 다르게 동작하는 프로그램이 되기도 합니다.

예제를 바꿔 보며 배울 때는 아래 그림처럼 한 번에 하나만 바꾸고 같은 명령으로 다시 확인합니다.

진단부터 다시 실행까지의 Rust 학습 루프

주 진단→소유/대여 계약 지도→수정 하나→같은 명령→증거 비교의 반복 작업 상태가 명시적이다.

기준 명령 실행, 한 번의 수정, 주 진단 읽기, 계약 지도 작성, 의도 보존 수정, 같은 명령 재실행의 여섯 역이 증거 기록 허브를 갱신하는 Rust 학습 루프

Rust · diagnostic-first · evidence loop

진단을 먼저 읽고 같은 명령으로 증거를 누적한다

한 번에 하나만 바꾸고 주 진단·스팬·라벨을 먼저 읽습니다. 소유권 오류에는 보편 처방이 없으며 의도한 소유권과 API 계약을 보존하는 가장 작은 수정을 선택합니다.

여섯 단계의 순환과 별도의 근거 기록원desktop과같이6단계가순환한다.결과진단→계약지도→수정선택→한번수정→동일명령실행→비교→결과진단이다.각단계에서중앙기록으로점선방향을가지며증거허브가별도의실행단계가아니다.결과·진단 읽기주 메시지 · 위치primary span계약 지도owner · moveborrow수정 하나 선택borrow · orderdesign한 번만 수정one small diff같은 명령 실행check · test · run증거 비교before · after증거 기록명령 · 변경 · 진단이전과 이후의 근거실선: 다시 첫 단계로 순환점선: 각 단계에서 근거 누적
여섯 학습 역과 하나의 증거 기록 허브 기준 명령의 결과와 주 진단을 읽고 계약을 지도화한다. 수정 하나를 선택해 한 번만 적용하고 같은 명령을 재실행한 뒤 이전 증거와 비교해 첫 단계로 돌아간다. 각 단계는 명령, 차이, 진단, 규칙을 중앙 기록에 누적한다. 결과·주 진단 읽기commandprimary span계약 지도 그리기owner · moveborrow수정 하나 선택borrow · orderdesign한 번만 수정one small diff같은 명령 재실행check · test · run증거 비교before · after증거 기록command · diffdiagnostic · rule
증거 기록command · diff · diagnostic · rule
  1. 결과와 주 진단 읽기

    기준 명령을 실행한 뒤 주 메시지, 첫 스팬, 라벨, 도움말을 순서대로 확인합니다.

  2. 계약 지도 그리기

    소유자, 이동 지점, 빌림 수명, 가변성, unsafe 전제조건을 표시합니다.

  3. 수정 하나 선택

    빌리기, 순서 변경, 소유권 반환, 구조 재설계 중 의도에 맞는 수정을 고릅니다.

  4. 한 번만 수정

    선택한 변경 하나만 적용해 원인과 결과를 연결합니다.

  5. 같은 명령 재실행

    같은 명령으로 새 결과를 얻어 비교할 기준을 유지합니다.

  6. 증거 비교

    명령, 차이, 진단, 규칙의 전후를 기록하고 첫 단계로 돌아갑니다.

Safe Rust

안전 연산과 명시적 비용

건전한 내부 구현을 전제로 Safe Rust는 메모리 안전 규칙을 강제합니다. 소유권과 RAII는 추적 가비지 컬렉터에 의존하지 않고 자원 수명을 관리합니다.

unsafe · FFI

증명 책임이 작성자에게 이동

unsafe는 검사를 끄지 않습니다. Rust 2024의 unsafe extern은 ABI, 시그니처, 외부 전제조건의 책임을 드러냅니다. 안전 항목도 선언 정확성은 작성자가 보장합니다.

borrow diagnostic

보편 처방 대신 의도 확인

빌리기, 재배치, 소유권 반환, 데이터 구조 재설계, clone 중 무엇이 맞는지는 의도한 계약에 달려 있습니다. 진단만으로 고정된 해법을 만들지 않습니다.

  • 시계 방향 반복
  • 증거 기록 갱신
  • 진단 우선 확인

컴파일 오류는 실패 판정이 아니라 이 코드의 계약을 좁히는 증거입니다. 첫 진단에서 출발하고 같은 명령으로 비교하는 루프는 CLI, 서버, 저수준, 임베디드 코드에도 같은 기준으로 확장됩니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
원 도표의 제목·노드·관계·조건·주석
범위원문
관계·조건 설명원 데스크톱 도표처럼 6단계가 순환한다. 결과 진단→계약 지도→수정 선택→한 번 수정→동일 명령 실행→비교→결과 진단이다. 각 단계에서 중앙 기록으로 점선이 이어지며 증거 허브는 별도의 실행 단계가 아니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
주 진단 기록

같은 검사 명령에서 첫 관련 오류를 잡는다.

  • 입력: 현재 소스
  • 근거: 주 진단·위치
  • 먼저 재현된 오류를 계약과 연결해야 수정 대상을 좁힐 수 있다.
한 수정

소유·대여 계약 지도에서 위반을 찾아 하나만 고친다.

  • 기준: 소유/대여 계약
  • 변경: 한 가지
  • 오류 문자열만 따라 여러 곳을 동시에 바꾸지 않는다.
재검사 비교

같은 명령의 진단을 이전 근거와 비교한다.

  • 명령: 이전과 동일
  • 산출물: 남은 진단/통과 근거
  • 같은 조건에서 달라진 증거가 수정 효과를 보여 준다.

진단부터 다시 실행까지의 Rust 학습 루프

주 진단→소유/대여 계약 지도→수정 하나→같은 명령→증거 비교의 반복 작업 상태가 명시적이다.

기준 명령 실행, 한 번의 수정, 주 진단 읽기, 계약 지도 작성, 의도 보존 수정, 같은 명령 재실행의 여섯 역이 증거 기록 허브를 갱신하는 Rust 학습 루프

Rust · diagnostic-first · evidence loop

진단을 먼저 읽고 같은 명령으로 증거를 누적한다

한 번에 하나만 바꾸고 주 진단·스팬·라벨을 먼저 읽습니다. 소유권 오류에는 보편 처방이 없으며 의도한 소유권과 API 계약을 보존하는 가장 작은 수정을 선택합니다.

여섯 단계의 순환과 별도의 근거 기록원desktop과같이6단계가순환한다.결과진단→계약지도→수정선택→한번수정→동일명령실행→비교→결과진단이다.각단계에서중앙기록으로점선방향을가지며증거허브가별도의실행단계가아니다.결과·진단 읽기주 메시지 · 위치primary span계약 지도owner · moveborrow수정 하나 선택borrow · orderdesign한 번만 수정one small diff같은 명령 실행check · test · run증거 비교before · after증거 기록명령 · 변경 · 진단이전과 이후의 근거실선: 다시 첫 단계로 순환점선: 각 단계에서 근거 누적
여섯 학습 역과 하나의 증거 기록 허브 기준 명령의 결과와 주 진단을 읽고 계약을 지도화한다. 수정 하나를 선택해 한 번만 적용하고 같은 명령을 재실행한 뒤 이전 증거와 비교해 첫 단계로 돌아간다. 각 단계는 명령, 차이, 진단, 규칙을 중앙 기록에 누적한다. 결과·주 진단 읽기commandprimary span계약 지도 그리기owner · moveborrow수정 하나 선택borrow · orderdesign한 번만 수정one small diff같은 명령 재실행check · test · run증거 비교before · after증거 기록command · diffdiagnostic · rule
증거 기록command · diff · diagnostic · rule
  1. 결과와 주 진단 읽기

    기준 명령을 실행한 뒤 주 메시지, 첫 스팬, 라벨, 도움말을 순서대로 확인합니다.

  2. 계약 지도 그리기

    소유자, 이동 지점, 빌림 수명, 가변성, unsafe 전제조건을 표시합니다.

  3. 수정 하나 선택

    빌리기, 순서 변경, 소유권 반환, 구조 재설계 중 의도에 맞는 수정을 고릅니다.

  4. 한 번만 수정

    선택한 변경 하나만 적용해 원인과 결과를 연결합니다.

  5. 같은 명령 재실행

    같은 명령으로 새 결과를 얻어 비교할 기준을 유지합니다.

  6. 증거 비교

    명령, 차이, 진단, 규칙의 전후를 기록하고 첫 단계로 돌아갑니다.

Safe Rust

안전 연산과 명시적 비용

건전한 내부 구현을 전제로 Safe Rust는 메모리 안전 규칙을 강제합니다. 소유권과 RAII는 추적 가비지 컬렉터에 의존하지 않고 자원 수명을 관리합니다.

unsafe · FFI

증명 책임이 작성자에게 이동

unsafe는 검사를 끄지 않습니다. Rust 2024의 unsafe extern은 ABI, 시그니처, 외부 전제조건의 책임을 드러냅니다. 안전 항목도 선언 정확성은 작성자가 보장합니다.

borrow diagnostic

보편 처방 대신 의도 확인

빌리기, 재배치, 소유권 반환, 데이터 구조 재설계, clone 중 무엇이 맞는지는 의도한 계약에 달려 있습니다. 진단만으로 고정된 해법을 만들지 않습니다.

  • 시계 방향 반복
  • 증거 기록 갱신
  • 진단 우선 확인

컴파일 오류는 실패 판정이 아니라 이 코드의 계약을 좁히는 증거입니다. 첫 진단에서 출발하고 같은 명령으로 비교하는 루프는 CLI, 서버, 저수준, 임베디드 코드에도 같은 기준으로 확장됩니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.

관계도의 보충 설명

원 도표의 제목·노드·관계·조건·주석
범위원문
관계·조건 설명원 데스크톱 도표처럼 6단계가 순환한다. 결과 진단→계약 지도→수정 선택→한 번 수정→동일 명령 실행→비교→결과 진단이다. 각 단계에서 중앙 기록으로 점선이 이어지며 증거 허브는 별도의 실행 단계가 아니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
주 진단 기록

같은 검사 명령에서 첫 관련 오류를 잡는다.

  • 입력: 현재 소스
  • 근거: 주 진단·위치
  • 먼저 재현된 오류를 계약과 연결해야 수정 대상을 좁힐 수 있다.
한 수정

소유·대여 계약 지도에서 위반을 찾아 하나만 고친다.

  • 기준: 소유/대여 계약
  • 변경: 한 가지
  • 오류 문자열만 따라 여러 곳을 동시에 바꾸지 않는다.
재검사 비교

같은 명령의 진단을 이전 근거와 비교한다.

  • 명령: 이전과 동일
  • 산출물: 남은 진단/통과 근거
  • 같은 조건에서 달라진 증거가 수정 효과를 보여 준다.

cargo check나 cargo run의 결과와 첫 진단을 읽고, 소유와 대여의 관계를 정리한 뒤, 고칠 방법을 하나만 골라 적용합니다. 그리고 같은 명령을 다시 실행해 바꾸기 전과 후의 결과를 비교합니다. 무엇을 바꿨을 때 무엇이 달라졌는지 적어 두면, 같은 규칙을 다시 만났을 때 빨리 알아볼 수 있습니다.

정리

  • 이 교재는 공식 Book의 순서를 따르며, stable 러스트 1.99.1과 2024 에디션을 기준으로 합니다.
  • 본문의 출력과 오류 메시지는 공식 문서로 확인한 것이고, 실행마다 달라지는 값은 무엇이 달라지는지만 적었습니다.
  • 설치 문제는 1장의 설치 글, 개념은 공식 Book, 에디션은 부록 E와 Edition Guide, unsafe extern 같은 외부 함수 선언은 18장의 안전하지 않은 러스트와 Reference에서 찾습니다.
  • 안전한 러스트는 메모리 안전성 오류와 데이터 경쟁을 컴파일할 때 막지만, 논리 오류와 교착 상태, 패닉은 막지 못합니다.
  • 오류 메시지는 첫 오류부터, 오류 코드와 위치, 도움말 순서로 읽습니다.
  • 예제를 바꿀 때는 한 번에 하나만 바꾸고 같은 명령으로 다시 확인합니다.

연습 문제

1. 어디를 볼까

다음 세 상황에서 먼저 찾아볼 자료를 고르세요. (가) 터미널에서 cargo를 찾을 수 없다고 나온다. (나) 함수에 넘긴 String을 다시 쓰려 하니 컴파일러가 거부한다. (다) 다른 사람의 프로젝트에서 edition = "2021"이라고 적힌 크레이트를 보았다.

해설 보기

(가)는 명령을 찾는 설치 환경의 문제이므로 러스트 설치에서 PATH와 설치 상태를 확인합니다. (나)는 소유권 개념의 문제이므로 소유권이 뭔가요?와 공식 Book의 해당 장을 봅니다. (다)는 에디션의 문제이므로 부록 E 에디션과 Edition Guide를 확인하며, 에디션은 크레이트마다 고르므로 2024 에디션 크레이트와 함께 쓸 수 있습니다.

2. 컴파일되면 끝일까

안전한 러스트로만 쓴 프로그램이 경고 없이 컴파일되었습니다. 이 프로그램에 남아 있을 수 있는 오류를 두 가지 들어 보세요.

해설 보기

계산 결과가 의도와 다른 논리 오류와, 두 스레드가 서로의 잠금을 기다리는 교착 상태가 남아 있을 수 있습니다. 벡터의 범위를 벗어난 인덱스처럼 실행 중에 패닉이 나는 오류도 컴파일 단계에서는 잡히지 않습니다. 컴파일러가 막는 것은 메모리 안전성 오류와 데이터 경쟁이므로, 동작은 테스트와 실행으로 따로 확인해야 합니다.

다음 글 소개에서는 러스트가 어떤 사람과 작업에 잘 맞는지, 이 교재를 어떤 순서로 읽으면 좋은지 살펴봅니다.