1장은 Rust 문법이라기보다 "환경을 깔고 첫 프로그램을 돌리는 법 + 기본 도구" 에 대한 내용입니다. 다른 언어를 해봤다면 대부분 익숙한 흐름이라, Rust에서 무엇이 다른지만 짚고 넘어가겠습니다.
rustuprustup(러스트업)은 Rust 버전과 관련 도구를 관리하는 명령줄 도구입니다. Rust를 직접 받는 게 아니라, rustup을 통해 컴파일러·도구 묶음을 설치하고 업데이트한다고 보면 됩니다.
링커(linker) 는 컴파일된 결과 조각들을 하나의 실행 파일로 합쳐주는 프로그램입니다. 보통 이미 깔려 있지만, 링커 에러가 나면 C 컴파일러(GCC/Clang, macOS는
xcode-select --install)를 설치하면 대개 해결됩니다.
설치가 끝나면 버전을 찍어 확인합니다.
rustc --version
# rustc 1.xx.x (해시 날짜) ← 이렇게 나오면 성공
버전·업데이트·삭제 명령도 간단합니다.
rustup update # 최신 안정 버전으로 갱신
rustup self uninstall # Rust와 rustup 제거
rustup doc # 오프라인 공식 문서를 브라우저로 열기
main.rs 파일을 만들고 다음을 적습니다. (Rust 소스 파일 확장자는 .rs이고, 파일명에 단어가 여러 개면 hello_world.rs처럼 밑줄로 잇는 게 관례입니다.)
fn main() {
println!("Hello, world!");
}
기호 하나씩 풀어보겠습니다.
fn : 함수를 정의하는 키워드입니다.main : 프로그램이 가장 먼저 실행하는 특별한 함수입니다. 진입점(entry point)이라고 부릅니다.() : 매개변수 자리입니다. 여기선 받는 값이 없어 비어 있습니다.{ } : 함수 본문을 감싸는 중괄호입니다. Rust는 모든 함수 본문에 중괄호를 요구합니다.println! : 텍스트를 화면에 출력합니다. 끝의 !가 핵심 포인트인데, 이건 함수가 아니라 매크로(macro) 호출이라는 표시입니다. (매크로 = 코드를 생성하는 코드. 자세한 건 뒷장에서 다룹니다.); : 문장이 끝났다는 표시입니다. Rust 코드 대부분은 세미콜론으로 끝납니다.컴파일하고 실행해봅니다.
rustc main.rs # 컴파일 → 실행 파일 생성
./main # 실행 (Windows는 .\main)
# Hello, world!
Python·JavaScript·Ruby처럼 "실행하면 그 자리에서 돌아가는" 언어와 달리, Rust는 AOT(ahead-of-time, 미리) 컴파일 언어입니다. 즉 컴파일과 실행이 별개 단계입니다.
장점은, 한 번 컴파일해서 만든 실행 파일을 건네주면 상대방은 Rust가 안 깔려 있어도 그대로 실행할 수 있다는 점입니다. (.py 파일을 주면 상대도 Python이 있어야 하는 것과 대비됩니다.) 대신 실행 전 컴파일 단계가 필요하다는 트레이드오프가 있습니다.
rustc로 단일 파일을 돌리는 건 학습용으로는 충분하지만, 프로젝트가 커지면 의존성(다른 라이브러리)·빌드 옵션·공유를 손으로 관리하기 번거롭습니다. 그래서 대부분의 Rustacean(러스트 사용자들의 자칭 별명)은 Cargo를 씁니다. Cargo는 빌드 시스템이자 패키지 매니저입니다.
cargo --version # 설치 확인 (공식 설치 시 같이 깔림)
cargo new hello_cargo # 새 프로젝트 생성
cd hello_cargo
cargo new가 만들어주는 구조는 이렇습니다.
hello_cargo/
├── Cargo.toml # 프로젝트 설정 파일
├── .gitignore
└── src/
└── main.rs # 소스 코드는 여기에
추가로 Git 저장소도 자동 초기화됩니다. (이미 Git 저장소 안이면 안 합니다. --vcs 플래그로 조정 가능.) 소스 코드는 src/ 안에, 최상위 폴더는 설정·README·라이선스 같은 코드 외의 것을 두는 자리입니다.
Cargo.toml 내용을 봅니다.
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2024"
[dependencies]
[package] : 패키지 설정 구역입니다.edition : Rust의 에디션(2015/2018/2021/2024). 언어 관용 표기·기능의 기준 버전 묶음이라고 보면 됩니다. 새 프로젝트는 보통 최신(2024)입니다.[dependencies] : 의존성을 적는 구역입니다. Rust에서 코드 패키지 단위를 crate(크레이트) 라고 부르며, 외부 crate가 필요하면 여기에 적습니다. (이 프로젝트는 아직 의존성이 없습니다.)Cargo 명령은 OS와 무관하게 동일합니다.
cargo build # 빌드 → target/debug/ 에 실행 파일
cargo run # 빌드 + 실행을 한 번에 (가장 자주 씀)
cargo check # 컴파일되는지만 검사 (실행 파일은 안 만듦 → 빠름)
cargo build --release # 최적화 빌드 → target/release/
cargo build를 처음 돌리면 Cargo.lock 파일이 생깁니다. 의존성의 정확한 버전을 기록하는 파일인데, 직접 수정할 일은 없고 Cargo가 알아서 관리합니다.
rustc vs cargo — rustc는 단일 파일을 직접 컴파일하는 저수준 명령입니다. 실무에서는 거의 항상 cargo를 씁니다. 이 책(과 이 시리즈)도 이후로는 Cargo 기준으로 갑니다.println!의 ! — 오타가 아닙니다. !가 붙으면 함수가 아니라 매크로입니다. 지금은 "출력은 매크로다" 정도만 기억하면 됩니다.--release로 빌드해야 합니다.cargo check vs cargo build — check는 실행 파일을 만들지 않고 "컴파일 되는지"만 확인하므로 훨씬 빠릅니다. 코딩 중 수시로 check, 실제로 돌려볼 때 build/run을 쓰는 흐름이 흔합니다.target/debug/ (또는 target/release/) 안에 생깁니다.| 형태 | 의미 | 한 줄 예 |
|---|---|---|
fn name() { } | 함수 정의 | fn main() { } |
name!( ... ) | 매크로 호출 (! = 매크로) | println!("hi"); |
"..." | 문자열 리터럴 | "Hello, world!" |
; | 문장(식) 종료 | println!("x"); |
{ } | 코드 블록 / 함수 본문 | fn main() { ... } |
| Cargo 명령 | 하는 일 |
|---|---|
cargo new 이름 | 새 프로젝트 생성 |
cargo build | 빌드 (→ target/debug) |
cargo run | 빌드 + 실행 |
cargo check | 컴파일 검사만 (빠름) |
cargo build --release | 최적화 빌드 (→ target/release) |
한 줄 요약: Rust는
rustup으로 설치하고cargo로 프로젝트를 만들고 빌드·실행하며, 첫 프로그램의 핵심은 진입점fn main과 출력 매크로println!입니다.
The Rust Programming language (3rd) - Steve Klabnik & Carol Nichols & Chris Krycho. Chapter 1: GETTING STARTED