๊ด€๋ฆฌ ๋ฉ”๋‰ด

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:08
728x90
๋ฐ˜์‘ํ˜•

๐Ÿฆ€ 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 ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŒŒ์ผ์„ ๋ถ„์‚ฐํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
      • ์ด๋•Œ ๊ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ๋“ค์€ ๋ณ„๊ฐœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋ ˆ์ดํŠธ๊ฐ€ ๋จ
  • ํฌ๋ ˆ์ดํŠธ๋Š” ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์˜ ๋ฒ”์œ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต์œ ํ•˜๊ธฐ ์ˆ˜์›”ํ•ด์ง
  • ํฌ๋ ˆ์ดํŠธ์˜ ๊ธฐ๋Šฅ์„ ํ•ด๋‹น ํฌ๋ ˆ์ดํŠธ์˜ ๋ฒ”์œ„ ์•ˆ์—์„œ ๊ตฌํ˜„ํ•˜๋ฉด ํŠน์ • ๊ธฐ๋Šฅ์ด ์ž‘์„ฑ ์ค‘์ธ ํฌ๋ ˆ์ดํŠธ์— ์ •์˜๋œ ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ์ถ”๊ฐ€ํ•œ ํฌ๋ ˆ์ดํŠธ์— ์ •์˜๋œ ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ
    • (Ex)
      • Rng : ์ž‘์„ฑ ์ค‘์ธ ํฌ๋ ˆ์ดํŠธ์—์„œ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด
      • rand::Rng : rand ํฌ๋ ˆ์ดํŠธ์˜ Rng ํŠธ๋ ˆ์ดํŠธ

 

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
๋ฐ˜์‘ํ˜•
Comments