Rust를 처음 접할 때, 문법이 낯설게 느껴질 수 있어요.
그럴 땐 직접 동작하는 작은 프로그램을 따라 만들어보는 게 이해에 큰 도움이 되죠.
이번에는 "숫자 맞히기 게임" 을 만들면서, 다음과 같은 핵심 개념들을 차근히 배워볼 거예요.
- let 키워드로 변수 선언하기
- match로 값 분기 처리하기
- 메서드와 연관 함수
- 외부 크레이트 사용하기 (예: rand)
1️⃣ 시작은 use로
use std::io;
use rand::Rng;
use std::cmp::Ordering;
- std::io는 사용자 입력을 받을 때 사용돼요.
- rand::Rng는 난수 생성기 trait입니다. 외부 크레이트를 사용할 땐 이렇게 use로 필요한 기능을 불러와요.
- Ordering은 값 비교 결과를 나타내는 열거형(enum)이고, 나중에 match와 함께 등장해요.
📦 참고: rand는 표준 라이브러리가 아니라 외부 크레이트입니다.
Cargo.toml에 다음과 같이 추가해줘야 해요:[dependencies] rand = "0.8"
여기서 크레이트(crate)란?
크레이트는 Rust 코드의 패키지이자, 컴파일의 단위입니다.
조금 더 풀어 말하면:
- 크레이트는 라이브러리 또는 실행 가능한 프로그램(바이너리) 중 하나입니다.
- 크레이트 하나는 Cargo.toml 파일을 기준으로 구성돼요.
- 우리가 작성한 Rust 코드도 크레이트고, 다른 사람이 만든 외부 라이브러리도 크레이트예요.
2️⃣ main 함수로 프로그램 시작!
fn main() {
println!("숫자를 맞혀봅시다!");
let x = 5;
let y = 10;
println!("x = {}, y = {}", x, y);
}
- Rust의 프로그램은 fn main()부터 시작돼요.
- println!은 매크로로, 문자열을 출력할 때 사용합니다. 느낌표(!)가 붙는 이유는 나중에 배워요!
- {}는 **값을 출력할 자리를 지정하는 자리 지정자(placeholder)**이며, 뒤에 오는 변수들이 순서대로 채워져 출력됩니다.
3️⃣ let으로 변수 선언, gen_range로 난수 생성
let secret_number = rand::thread_rng().gen_range(1, 101);
- let은 변수를 선언할 때 쓰는 키워드예요.
- 여기서 rand::thread_rng()는 현재 스레드에 연결된 난수 생성기를 반환하는 연관 함수이고,
그 뒤에 .gen_range(1, 101) 메서드를 호출해 1부터 100까지의 난수를 생성해요.
❓ 연관 함수 vs 메서드
- rand::thread_rng()처럼 타입에 직접 붙는 함수 → 연관 함수
- .gen_range()처럼 값에 붙는 함수 → 메서드
4️⃣ loop와 사용자 입력 받기
loop {
println!("정답이라고 생각하는 숫자를 입력하세요.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("입력한 값을 읽지 못했습니다.");
...
}
- loop는 무한 루프입니다. 사용자가 정답을 맞힐 때까지 반복할 거예요.
- String::new()는 빈 문자열을 만드는 연관 함수.
- io::stdin().read_line(...)으로 사용자 입력을 받습니다.
- .expect(...)는 에러가 발생했을 때 프로그램을 멈추고 메시지를 출력하게 해요.
5️⃣ match로 입력값 처리
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
- guess.trim().parse()는 입력받은 문자열을 숫자로 바꾸는 과정이에요.
- 숫자로 바꿀 수 없는 경우도 있어서 Result 타입으로 반환되는데, 이걸 match로 처리해요.
✅ match는 어떤 값에 따라 흐름을 분기할 때 사용하는 Rust의 강력한 문법입니다.
6️⃣ match + Ordering으로 정답 판별
match guess.cmp(&secret_number) {
Ordering::Less => println!("입력한 값이 더 작습니다."),
Ordering::Greater => println!("입력한 값이 더 큽니다."),
Ordering::Equal => {
println!("정답입니다!");
break;
}
}
- guess.cmp(&secret_number)는 두 숫자를 비교해서 Ordering (Less, Greater, Equal)을 반환합니다.
- 이를 다시 match로 분기해서, 결과에 따라 다른 메시지를 출력하죠.
- 정답일 경우엔 break로 반복문을 종료해요.
- 용어 정리: 프렐류드(Prelude)란?
**프렐류드(prelude)**는 Rust가 자동으로 use 해주는 표준 라이브러리의 기본 기능 모음이에요.
즉, 우리가 따로 use하지 않아도 자동으로 사용할 수 있게 가져다 놓은 것들입니다.
예를 들어, 아래 코드를 보세요:
fn main() {
let s = String::from("hello");
println!("{}", s);
}
여기서 우리는 String, println!, Option, Result 같은 것들을 use로 가져오지 않았죠?
그런데도 오류 없이 잘 동작해요. 왜일까요?
👉 바로 Rust 프렐류드에 포함되어 있어서 자동으로 임포트되었기 때문이에요!
✨ 마무리하며
이 간단한 숫자 맞히기 프로그램을 통해,
Rust의 기본 문법과 구조들을 자연스럽게 익힐 수 있어요:
변수 선언 | let secret_number = ... |
외부 크레이트 사용 | use rand::Rng; |
메서드 & 연관 함수 | .gen_range(), String::new() |
사용자 입력 | io::stdin().read_line() |
값 분기 | match |
반복 | loop |
Rust를 처음 접한다면, 이런 예제 하나씩 따라 만들면서 몸에 익히는 게 가장 좋아요.
'개발 이야기 > [스터디] Rust' 카테고리의 다른 글
[러스트 프로그래밍 공식 가이드] Chapter 6. 열거자와 패턴 매칭 (0) | 2025.06.27 |
---|---|
[러스트 프로그래밍 공식 가이드] Chapter 5. 구조체를 활용한 관련 데이터의 구조화 (1) | 2025.06.26 |
[러스트 프로그래밍 공식 가이드] Chapter 4. 소유권 (1) | 2025.06.25 |
[러스트 프로그래밍 공식 가이드] Chapter 3. 일반 프로그래밍 개념 (1) | 2025.06.24 |
[러스트 프로그래밍 공식 가이드] Chapter 1. 시작하기 (1) | 2025.06.17 |