๐ ์ถ๋ฆฌ ๊ฒ์
RUST๋ก ๊ณ ์ ์ ์ธ ์ ๋ฌธ์์ฉ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ธ ์ถ๋ฆฌ ๊ฒ์์ ๊ตฌํํด๋ณด์.
ํ๋ก์ ํธ ์ค๋ช
- ์ด ํ๋ก๊ทธ๋จ์ 1~100 ์ฌ์ด์ ์์์ ์ ์๋ฅผ ์์ฑํจ
- ๋ค์์ผ๋ก ํ๋ ์ด์ด๊ฐ ํ๋ก๊ทธ๋จ์ ์ถ๋ฆฌํ ์ ์๋ฅผ ์ ๋ ฅํจ
- ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ๋ฐ์ ์ถ๋ฆฌ๊ฐ์ด ์ ๋ต๋ณด๋ค ๋๊ฑฐ๋ ๋ฎ์์ง๋ฅผ ์๋ ค์ค
- ์ถ๋ฆฌ๊ฐ์ด ์ ๋ต์ด๋ผ๋ฉด ์ถํ ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ข ๋ฃํจ
๐ ์๋ก์ด ํ๋ก์ ํธ ์์ฑํ๊ธฐ
์ฒซ ๋ช
๋ น์ด์ --bin
ํ๋๊ทธ๋ ๋ฐ์ด๋๋ฆฌ์ฉ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ํ๋๊ทธ์ด๋ค.
cargo new guessing_game --bin
cd guessing_game
code .

๐ ์ฝ๋ ์์ฑํ๊ธฐ
์ซ์ ์ ๋ ฅ ๋ฐ๊ธฐ
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
๋ฌ์คํธ์์ ์ฌ์ฉ์ ์ ์ถ๋ ฅ์ ์ํด์๋ io ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์ฝํ๋ก ๊ฐ์ ธ์์ผ ํ๋ค.
use std::io;
::
๋ ๊ฒฝ๋ก ์ฐ์ฐ์๋ก ๋ถ๋ฆฌ๋ฉฐ, ๋ชจ๋, ํธ๋ ์ดํธ, ์ด๊ฑฐํ ๋ฐ ํจ์ ๋ฑ์ ์ฐธ์กฐํ๊ฑฐ๋ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ค.
println!("Guess the number!");
println!("Please input your guess.");
println!
์ ๋ฌธ์๋ฅผ ํ๋ฉด์ ํ์ํ๋ ๋งคํฌ๋ก์ด๋ค.
๋ฌ์คํธ์์ ๋ณ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ด๋ค.
๋ฐ๋ผ์ ๊ฐ๋ณ๋ณ์๋ก ์ ์ธํ๊ธฐ ์ํด์๋ mut
์ด๋ผ๊ณ ์ง์ ํด์ผ ํ๋ค.
let mut guess = String::new();
์ ์ฝ๋์์๋ ์๋ก์ด String ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ ๊ฐ๋ณ๋ณ์๋ฅผ ์ ์ธํ๋ค.
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
read_line
์ &mut guess
๋ฅผ ์ธ์๋ก ๋๊ธด๋ค.
๋ณ์ guess
๊ฐ ๊ฐ๋ณ ๋ณ์์ด์ด์ผ ํ๋ ์ด์ ๋ ์
๋ ฅํ ๊ฐ์ ๋ฌธ์์ด์ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
read_line
์ ๋ฐํ ๊ฐ์ io::Result
์ด๋ค.
io::Result
๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ๋ณด๋ฅผ ํํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋๋ฐ, ์ด๋ฅผ ์ํ variants๋ Err
์ Ok
๊ฐ ์๋ค.
io::Result
์ธ์คํด์ค๋ expect
๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , io::Result
์ธ์คํด์ค์ variants์ ๋ฐ๋ผ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋ฐ๋ผ์ ์ ์ฝ๋์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด โFailed to read lineโ์ ์ถ๋ ฅํ๋ ๊ฒ์ ์ ์ ์๋ค.
println!("You guessed: {}", guess);
println!
๋ณ๊ฒฝ์(placeholder)๋ฅผ ์ด์ฉํด ๊ฐ์ ์ถ๋ ฅํ๋ค.
{}
์์น์ guess์ ๊ฐ์ด ํ์๋๋ค.
์ฌ๊ธฐ๊น์ง ์์ฑํ ์ฝ๋๋ฅผ ์คํํด๋ณด์!

