์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- ๋ฌ์คํธ ์์
- ์๋ฐ
- OS
- ๋ฐ์ดํฐ ํต์
- Python
- ์ค๋ผํด
- Reversing
- ๋ฌ์คํธ
- ์ด์์ฒด์
- C
- ubuntu
- ๋ฌ์คํธ ํ๋ก๊ทธ๋๋ฐ ๊ณต์ ๊ฐ์ด๋
- ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์ค
- Operating System
- Database
- ์๋ฐ ๊ฐ๋
- ํ์ด์ฌ ์ฑ๋ฆฐ์ง
- data communication
- ์๋ฐ ๊ธฐ์ด
- Python challenge
- ๋ฐฑ์ค ๋ฌ์คํธ
- Rust
- ํ์ด์ฌ
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- java
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฐ๋ถํฌ
- ์ค๋ผํดDB
- ํ์ด์ฌ ์ฒผ๋ฆฐ์ง
Archives
- Today
- Total
IT’s Portfolio
[Rust] Start Rust (Day 13) - Managing Growing Projects with Packages, Crates, and Modules ๋ณธ๋ฌธ
Development Study/Rust
[Rust] Start Rust (Day 13) - Managing Growing Projects with Packages, Crates, and Modules
f1r3_r41n 2023. 2. 14. 18:08728x90
๋ฐ์ํ
๐ฆ Rust Day 13
๐ณ๏ธ Managing Growing Projects with Packages, Crates, and Modules
- ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ์ฝ๋๋ฅผ ์ฌ๋ฌ ๊ฐ์ ํ์ผ๊ณผ ๋ชจ๋๋ก ๋๋์ด ๊ด๋ฆฌํ๋ ํธ์ด ํจ์จ์ ์
- ํจํค์ง๋ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ, ํ์ํ๋ค๋ฉด ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ๋ ์ถ๊ฐํ ์ ์์
- ํจํค์ง์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ผ์ ๋ถ๋ถ์ ๋ค๋ฅธ ํฌ๋ ์ดํธ๋ก ์ฎ๊ฒจ ์ธ๋ถ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํ ์ ์์
- ๊ตฌํ์ ์บก์ํํ๋ฉด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์
Module System
: ๋ฌ์คํธ ์ฝ๋์ ๊ตฌ์กฐ ๊ด๋ฆฌPackage
: ํฌ๋ ์ดํธ๋ฅผ ๋น๋, ํ ์คํธ, ๊ณต์ ํ ์ ์๋ ์นด๊ณ ์ ๊ธฐ๋ฅCrate
: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ ํ์ผ์ ์์ฑํ๋ ๋ชจ๋์ ํธ๋ฆฌ(tree)Module & use
: ์ฝ๋์ ๊ตฌ์กฐ์ ๋ฒ์, ๊ทธ๋ฆฌ๊ณ ๊ฒฝ๋ก์ ์ ๊ทผ์ฑ์ ์ ์ดํ๋ ๊ธฐ๋ฅPath
: ๊ตฌ์กฐ์ฒด, ํจ์, ํน์ ๋ชจ๋ ๋ฑ์ ์ด๋ฆ์ ๊ฒฐ์ ํ๋ ๋ฐฉ์
1๏ธโฃ ํจํค์ง์ ํฌ๋ ์ดํธ
Crate
- ํ๋์ ๋ฐ์ด๋๋ฆฌ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Crate root
๋ ๋ฌ์คํธ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ์ ์์ํด์ ํฌ๋ ์ดํธ์ ๋ฃจํธ ๋ชจ๋์ ๋ง๋ค์ด ๋ด๋ ์์ค ํ์ผ
Package
- ์ผ๋ จ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋, ํน์ ๊ทธ ์ด์์ ํฌ๋ ์ดํธ๋ก ๊ตฌ์ฑ๋จ
- ํจํค์ง๋ ์ด ํฌ๋ ์ดํธ๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์์ ํ๋
Cargo.toml
ํ์ผ์ ๊ฐ์ง
- ํจํค์ง๋ ํ๋ ํน์ ๊ทธ ์ด์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ๋ฅผ ํฌํจํ๊ฑฐ๋ ์์ ํฌํจํ์ง ์์ ์ ์์
- ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ ์ํ๋ ๋งํผ ํฌํจํ ์ ์์ง๋ง, ์ต์ํ ํ๋์ ํฌ๋ ์ดํธ๋ ํฌํจํด์ผ ํจ
- ๐
cargo new project_1
- (1) ์นด๊ณ ๊ฐ
Cargo.toml
ํ์ผ์ ์์ฑํด ํจํค์ง๋ฅผ ๋ง๋ค์ด ๋ - (2)
Cargo.toml
ํ์ผ์๋src/main.rs
ํ์ผ์ ๋ํ ์ธ๊ธ์ด ์์src/main.rs
ํ์ผ์ ํจํค์ง์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ๋ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ์ ํฌ๋ ์ดํธ ๋ฃจํธ์- ์นด๊ณ ๋ ํจํค์ง ๋๋ ํฐ๋ฆฌ์
src/lib.rs
ํ์ผ์ด ์์ผ๋ฉด ์ด ํจํค์ง๋ ํจํค์ง์ ๊ฐ์ ์ด๋ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ๋ฅผ ํฌํจํ๋ค๊ณ ํ๋จํ๋ฉฐ,src/lib.rs
ํ์ผ์ ํฌ๋ ์ดํธ ๋ฃจํธ๋ก ์ธ์ํจ - ์นด๊ณ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋น๋ํ ๋
rustc
์ปดํ์ผ๋ฌ์๊ฒ ํฌ๋ ์ดํธ ๋ฃจํธ ํ์ผ์ ์ ๋ฌํจ
- (3)
project_1
ํจํค์ง์๋src/main.rs
ํ์ผ๋ง ์์project_1
์ด๋ผ๋ ์ด๋ฆ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ฅผ ํฌํจํ๋ค๋ ์๋ฏธ- ๋ง์ฝ
src/main.rs
ํ์ผ๊ณผsrc/lib.rs
ํ์ผ์ ๋ชจ๋ ๊ฐ์ง๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ฅผ ๋ชจ๋ ๊ฐ์ง๋ค๋ ์๋ฏธ์ด๋ฉฐ, ๋ ํฌ๋ ์ดํธ ๋ชจ๋ ์ด๋ฆ์ด ํจํค์ง ์ด๋ฆ๊ณผ ๊ฐ์
- (4) ํจํค์ง์
src/bin
๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ๋ถ์ฐํ์ฌ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๋ฅผ ์ถ๊ฐํ ์ ์์- ์ด๋ ๊ฐ ๋๋ ํฐ๋ฆฌ์ ํ์ผ๋ค์ ๋ณ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ๊ฐ ๋จ
- (1) ์นด๊ณ ๊ฐ
- ํฌ๋ ์ดํธ๋ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ํ๋์ ๋ฒ์๋ก ๊ทธ๋ฃนํํ๋ฏ๋ก ํด๋น ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๊ณต์ ํ๊ธฐ ์์ํด์ง
- ํฌ๋ ์ดํธ์ ๊ธฐ๋ฅ์ ํด๋น ํฌ๋ ์ดํธ์ ๋ฒ์ ์์์ ๊ตฌํํ๋ฉด ํน์ ๊ธฐ๋ฅ์ด ์์ฑ ์ค์ธ ํฌ๋ ์ดํธ์ ์ ์๋ ๊ฒ์ธ์ง, ์๋๋ฉด ์ถ๊ฐํ ํฌ๋ ์ดํธ์ ์ ์๋ ๊ฒ์ธ์ง ๋ช
ํํ ๊ตฌ๋ถํ ์ ์์
- (Ex)
Rng
: ์์ฑ ์ค์ธ ํฌ๋ ์ดํธ์์ ์ ์ํ ๊ตฌ์กฐ์ฒดrand::Rng
:rand
ํฌ๋ ์ดํธ์Rng
ํธ๋ ์ดํธ
- (Ex)
2๏ธโฃ ๋ชจ๋์ ์ด์ฉํ ๋ฒ์์ ์ ๊ทผ์ฑ ์ ์ด
Path
: ์์ดํ ์ ์ด๋ฆ์ ๊ฒฐ์ use
keyword :Path
๋ฅผ ๋ฒ์ ์์ผ๋ก ๊ฐ์ ธ์ดpub
keyword : ์์ดํ ์ ์ธ๋ถ์ ๊ณต๊ฐํจModule
- ํฌ๋ ์ดํธ์ ์ฝ๋๋ฅผ ๊ทธ๋ฃนํํด์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์ํ๋ ๋ฐฉ๋ฒ
- ์์ดํ
์
์ ๊ทผ์ฑ(privacy)
๊ฒฐ์
// src/lib.rs
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
fn seat_at_table() {}
}
mod serving {
fn take_order() {}
fn serve_order() {}
fn take_payment() {}
}
}
- ๋ ์คํ ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ๋จํ ๋ฐ์ด๋๋ฆฌ ํฌ๋ ์ดํธ ์์
src/lib.rs
ํ์ผ์ ๋ชจ๋๊ณผ ํจ์ ์๊ทธ๋์ฒ ์ ์mod
keyword๋ก ๋ชจ๋ ์ ์- ๋ชจ๋์๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐ์, ์์, ํธ๋ ์ดํธ, ํจ์ ๋ฑ์ ์ถ๊ฐํ ์ ์์
- ๋ชจ๋์ ์ด์ฉํ๋ฉด ๊ด๋ จ๋ ์ ์๋ค์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ์ ์ ํ ์ด๋ฆ์ ๋ถ์ฌํ ์ ์์
crate
โโโ front_of_house
โโโ hosting
โ โโโ add_to_waitlist
โ โโโ seat_at_table
โโโ serving
โโโ take_order
โโโ serve_order
โโโ take_payment
๋ชจ๋ ํธ๋ฆฌ(module tree)
- ์ปดํจํฐ ํ์ผ ์์คํ ์ ๋๋ ํฐ๋ฆฌ ํธ๋ฆฌ์ ์ ์ฌํจ
3๏ธโฃ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํด ๋ชจ๋ ํธ๋ฆฌ์ ์์ดํ ์ฐธ์กฐํ๊ธฐ
์ ๋ ๊ฒฝ๋ก(absolute path)
: ํฌ๋ ์ดํธ ์ด๋ฆ์ด๋crate
๋ฆฌํฐ๋ด์ ์ด์ฉํด ํฌ๋ ์ดํธ ๋ฃจํธ๋ถํฐ ์์ํ๋ ๊ฒฝ๋ก์๋ ๊ฒฝ๋ก(relative path)
: ํ์ฌ ๋ชจ๋๋ก๋ถํฐ ์์ํ๋ฉฐ,self
,super
ํน์ ํ์ฌ ๋ชจ๋์ ์๋ณ์๋ฅผ ์ด์ฉํจ- ์ ๋ ๋ฐ ์๋ ๊ฒฝ๋ก๋ ํ๋ ํน์ ๊ทธ ์ด์์ ์๋ณ์๋ก ๊ตฌ์ฑ๋๋ฉฐ ๊ฐ ์๋ณ์๋
์ด์ค ์ฝ๋ก (::)
์ผ๋ก ๊ตฌ๋ถํจ
// src/lib.rs
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// ์ ๋ ๊ฒฝ๋ก
crate::front_of_house::hosting::add_to_waitlist();
// ์๋ ๊ฒฝ๋ก
front_of_house::hosting::add_to_waitlist();
}
add_to_waitlist
ํจ์๋eat_at_restaurant
ํจ์์ ๊ฐ์ ํฌ๋ ์ดํธ์ ์ ์๋์ด ์์ผ๋ฏ๋ก ์ ๋ ๊ฒฝ๋ก๋ฅผcrate
keyword๋ก ์์ํ ์ ์์- ๋ชจ๋ ํธ๋ฆฌ์์
eat_at_restaurant
ํจ์๊ฐ ์ ์๋ ๋ชจ๋๊ณผ ๊ฐ์ ์์ค์ ๋ชจ๋์ธfront_of_house
๋ถํฐ ์๋ ๊ฒฝ๋ก ์์ - ์ ๋ ๊ฒฝ๋ก์ ์๋ ๊ฒฝ๋ก ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ '์์ดํ ์ ์ ์ํ๋ ์ฝ๋๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํ ๊ฒ์ธ์ง, ์๋๋ฉด ํจ๊ป ๊ด๋ฆฌํ ๊ฒ์ธ์ง' ์ ๋ฐ๋ผ ๊ฐ๋ฆผ
- ํด๋น ์ฝ๋๋ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ก ์ปดํ์ผ๋์ง ์๊ธฐ์ ์ค์์ฑ๋ ์ฝ๋์
๐ค pub
keyword๋ก ๊ฒฝ๋ก ๊ณต๊ฐํ๊ธฐ
์ ๊ทผ์ฑ(privacy)
: ์ธ๋ถ ์ฝ๋๊ฐ ์ ์ ์๊ณ , ํธ์ถํ ์ ์๊ณ , ์์กดํ ์ ์๋ ์์ธ ๊ตฌํ์ ์บก์ํํ๋ ๋ฐฉ๋ฒ- ํจ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋น๊ณต๊ฐ๋ก ์ ์ํ๋ ค๋ฉด ๋ชจ๋ ๋ด์ ์ ์
- ๋ฌ์คํธ์ ๋ชจ๋ ์์ดํ
(ํจ์, ๋ฉ์๋, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐ์, ๋ชจ๋, ์์ ๋ฑ)์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ณต๊ฐ
- ๋ถ๋ชจ ๋ชจ๋์ ์์ดํ
๋ค์ ์์ ๋ชจ๋ ์์ ๋น๊ณต๊ฐ ์์ดํ
์ ์ฌ์ฉํ ์ ์์ง๋ง, ์์ ๋ชจ๋์ ์์ดํ
์ ๋ถ๋ชจ ๋ชจ๋์ ์์ดํ
์ ์ฌ์ฉํ ์ ์์
- ์์ ๋ชจ๋์ ์์ ์ ์์ธ ๊ตฌํ์ ๊ฐ์ธ ์จ๊ธฐ๋ ๋ฐฉ๋ฉด, ์์ ๋ชจ๋์ ๋ถ๋ชจ ๋ชจ๋์ ์์ดํ ์ด ์ ์๋ ์ปจํ ์คํธ๋ฅผ ๋ณผ ์ ์์
- ๋ถ๋ชจ ๋ชจ๋์ ์์ดํ
๋ค์ ์์ ๋ชจ๋ ์์ ๋น๊ณต๊ฐ ์์ดํ
์ ์ฌ์ฉํ ์ ์์ง๋ง, ์์ ๋ชจ๋์ ์์ดํ
์ ๋ถ๋ชจ ๋ชจ๋์ ์์ดํ
์ ์ฌ์ฉํ ์ ์์
pub
keyword๋ฅผ ์ด์ฉํ๋ฉด ์์ ๋ชจ๋์ ์ผ์ ๋ถ๋ถ์ ์ธ๋ถ์ ๋ถ๋ชจ ๋ชจ๋์ ๊ณต๊ฐํ ์ ์์
// src/lib.rs
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// ์ ๋ ๊ฒฝ๋ก
crate::front_of_house::hosting::add_to_waitlist();
// ์๋ ๊ฒฝ๋ก
front_of_house::hosting::add_to_waitlist();
}
- ๋ชจ๋์
pub
keyword๋ ๋ถ๋ชจ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ์ฐธ์กฐํ ์ ์๊ฒ๋ง ํ ๋ฟ์ - ์ ๊ทผ์ฑ ๊ท์น์ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐ์, ํจ์, ๋ฉ์๋๋ ๋ฌผ๋ก ๋ชจ๋์๋ ์ ์ฉ๋จ
๐ค super
๋ก ์์ํ๋ ์๋ ๊ฒฝ๋ก
- ์๋ ๊ฒฝ๋ก๋
super
keyword๋ฅผ ์ด์ฉํด ๋ถ๋ชจ ๋ชจ๋๋ถํฐ ์์ํ ์ ์์- ํ์ผ ์์คํ
๊ฒฝ๋ก์์
..
๋ฌธ๋ฒ์ ์ด์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์
- ํ์ผ ์์คํ
๊ฒฝ๋ก์์
// src/lib.rs
fn serve_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
super::serve_order();
}
fn cook_order() {}
}
fix_incorrect_order
ํจ์๋back_of_house
๋ชจ๋์ ์ ์๋์ด ์์super
keyword๋back_of_house
๋ชจ๋์ ๋ถ๋ชจ ๋ชจ๋, ์ฆ ๋ฃจํธ ๋ชจ๋์ธcrate
์ ์ ๊ทผํ์ฌserve_order
ํจ์๋ฅผ ์ฐพ์ ์ ์์super
keyword๋ฅผ ์ด์ฉํ๋ฉด ๋์ค์ ์ฝ๋๋ฅผ ๋ค๋ฅธ ๋ชจ๋๋ก ์ด๋ํด๋ ์์ ํด์ผ ํ ์ฝ๋๋ฅผ ์ต์ํํ ์ ์์
๐ค ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐ์ ๊ณต๊ฐํ๊ธฐ
- ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ ๋
pub
keyword๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ตฌ์กฐ์ฒด๋ ๊ณต๊ฐ๋์ง๋ง, ๊ตฌ์กฐ์ฒด์ ํ๋๋ ๋น๊ณต๊ฐ์- ํ์์ ๋ฐ๋ผ ๊ฐ ํ๋๋ฅผ ๊ณต๊ฐํ๊ฑฐ๋ ๋น๊ณต๊ฐ๋ก ์ ์ง
// src/lib.rs
mod back_of_house {
pub struct Breakfast {
pub toast: String,
seasonal_fruit: String,
}
impl Breakfast {
pub fn summer(toast: &str) -> Breakfast {
Breakfast {
toast: String::from(toast),
seasonal_fruit: String::from("์ฌ๊ณผ"),
}
}
}
}
fn eat_at_restaurant() {
let mut meal = back_of_house::Breakfast::summer("ํธ๋ฐ๋นต");
meal.toast = String::from("๋ฐ๋นต");
println!("Give me {} toast, please.", meal.toast);
// ์ฃผ์ ์ ๊ฑฐ ํ ์ปดํ์ผ ์ ์๋ฌ ๋ฐ์
// meal.seasonal_fruit = String::from("๋ธ๊ธฐ");
}
back_of_house::Breakfast
๊ตฌ์กฐ์ฒด์toast
ํ๋๋ ๊ณต๊ฐ์ด๋ฏ๋กeat_at_restaurant
ํจ์๊ฐ.
์ ์ด์ฉํดtoast
๊ฐ์ ์ฝ๊ณ ์ธ ์ ์์seasonal_fruit
ํ๋๋ ๋น๊ณต๊ฐ์ด๋ฏ๋กeat_at_restaurant
ํจ์๊ฐ ์ ๊ทผํ ์ ์์back_of_house::Breakfast
๊ตฌ์กฐ์ฒด๋ ๋น๊ณต๊ฐ ํ๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ ๊ณต๊ฐ์ฉ ์ฐ๊ด ํจ์๋ฅผ ์ ๊ณตํด์ผ ํจ- ๋ง์ผ ์ฐ๊ด ํจ์๊ฐ ์ ๊ณต๋์ง ์๋๋ค๋ฉด ๋น๊ณต๊ฐ ํ๋์ ๊ฐ์ ์ค์ ํ ์ ์์ผ๋ฏ๋ก ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์
// src/lib.rs
mod back_of_house {
pub enum Appetizer {
Soup,
Salad,
}
}
pub fn eat_at_restaurant() {
let order1 = back_of_house::Appetizer::Soup;
let order2 = back_of_house::Appetizer::Salad;
}
- ์ด๊ฑฐ์๋ ๊ณต๊ฐํ๋ฉด ๋ชจ๋ ์ด๊ฒ๊ฐ ๋ํ ๊ณต๊ฐ๋จ
- ๋ชจ๋ ์ด๊ฒ๊ฐ์ด ๊ณต๊ฐ๋์ง ์์ผ๋ฉด ์ด๊ฑฐ์๋ฅผ ๊ณต๊ฐํ๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ
4๏ธโฃ use
keyword๋ก ๊ฒฝ๋ก๋ฅผ ๋ฒ์๋ก ๊ฐ์ ธ์ค๊ธฐ
use
keyword๋ก ๊ฒฝ๋ก๋ฅผ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ฉด ๊ฒฝ๋ก์ ์์ดํ ์ด ๋ง์น ํ์ฌ ๋ฒ์์ ์์ดํ ์ธ ๊ฒ์ฒ๋ผ ํธ์ถํ ์ ์์
// src/lib.rs
mod first_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
use crate::first_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
use
keyword์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํ์ผ ์์คํ ์์์ฌ๋ณผ๋ฆญ ๋งํฌ(symbolic link)
๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ์ ์ฌํจuse
keyword๋ฅผ ์ด์ฉํด ๋ฒ์๋ก ๊ฐ์ ธ์จ ๊ฒฝ๋ก๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๊ทผ์ฑ ๊ฒ์ฌ๋ฅผ ์คํํจ
// src/lib.rs
mod first_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
use self::first_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
use
keyword์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ๊ฒ์ ํ์ฌ ๋ฒ์์ ์ด๋ฆ๋ถํฐ ์์ํ๋ ๋์self
keyword๋ฅผ ์ด์ฉํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผ ํจ
๐ค ๊ด์ฉ์ ์ธ ๊ฒฝ๋ก ์ฌ์ฉํ๊ธฐ
use self::first_of_house::hosting;
- ๊ด์ฉ์ ์
use self::first_of_house::hosting::add_to_waitlist;
- ๊ด์ฉ์ ์ด์ง ์์
- ํจ์์ ๋ถ๋ชจ ๋ชจ๋์ ๋ฒ์๋ก ๊ฐ์ ธ์จ ํ ๋ถ๋ชจ ๋ชจ๋์ ์ด๋ฆ๊ณผ ํจ์์ ์ด๋ฆ์ ์กฐํฉํด์ ํธ์ถํ๋ฉด ํจ์ ๊ฒฝ๋ก์ ๋ฐ๋ณต์ ์ต์ํํ๋ฉด์๋ ์ด ํจ์๊ฐ ๋ก์ปฌ์ ์ ์๋ ๊ฒ์ด ์๋๋ผ๋ ์ ์ ๋ ๋ช ํํ ํ ์ ์์
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, 2);
}
- ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐ์, ํน์ ๊ธฐํ ๋ค๋ฅธ ์์ดํ
์
use
๊ตฌ๋ฌธ์ผ๋ก ๊ฐ์ ธ์ฌ ๋๋ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด์ฉ์ ์
use std::io; // => fmt::Result
use std::fmt; // => io::Result<()>
use
๊ตฌ๋ฌธ์ ์ด์ฉํด ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ ์์ดํ ์ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ฌ์คํธ๊ฐ ์ง์ํ์ง ์์- ํด๋น ์ฝ๋์ฒ๋ผ ๋ถ๋ชจ ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋
Result
ํ์ ์ ๊ตฌ๋ถํ ์ ์์ use std::io::Result
์use std::fmt::Result
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค๋ฉด ๋Result
ํ์ ์ด ๊ฐ์ ๋ฒ์์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๋ถ๋ชจ ๋ชจ๋์ ์ ์๋ ๊ฒ์ ๊ฐ๋ฆฌํค๋์ง ์ดํดํ ์ ์์
๐ค as
keyword๋ก ์๋ก์ด ์ด๋ฆ ๋ถ์ฌํ๊ธฐ
use
๊ตฌ๋ฌธ์ผ๋ก ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ ํ์ ์ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด ๊ฒฝ๋ก ๋ค์as
keyword๋ฅผ ์ด์ฉํด ํด๋น ํ์ ์ ์๋ก์ด ์ด๋ฆ์ ๋ถ์ฌํ๋ฉด ๋จ
use std::io::Result;
use std::fmt::Result as FmtResult;
std::fmt::Result
ํ์ ์FmtResult
๋ผ๋ ์ด๋ฆ์ ๋ถ์ฌํจ์ผ๋ก์จ ์ด๋ฆ ์ถฉ๋ ์์ด ๋ฒ์๋ก ๊ฐ์ ธ์ด
๐ค pub use
keyword๋ก ์ด๋ฆ์ ๋ค์ ๋ด๋ณด๋ด๊ธฐ
use
keyword๋ฅผ ์ด์ฉํด ๋ฒ์๋ก ์ด๋ฆ์ ๊ฐ์ ธ์ค๋ฉด ์ด ์ด๋ฆ์ ์ ๋ฒ์์์ ๋น๊ณต๊ฐ ์ด๋ฆ์ด ๋จ- ํธ์ถํ๋ ์ฝ๋๊ฐ ๋ค๋ฅธ ๋ฒ์์์ ๊ฐ์ ธ์จ ์ด๋ฆ๋ ํ์ฌ ๋ฒ์์ ์ ์๋ ๊ฒ์ฒ๋ผ ์ ๊ทผํ ์ ์๋๋ก ํ๊ณ ์ ํ๋ค๋ฉด
pub
์use
keyword๋ฅผ ์กฐํฉํ๋ฉด ๋จ๋ค์ ๋ด๋ณด๋ด๊ธฐ (re-exporting)
๋ค์ ๋ด๋ณด๋ด๊ธฐ
๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์๊ฐํ๋ ์ฝ๋์ ํธ์ถ ๋ฐฉ์๊ณผ ์ค์ ์ฝ๋์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅผ ๋ ์ ์ฉํจ- ์ฝ๋์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ์ธ๋ถ์๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ก ์ฝ๋๋ฅผ ๋ ธ์ถํ ์ ์์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ํ๋ ํ๋ก๊ทธ๋๋จธ ์ ์ฅ์์ ์ํ๋ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ํธ๋ฆฌํ ๊ตฌ์กฐ๋ฅผ ๋ ธ์ถํ ์ ์์
// src/lib.rs
mod first_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub use crate::first_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
pub use
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์์ผ๋ฉดeat_at_restaurant
์ฝ๋๋hosting::add_to_waitlist
ํจ์๋ฅผ ํธ์ถํ ์ ์์ง๋ง, ์ธ๋ถ์ ์ฝ๋๋ ์ด ํจ์๋ฅผ ํธ์ถํ ์ ์์
๐ค ์ธ๋ถ ํจํค์ง์ ์ฌ์ฉ
https://crates.io/
์๋ ๋ฌ์คํธ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์๋ค์ด ๋ง๋ค์ด ๋ ๋ง์ ํจํค์ง๊ฐ ๋ฑ๋ก๋์ด ์์- ํจํค์ง์
Cargo.toml
ํ์ผ์ ํ์ํ ํฌ๋ ์ดํธ๋ฅผ ๋์ดํ๊ณuse
๊ตฌ๋ฌธ์ ์ด์ฉํด ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ฉด ๋จ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(std)
๋ํ ์ธ๋ถ ํฌ๋ ์ดํธ์ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ ๋ฌ์คํธ ์ธ์ด์ ํจ๊ป ์ ๊ณต๋๊ธฐ์ ํฌ๋ ์ดํธ๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์- ํ์ง๋ง ํจํค์ง์ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด ํฌ๋ ์ดํธ๋ฅผ ์ฐธ์กฐํด์ผ ํจ
// Cargo.toml
[package]
name = "restaurant"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rand = "0.5.5"
Cargo.toml
ํ์ผ์rand
๋ฅผ ์์กด์ฑ์ผ๋ก ์ถ๊ฐ- ์นด๊ณ ๋ ์ด ํจํค์ง์
rand
ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ชจ๋ ์์กด์ฑ ํจํค์ง๋ฅผhttps://crates.io/
์์ ๋ด๋ ค๋ฐ์
- ์นด๊ณ ๋ ์ด ํจํค์ง์
๐ค ์ค์ฒฉ ๊ฒฝ๋ก๋ก use
๋ชฉ๋ก์ ๊น๋ํ๊ฒ ์ ์งํ๊ธฐ
use std::io;
use std::cmp::Ordering;
- ์ค์ฒฉ ๊ฒฝ๋ก๋ฅผ ์ ์ฉํ์ง ์์
use
๊ตฌ๋ฌธ
use std::{io, cmp::Ordering};
- ์ค์ฒฉ ๊ฒฝ๋ก๋ฅผ ์ ์ฉํ
use
๊ตฌ๋ฌธ - ๊ณตํต ๋ถ๋ถ์ ๋จผ์ ๊ธฐ์ ํ ๋ค์ ์ค๊ดํธ๋ฅผ ์ด์ฉํด ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ฉด ๋จ
use std::io;
use std::io::Write;
- ํ ๊ฒฝ๋ก์ ํ์ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ค๋
use
๊ตฌ๋ฌธ
use std::io::{self, Write};
- ์ค์ฒฉ ๊ฒฝ๋ก๋ฅผ ์ ์ฉํ
use
๊ตฌ๋ฌธ
๐ค ๊ธ๋กญ ์ฐ์ฐ์
- ์ด๋ค ๊ฒฝ๋ก์ ๊ณต๊ฐ ์์ดํ
์ ๋ชจ๋ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด ๊ธ๋กญ ์ฐ์ฐ์์ธ
*
์ ์ฌ์ฉํด ๊ฒฝ๋ก๋ฅผ ์ง์
use std::collections::*;
std::collections
๋ชจ๋์ ์ ์๋ ๋ชจ๋ ๊ณต๊ฐ ์์ดํ ์ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋use
๊ตฌ๋ฌธ- ๊ธ๋กญ ์ฐ์ฐ์๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํจ
- ๋ฒ์์ ์ด๋ค ์ด๋ฆ์ ๊ฐ์ ธ์๋์ง, ๊ทธ ์ด๋ฆ์ด ํ๋ก๊ทธ๋จ ์ด๋์ ์ ์๋์ด ์๋์ง ์๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ
5๏ธโฃ ๋ชจ๋์ ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ
- ๋ชจ๋์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ํ์ํ๊ธฐ ์ํด ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ํจ๊ณผ์ ์
// src/lib.rs
mod front_of_house;
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
front_of_house
๋ชจ๋ ์ ์ธ
// src/front_of_house.rs
pub mod hosting {
pub fn add_to_waitlist() {}
}
front_of_house
๋ชจ๋ ์ ์- ๋ชจ๋ ์ ์ธ ์ ์ฝ๋ ๋ธ๋ก ๋์ ์ธ๋ฏธ์ฝ๋ก ์ ์ถ๊ฐํ๋ฉด ๋ฌ์คํธ๋ ํด๋น ๋ชจ๋์ ์ฝํ
์ธ ๋ฅผ ๋ชจ๋๊ณผ ๊ฐ์ ์ด๋ฆ์ ํ์ผ์์ ๊ฐ์ ธ์ด
hosting
๋ชจ๋์ ์ฝํ ์ธ ๋ฅผ ๋ค๋ฅธ ํ์ผ๋ก ์ฏ๊ธฐ๋ฉดfront_of_house.rs
ํ์ผ์๋hosting
๋ชจ๋์ ์ ์ธํ๋ ๋ถ๋ถ๋ง ๋จ๊ฒ ๋จ
// src/front_of_house.rs
pub mod hosting;
// src/front_of_house/hosting.rs
pub fn add_to_waitlist() {}
- ์ด๋ฐ ์์ผ๋ก ๋ถ๋ฆฌํด๋ ๋ชจ๋ ํธ๋ฆฌ๋ ๊ฐ์ ํํ๋ก ์ ์ง๋จ
use
๊ตฌ๋ฌธ์ ํฌ๋ ์ดํธ์ ์ผ๋ถ๋ก ์ปดํ์ผ๋๋ ํ์ผ์ ์์น๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฐ์ง ์์mod
keyword๋ ๋ชจ๋์ ์ ์ธํ๋ฉฐ, ๋ฌ์คํธ๋ ๋ชจ๋๊ณผ ๊ฐ์ ์ด๋ฆ์ ํ์ผ์์ ๋ชจ๋์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋จ
Summary
- ๋ฌ์คํธ์์๋ ํจํค์ง๋ฅผ ํฌ๋ ์ดํธ๋ก ์ ๋ฆฌํ๋ฉฐ ํฌ๋ ์ดํธ๋ ๋ชจ๋์ ๊ตฌ์ฑํจ
- ํ ๋ชจ๋์ ์ ์๋ ์์ดํ ์ ๋ค๋ฅธ ๋ชจ๋์์ ์ฐธ์กฐํ ์ ์์
- ์์ดํ
์ ์ฐธ์กฐํ๋ ค๋ฉด ์ ๋ ํน์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉ
- ์ด ๊ฒฝ๋ก๋
use
๊ตฌ๋ฌธ์ ์ด์ฉํด ์ง์ ๋ ์์ดํ ์ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ฉด ์ฌ๋ฌ ์์ดํ ์ ํ์ฌ ๋ฒ์๋ก ๊ฐ์ ธ์ฌ ๋ ๋ ์งง์ ํ์์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์๋ ์์
- ์ด ๊ฒฝ๋ก๋
- ๋ชจ๋์ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ณต๊ฐ์ด์ง๋ง,
pub
keyword๋ก ์์ดํ ์ ๊ณต๊ฐํ ์ ์์
728x90
๋ฐ์ํ
'Development Study > Rust' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Rust] Start Rust (Day 15) - Rust Example Script 3 [Get Avg & Mid & Mode] (0) | 2023.02.25 |
---|---|
[Rust] Start Rust (Day 14) - Common Collections (2) | 2023.02.20 |
[Algorithm] Baekjoon - ์ ์ถ๋ ฅ๊ณผ ์ฌ์น์ฐ์ฐ ๋จ๊ณ (3) | 2023.02.10 |
[Rust] Start Rust (Day 12) - Enums and Pattern Matching [2] (2) | 2023.02.06 |
[Rust] Start Rust (Day 11) - Enums and Pattern Matching [1] (0) | 2023.02.03 |
Comments