๋ด๊ฐ ์ ๋ ฅํ ์ซ์ 3์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ถ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ๊ธฐ
1. rand ํฌ๋ ์ดํธ ์ถ๊ฐํ๊ธฐ
๋ฌ์คํธ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค ๊ฐ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ด ์์ผ๋ฏ๋ก rand ํฌ๋ ์ดํธ๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
์ด ๋, ํฌ๋ ์ดํธ๋ ๋ฌ์คํธ ์ฝ๋์ ๋ฌถ์(package)์ด๋ค.
๋จผ์ , Cargo.toml
ํ์ผ์ ์์ ํด rand
ํฌ๋ ์ดํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
[dependencies]
rand = "0.3.14"

์ดํ, build๋ฅผ ํ๊ฒ ๋๋ฉด ์ธ๋ถ ์์กด์ฑ์ ๊ฐ์ง๊ฒ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

Cargo.toml
์๋ rand
๋ง ์ถ๊ฐํ์ง๋ง, rand
๋ libc
์ ์์กดํ๊ธฐ ๋๋ฌธ์ libc
๋ ํจ๊ป ๋ค์ด ๋ฐ์์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ Cargo๊ฐ ์์กด์ฑ ๊ด๋ฆฌ์ ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
2. ์์ ์ซ์(์ ๋ต) ์์ฑํ๊ธฐ
extern crate rand;
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
๋งจ ์ฒซ ๋ฒ์งธ ์ค์ extern crate rand;
๋ฅผ ์ถ๊ฐํด ์ธ๋ถ์ ์์กดํ๋ ํฌ๋ ์ดํธ๊ฐ ์์์ ์๋ฆฐ๋ค.
๋ค์, use rand::Rng;
๋ฅผ ์ถ๊ฐํด ์์์ ์ซ์๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ค.
์ค๊ฐ์ ์ถ๊ฐ๋ ์ฝ๋์ธ ๋ค์ ์ฝ๋๋ ์์ ์ ์๋ฅผ ์์ฑํ๋ ์ฝ๋์ด๋ค.
rand::thread_rng
ํจ์๋ OS๊ฐ ์๋(seed)๋ฅผ ์ ํ๊ณ ํ์ฌ ์ค๋ ๋์์๋ง ์ฌ์ฉ๋๋ ํน๋ณํ ์ ์์์ฑ๊ธฐ๋ฅผ ๋๋ ค ์ค๋ค.gen_range()
๋ฉ์๋๋ฅผ ํตํด 1๊ณผ 100 ์ฌ์ด์ ์ซ์๋ฅผ ์์ฑํด secret_number
์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
let secret_number = rand::thread_rng().gen_range(1, 101);
์ด์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ค์์ฒ๋ผ ์์์ ์ซ์๊ฐ ์ ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์๋ค

3. ์ ๋ต๊ณผ ์ถ๋ฆฌ๊ฐ ๋น๊ตํ๊ธฐ
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
use std:cmp::Ordering
์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ๋น๊ตํ๋ cmp
๋ชจ๋์ Ordering
์ด๊ฑฐํ์ ๊ฐ์ ธ์ค๋ ์ฝ๋์ด๋ค.
Ordering
์ ๊ฐ์ Less
, Greater
, Equal
์ด๋ค.
์ด๋ฅผ ์ด์ฉํด ๋งจ ๋ง์ง๋ง์ Ordering
ํ์
์ ์ด์ฉํด ๋น๊ต๋ฅผ ์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด ๋ match
ํํ์์ด ์ฌ์ฉ๋๋๋ฐ, match
๋ ์ฃผ์ด์ง ๊ฐ์ด ํจํด๊ณผ ์ผ์นํ๋ฉด ์ฝ๋๋ฅผ ์คํํ๋๋ก ํ๋ค.
์ค๊ฐ์ ์ถ๊ฐ๋ ๋ค์์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
๋จผ์ , ๋ฌ์คํธ์์๋ ๋ฌธ์์ด๊ณผ ์ ์ํ์ ๋น๊ตํ ์ ์๋ค.
๋ฐ๋ผ์, ์์ ๋ฌธ์์ด ํ์์ผ๋ก ์
๋ ฅ ๋ฐ์๋ guess
๋ฅผ ์ ์ํ์ผ๋ก ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ค.
trim
๋ฉ์๋๋ฅผ ํตํด ๋ฌธ์์ด์ ์
๋ ฅํ๋ฉฐ ๋ถ์ ๊ฐํ๋ฌธ์(\n)๋ฅผ ์ ๊ฑฐํด์ค๋ค.
parse
๋ฉ์๋๋ ํตํด ๋ฌธ์์ด์ ์ซ์ํ์ผ๋ก ํ์ฑํ๋ค.
์ด ๋ฉ์๋๋ ๋ค์ํ ์ข
๋ฅ์ ์ ์ํ์ ๋ณํํ๋ฏ๋ก let guess: u32
์ฒ๋ผ ์ ํํ ํ์
์ ๋ช
์ํด์ผ ํ๋ค.
parse
๋ฉ์๋๋ Result
ํ์
์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๊ฒ ๋๋๋ฐ, ๋ง์ฝ ๋ฌธ์์ด์ด ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ฉด ์ ์๋ก ๋ณํํ ์ ์๊ธฐ ๋๋ฌธ์ Err
๋ฅผ ๋ฐํํ๋ฉฐ expect
์ ์์ฑํ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
์ด์ ์คํ์ ํด๋ณด์!

์ฌ๋ฌ ์ ๋ ฅ ๊ฐ์ ํตํด ์ง๊ธ๊น์ง ์์ฑํ ์ฝ๋๊ฐ ์ ์๋ํ๋์ง ๊ฒ์ฆํ๋ค!
๋ฐ๋ณต๋ฌธ์ ํตํ ์ฌ๋ฌ ๋ฒ์ ์ถ๋ฆฌ ํ์ฉ
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
๋ฌดํ ๋ฐ๋ณต์ ์ ๊ณตํ๋ loop
ํค์๋๋ฅผ ํตํด ์ฌ๋ฌ ๋ฒ์ ์ซ์๋ฅผ ์
๋ ฅํ ์ ์๋๋ก ํ๋ค.
๋ํ, ๋น๊ตํ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ break
๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ค.
์๋ชป๋ ์ ๋ ฅ๊ฐ ์ฒ๋ฆฌํ๊ธฐ
์ซ์๊ฐ ์๋ ๊ฐ์ด ์ ๋ ฅ๋๋ฉด ๋ฌด์ํ๊ณ , ์ฌ์ฉ์๊ฐ ๋ค์ ์ถ๋ฆฌ๊ฐ์ ์ ๋ ฅํ ์ ์๋๋ก ๊ตฌํํด๋ณด์.
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too Small!"),
Ordering::Greater => println!("Too Big!"),
Ordering::Equal => {
println!("You Win!");
break;
}
}
}
}
์ ๋ ฅ๋ ๊ฐ์ ์ ์๋ก ๋ณํํ๋ ์ฝ๋ ๋ถ๋ถ์ ์์ ํ๋ค.
match
ํํ์์ ํตํด Result
ํ์
์ ๋ํ ํจํด์ ์์ฑํ๋ค.
์ด๋ ์ ์๋ก์ ๋ณํ์ด ์ฑ๊ณตํ๋ฉด parse
๊ฐ ์์ฑํ num
๊ฐ์ ๋๋ ค์ฃผ๊ณ , Err
๋ผ๋ฉด continue
๊ฐ ๋๋๋ก ์ฒ๋ฆฌํ๋ค.
์ด์ , ์ ๋ต ๊ฐ์ด ์ถ๋ ฅ๋๋ ๋ถ๋ถ๋ง ์์ ํ๋ฉด ์ถ๋ฆฌ ๊ฒ์์ด ์์ฑ๋๋ค!
โญ ์ต์ข ์ฝ๋
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too Small!"),
Ordering::Greater => println!("Too Big!"),
Ordering::Equal => {
println!("You Win! The secret nember was {}", secret_number);
break;
}
}
}
}

์ด๋ ๊ฒ ๋ฌ์คํธ์ ๊ฐ๋ ์ ํ์ด๋ณด๊ธฐ ์ํ ๊ฐ๋จํ ์ถ๋ฆฌ๊ฒ์์ ์์ฑํ๋ค!
์ฐธ๊ณ ์๋ฃ
https://rinthel.github.io/rust-lang-book-ko/ch02-00-guessing-game-tutorial.html
์ถ๋ฆฌ ๊ฒ์ ํํ ๋ฆฌ์ผ - The Rust Programming Language
์ด ๋ฌธ์๋ 2ํ ๋ฒ์ญ๋ณธ์ ๋๋ค. ์ต์ 2021 ์๋์ ๋ฌธ์๋ https://doc.rust-kr.org ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ์ค์ต ํ๋ก์ ํธ๋ฅผ ํตํด ๋ฌ์คํธ๋ฅผ ์ฌ์ฉํด ๋ด ์๋ค. ์ด๋ฒ ์ฅ์ ์ค์ ํ๋ก์ ํธ์์ ๋ช๋ช ์ผ๋ฐ์ ์ธ
rinthel.github.io
'Programming Language > RUST' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Rustling] exercises/01_variables/variables1.rs ํ๊ธฐ (1) | 2024.10.11 |
---|---|
Rustling ์์ํ๊ธฐ (3) | 2024.10.11 |
RUST์ ๋ฐ์ดํฐ ํ์ (0) | 2024.10.10 |
Rust์ ๋ณ์ (1) | 2024.10.08 |
Hello, Cargo! (with VS Code) (0) | 2024.10.07 |