ν™ˆ [Rust] μ œμ–΄ 흐름
포슀트
μ·¨μ†Œ

[Rust] μ œμ–΄ 흐름


Title


κ°œμš”

λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” 쑰건이 true인 경우 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜, 쑰건이 계속 true인 λ™μ•ˆ μ½”λ“œλ₯Ό λ°˜λ³΅ν•΄μ„œ μ‹€ν–‰ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. Rustμ—μ„œλŠ” if ν‘œν˜„μ‹κ³Ό λ£¨ν”„λ‘œ μ‹€ν–‰ 흐름을 μ œμ–΄ν•œλ‹€.

if ν‘œν˜„μ‹

if ν‘œν˜„μ‹μœΌλ‘œ 쑰건에 λ”°λ₯Έ μ½”λ“œμ˜ μ‹€ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•  수 μžˆλ‹€. β€œμ‘°κ±΄μ΄ 참일 λ•Œ ν•΄λ‹Ή μ½”λ“œ 블둝을 μ‹€ν–‰ν•˜λ©°, 쑰건이 거짓일 λ•ŒλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.β€λ‘œ 이해할 수 μžˆλ‹€.

projects 디렉토리에 branchesλΌλŠ” μƒˆ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜κ³ , if ν‘œν˜„μ‹μ„ μ‚΄νŽ΄λ³΄μž. src/main.rs νŒŒμΌμ— λ‹€μŒ λ‚΄μš©μ„ μž‘μ„±ν•΄λ³΄μž.

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
9
fn main() {
    let number = 3;

    if number < 5 {
        println!("쑰건은 true이닀.");
    } else {
        println!("쑰건은 false이닀.");
    }
}

if ν‘œν˜„μ‹μ€ 항상 if ν‚€μ›Œλ“œλ‘œ μ‹œμž‘ν•˜λ©°, κ·Έ 뒀에 쑰건이 λ”°λΌμ˜¨λ‹€. 예λ₯Ό λ“€μ–΄, μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” number λ³€μˆ˜κ°€ 5보닀 μž‘μ€μ§€ ν™•μΈν•˜λŠ” 쑰건을 μ‚¬μš©ν–ˆλ‹€. 쑰건이 true일 λ•Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ 블둝은 쑰건 λ‹€μŒ μ€‘κ΄„ν˜Έ 내에 μœ„μΉ˜ν•œλ‹€. if ν‘œν˜„μ‹μ˜ μ΄λŸ¬ν•œ μ½”λ“œ 블둝을 λΆ„κΈ°(arms)라 λΆ€λ₯Έλ‹€. μ΄λŠ” μ˜ˆμ „μ— λ‹€λ€˜λ˜ match ν‘œν˜„μ‹μ˜ 뢄기와 관련이 μžˆλ‹€.

쑰건이 false일 경우 싀행될 μ½”λ“œλŠ” else ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ‹€. else ν‘œν˜„μ‹μ„ μž‘μ„±ν•˜μ§€ μ•Šμ„ 경우, 쑰건이 false이면 if 블둝을 κ±΄λ„ˆλ›°κ³ , λ‹€μŒ μ½”λ“œλ‘œ μ΄λ™ν•œλ‹€.

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄, μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ 좜λ ₯λœλ‹€:

1
2
3
4
5
$ cargo run
   Compiling branches v0.1.0 (file:///projects/branches)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31s
     Running `target/debug/branches`
쑰건은 true이닀.

λ³€μˆ˜ number의 값을 λ³€κ²½ν•˜μ—¬ 쑰건이 false일 λ•Œ μ–΄λ–€ λ°˜μ‘μ΄ λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•΄λ³΄μž.

1
    let number = 7;

μ½”λ“œλ₯Ό λ³€κ²½ν•œ ν›„, ν”„λ‘œκ·Έλž¨μ„ λ‹€μ‹œ μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό 확인할 수 μžˆλ‹€:

1
2
3
4
5
$ cargo run
   Compiling branches v0.1.0 (file:///projects/branches)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31s
     Running 'target/debug/branches'
쑰건은 false이닀.

쑰건문의 쑰건은 λ°˜λ“œμ‹œ λΆˆλ¦¬μ–Έ νƒ€μž…(bool)이어야 ν•œλ‹€. λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ κ°’μœΌλ‘œ 쑰건을 μ„€μ •ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μ•„λž˜ μ½”λ“œλ₯Ό 보면 더 잘 이해할 수 μžˆλ‹€:

파일λͺ…: src/main.rs

μ•„λž˜ μ½”λ“œλŠ” μ»΄νŒŒμΌλ˜μ§€ μ•ŠλŠ”λ‹€.

1
2
3
4
5
6
7
fn main() {
    let number = 3;

    if number {
        println!("numberλŠ” 3이닀.");
    }
}

μœ„ μ½”λ“œμ—μ„œλŠ” if 쑰건이 3의 κ°’μœΌλ‘œ ν‰κ°€λ˜μ—ˆκ³ , Rustμ—μ„œλŠ” μ—λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€:

1
2
3
4
5
6
7
8
9
10
$ cargo run
   Compiling branches v0.1.0 (file:///projects/branches)
error[E0308]: mismatched types
 --> *src/main.rs*:4:8
  |
4 |     if number {
  |        ^^^^^^ expected `bool`, found integer

For more information about this error, try `rustc --explain E0308`.
error: could not compile `branches` due to previous error

μ—λŸ¬ λ©”μ‹œμ§€λŠ” Rustκ°€ bool 값을 κΈ°λŒ€ν•˜μ˜€μ§€λ§Œ μ •μˆ˜ 값을 λ°›μ•˜λ‹€λŠ” 것을 λ‚˜νƒ€λ‚Έλ‹€. Rubyλ‚˜ JavaScript와 같은 언어듀은 λΆˆλ¦¬μ–Έμ΄ μ•„λ‹Œ νƒ€μž…μ„ μžλ™μœΌλ‘œ λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ³€ν™˜ν•˜μ§€λ§Œ, Rustμ—μ„œλŠ” κ·Έλ ‡κ²Œ ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ if λ¬Έμ—μ„œλŠ” λ°˜λ“œμ‹œ λΆˆλ¦¬μ–Έ 값을 쑰건으둜 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 즉, μˆ«μžκ°€ 0이 아닐 κ²½μš°μ—λ§Œ if μ½”λ“œ 블둝이 μ‹€ν–‰λ˜κ²Œ ν•˜λ €λ©΄, if ν‘œν˜„μ‹μ„ μ•„λž˜μ™€ 같이 μˆ˜μ •ν•΄μ•Ό ν•œλ‹€:

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
fn main() {
    let number = 3;

    if number != 0 {
        println!("numberλŠ” 0이 μ•„λ‹ˆλ‹€.");
    }
}

이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ numberλŠ” 0이 μ•„λ‹ˆλ‹€.κ°€ 좜λ ₯λœλ‹€.

else ifλ₯Ό ν™œμš©ν•œ 닀쀑 쑰건 처리

else if ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ 쑰건을 μ²˜λ¦¬ν•  수 μžˆλ‹€. μ•„λž˜ 예제λ₯Ό 톡해 ν™•μΈν•΄λ³΄μž:

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
    let number = 6;

    if number % 4 == 0 {
        println!("numberλŠ” 4둜 λ‚˜λˆ„μ–΄ 떨어진닀");
    } else if number % 3 == 0 {
        println!("numberλŠ” 3으둜 λ‚˜λˆ„μ–΄ 떨어진닀");
    } else if number % 2 == 0 {
        println!("numberλŠ” 2둜 λ‚˜λˆ„μ–΄ 떨어진닀");
    } else {
        println!("numberλŠ” 4, 3, 2둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ”λ‹€");
    }
}

μœ„ ν”„λ‘œκ·Έλž¨μ€ λ„€ κ°€μ§€μ˜ 경둜λ₯Ό 가진닀. 이λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όκ°€ 좜λ ₯λœλ‹€:

1
2
3
4
5
$ cargo run
   Compiling branches v0.1.0 (file:///projects/branches)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31s
     Running 'target/debug/branches'
numberλŠ” 3으둜 λ‚˜λˆ„μ–΄ 떨어진닀

ν”„λ‘œκ·Έλž¨μ€ 각 if ν‘œν˜„μ‹μ„ μˆœμ„œλŒ€λ‘œ κ²€μ‚¬ν•˜κ³ , true인 첫 번째 쑰건의 μ½”λ“œ 블둝을 μ‹€ν–‰ν•œλ‹€. μ—¬κΈ°μ„œ 6은 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€μ§€λ§Œ numberλŠ” 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§„λ‹€λŠ” λ©”μ‹œμ§€λŠ” 좜λ ₯λ˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŠ” Rustκ°€ true인 첫 번째 쑰건을 λ§Œλ‚˜λ©΄ 이후 쑰건듀을 ν™•μΈν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

λ‹€μˆ˜μ˜ else if 쑰건 μ‚¬μš©μ€ μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ μ¦κ°€μ‹œν‚¬ 수 μžˆλ‹€. μ—¬λŸ¬ 쑰건듀이 μ‘΄μž¬ν•  λ•ŒλŠ” μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ν•΄μ•Ό ν•œλ‹€. 좔후에 Rustκ°€ μ œκ³΅ν•˜λŠ” κ°•λ ₯ν•œ λΆ„κΈ° 처리 도ꡬ인 match에 λŒ€ν•΄ μ•Œμ•„λ³Ό 것이닀.


let λ¬Έμ—μ„œ if μ‚¬μš©ν•˜κΈ°

ifλŠ” ν‘œν˜„μ‹μ΄λ―€λ‘œ, let 문의 였λ₯Έμͺ½μ—λ„ μ‚¬μš©ν•  수 μžˆλ‹€. 즉, if ν‘œν˜„μ‹μ„ 톡해 λ³€μˆ˜μ— κ²°κ³Ό 값을 ν• λ‹Ήν•  수 μžˆλ‹€. μ•„λž˜ μ½”λ“œμ—μ„œ μ˜ˆμ‹œλ₯Ό 확인할 수 μžˆλ‹€.

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
// if ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜κΈ°

fn main() {
    let condition = true;
    let number = if condition { 5 } else { 6 };

    println!("number의 값은: {number}이닀.");
}

μœ„ μ½”λ“œμ—μ„œ number λ³€μˆ˜λŠ” if ν‘œν˜„μ‹μ˜ 결과에 따라 값이 ν• λ‹Ήλœλ‹€.

1
2
3
4
5
$ cargo run
   Compiling branches v0.1.0 (file:///projects/branches)
    Finished dev [unoptimized + debuginfo] target(s) in 0.30s
     Running `target/debug/branches`
number의 값은: 5이닀.

μ½”λ“œ 블둝은 λ‚΄λΆ€μ˜ λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μœΌλ‘œ ν‰κ°€λ˜κΈ° λ•Œλ¬Έμ—, if ν‘œν˜„μ‹ μ „μ²΄μ˜ 값은 ν•΄λ‹Ή λΈ”λ‘μ˜ μ‹€ν–‰ 결과에 따라 κ²°μ •λœλ‹€. μ΄λŸ¬ν•œ 이유둜 if문의 각 λΆ„κΈ° κ²°κ³ΌλŠ” 같은 νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€. νƒ€μž…μ΄ μ„œλ‘œ λ‹€λ₯Ό 경우, μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

μ•„λž˜ μ½”λ“œλŠ” μ»΄νŒŒμΌλ˜μ§€ μ•ŠλŠ”λ‹€.

1
2
3
4
5
6
fn main() {
    let condition = true;
    let number = if condition { 5 } else { "six" };

    println!("number의 값은: {number}이닀.");
}

μœ„ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λ €κ³  μ‹œλ„ν•˜λ©΄, if와 else의 λ°˜ν™˜ νƒ€μž…μ΄ μ„œλ‘œ ν˜Έν™˜λ˜μ§€ μ•Šμ•„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
$ cargo run
   Compiling branches v0.1.0 (file:///projects/branches)
error[E0308]: `if`와 `else`의 νƒ€μž…μ΄ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”λ‹€.
 --> *src/main.rs*:4:44
  |
4 |     let number = if condition { 5 } else { "six" };
  |                                 -          ^^^^^ μ •μˆ˜λ₯Ό μ˜ˆμƒν–ˆμœΌλ‚˜ `&str` νƒ€μž… 발견
  |                                 |
  |                                 이 λΆ€λΆ„ λ•Œλ¬Έμ— λ°œμƒν•œ 문제

μ—λŸ¬μ— λŒ€ν•œ μžμ„Έν•œ μ •λ³΄λŠ” `rustc --explain E0308`λ₯Ό 톡해 확인할 수 μžˆλ‹€.
error: 이전 μ—λŸ¬λ‘œ 인해 `branches` μ»΄νŒŒμΌμ— μ‹€νŒ¨ν–ˆλ‹€.

if 문의 ν‘œν˜„μ‹μ€ μ •μˆ˜ κ°’μœΌλ‘œ, else 문의 ν‘œν˜„μ‹μ€ λ¬Έμžμ—΄ κ°’μœΌλ‘œ ν‰κ°€λœλ‹€. λ³€μˆ˜λŠ” 항상 λͺ…ν™•ν•œ νƒ€μž…μ„ 가지며, κ·Έ νƒ€μž…μ€ 컴파일 μ‹œκ°„μ— ν™•μ •λ˜μ–΄μ•Ό ν•œλ‹€. λ³€μˆ˜λŠ” 단일 νƒ€μž…μ„ κ°€μ Έμ•Ό ν•˜λ―€λ‘œ μ΄λŸ¬ν•œ ν˜Όν•© νƒ€μž…μ€ ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.

RustλŠ” 컴파일 μ‹œκ°„μ— number λ³€μˆ˜μ˜ νƒ€μž…μ„ ν™•μ‹€νžˆ μ•Œμ•„μ•Ό ν•œλ‹€. number의 νƒ€μž…μ„ 톡해 μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œ μ „μ²΄μ—μ„œ ν•΄λ‹Ή νƒ€μž…μ΄ μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©λ˜μ—ˆλŠ”μ§€ κ²€μ¦ν•œλ‹€. λ§Œμ•½ number의 νƒ€μž… 결정이 λŸ°νƒ€μž„μ— 이루어진닀면, RustλŠ” 그것을 μ²˜λ¦¬ν•˜λŠ”λ° 어렀움을 κ²ͺ게 λœλ‹€. 이 경우, μ»΄νŒŒμΌλŸ¬λŠ” 더 λ³΅μž‘ν•œ 상황에 μ²˜ν•˜κ²Œ 되며, μ—¬λŸ¬ 가상 νƒ€μž…μ„ 좔적해야 ν•˜λ―€λ‘œ μ½”λ“œμ— λŒ€ν•œ 보μž₯도 μ€„μ–΄λ“€κ²Œ λœλ‹€.


λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•œ 반볡

μ½”λ“œ 블둝을 μ—¬λŸ¬ 번 μ‹€ν–‰ν•  ν•„μš”κ°€ μžˆλ‹€. 이 μž‘μ—…μ„ μœ„ν•΄ RustλŠ” λ°˜λ³΅λ¬Έμ„ μ œκ³΅ν•œλ‹€. λ°˜λ³΅λ¬Έμ€ μ½”λ“œμ˜ λ§ˆμ§€λ§‰κΉŒμ§€ μ‹€ν–‰ν•œ λ‹€μŒ, μ²˜μŒλΆ€ν„° λ‹€μ‹œ μ‹œμž‘ν•œλ‹€. λ°˜λ³΅λ¬Έμ— λŒ€ν•΄ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ loopsλΌλŠ” μƒˆ ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€μ–΄λ³΄μž.

Rustμ—λŠ” 총 μ„Έ μ’…λ₯˜μ˜ 반볡문, loop, while, for을 μ œκ³΅ν•œλ‹€. 각각에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

loopλ₯Ό μ΄μš©ν•œ μ½”λ“œμ˜ 반볡

loop ν‚€μ›Œλ“œλŠ” Rustμ—κ²Œ μ½”λ“œ 블둝을 λ¬΄ν•œνžˆ 반볡 μ‹€ν–‰ν•˜λ„λ‘ μ§€μ‹œν•œλ‹€. μ΄λŠ” κ°œλ°œμžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ€‘μ§€ν•˜κΈ° μ „κΉŒμ§€ 계속 λ°˜λ³΅λœλ‹€.

loops 디렉토리 λ‚΄μ˜ src/main.rs νŒŒμΌμ„ λ‹€μŒκ³Ό 같이 λ³€κ²½ν•΄λ³΄μž:

파일λͺ…: src/main.rs

1
2
3
4
5
fn main() {
    loop {
        println!("again!");
    }
}

이 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄, κ°œλ°œμžκ°€ ν”„λ‘œκ·Έλž¨μ„ μˆ˜λ™μœΌλ‘œ μ€‘μ§€ν•˜κΈ° μ „κΉŒμ§€ κ³„μ†ν•΄μ„œ again!이 좜λ ₯λœλ‹€. λŒ€λΆ€λΆ„μ˜ 터미널은 ν‚€λ³΄λ“œ 단좕킀 ctrl-cλ₯Ό μ‚¬μš©ν•˜μ—¬ 연속적인 λ°˜λ³΅λ¬Έμ„ 멈좜 수 μžˆλ‹€.

1
2
3
4
5
6
7
8
9
$ cargo run
   Compiling loops v0.1.0 (file:///projects/loops)
    Finished dev [unoptimized + debuginfo] target(s) in 0.29s
     Running `target/debug/loops`
again!
again!
again!
again!
^Cagain!

μ—¬κΈ°μ„œ ^CλŠ” ctrl-cλ₯Ό λˆ„λ₯Έ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. ctrl-c 이후에 again!이 좜λ ₯λ˜λŠ”μ§€λŠ” 쀑단 λͺ…령을 λ°›μ•˜μ„ λ•Œμ˜ 반볡문의 μœ„μΉ˜μ— 따라 λ‹€λ₯Ό 수 μžˆλ‹€.

λ¬Όλ‘ , RustλŠ” μ½”λ“œλ₯Ό μ΄μš©ν•˜μ—¬ λ°˜λ³΅λ¬Έμ„ μ€‘λ‹¨ν•˜λŠ” 방법도 μ œκ³΅ν•œλ‹€. break ν‚€μ›Œλ“œλ₯Ό 반볡문 내에 λ„£μ–΄μ„œ ν”„λ‘œκ·Έλž¨μ— μ–Έμ œ 반볡문 싀행을 쀑지할지 μ•Œλ¦΄ 수 μžˆλ‹€. 이전에 ν•™μŠ΅ν–ˆλ˜ β€œμˆ«μž λ§žμΆ”κΈ° κ²Œμž„β€ μ„Ήμ…˜μ—μ„œ, μ‚¬μš©μžκ°€ μ •ν™•ν•œ 숫자λ₯Ό 맞좰 κ²Œμž„μ—μ„œ 이겼을 λ•Œ ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜κΈ° μœ„ν•΄ 이 방법을 μ‚¬μš©ν–ˆμ—ˆλ‹€.

λ˜ν•œ, μš°λ¦¬λŠ” 이전에 continueλ₯Ό μ‚¬μš©ν–ˆλŠ”λ°, μš°λ¦¬λŠ” continue둜 λ°˜λ³΅λ¬Έμ—μ„œ 남은 μ½”λ“œλ₯Ό κ±΄λ„ˆλ›°κ³  λ‹€μŒ 반볡으둜 λ°”λ‘œ λ„˜μ–΄κ°€λ„λ‘ ν”„λ‘œκ·Έλž¨μ— μ§€μ‹œν•  수 μžˆμ—ˆλ‹€.


loopλ₯Ό ν†΅ν•œ κ°’ λ°˜ν™˜

loopλŠ” 가끔 μ‹€νŒ¨ κ°€λŠ₯성이 μžˆλŠ” μž‘μ—…μ„ μž¬μ‹œλ„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€(μ˜ˆμ‹œ: μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ λͺ¨λ‘ λ§ˆμ³€λŠ”μ§€ 확인). 그리고 μ΄λŸ¬ν•œ μž‘μ—…μ˜ κ²°κ³Όλ₯Ό loop λ°”κΉ₯ μ½”λ“œλ‘œ 전달해야 ν•  λ•Œλ„ μžˆλ‹€. 그럴 λ•ŒλŠ”, loopλ₯Ό λ©ˆμΆ”λŠ” break ν‘œν˜„μ‹ 뒀에 λ°˜ν™˜ν•  값을 μ§€μ •ν•˜λ©΄, ν•΄λ‹Ή 값은 loopμ—μ„œ λ°˜ν™˜λ˜μ–΄ μ‚¬μš©λ  수 μžˆλ‹€. λ‹€μŒμ€ 그런 방식을 λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œμ΄λ‹€:

1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("κ²°κ³ΌλŠ”: {result}");
}

loop μ‹œμž‘ 전에 counterλΌλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©° 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€. κ·Έ ν›„, loop의 λ°˜ν™˜ 값을 μ €μž₯ν•  result λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€. loop λ‚΄μ—μ„œλŠ” counter λ³€μˆ˜μ— 1을 계속 λ”ν•˜λ‹€κ°€ counterκ°€ 10이 되면, counter * 2 κ°’κ³Ό breakλ₯Ό μ‚¬μš©ν•΄ loopλ₯Ό μ’…λ£Œν•œλ‹€. κ·Έ λ‹€μŒμ— result에 μ €μž₯된 값을 좜λ ₯ν•œλ‹€. 이 경우 좜λ ₯ 값이 20이 λ˜λŠ” 것을 확인할 수 μžˆλ‹€.


닀쀑 λ°˜λ³΅λ¬Έμ—μ„œ 루프 λ ˆμ΄λΈ” ν™œμš©

μ€‘μ²©λœ 반볡문이 μžˆμ„ λ•Œ, break와 continueλŠ” 기본적으둜 κ°€μž₯ λ‚΄λΆ€μ˜ λ°˜λ³΅λ¬Έμ—λ§Œ 영ν–₯을 μ€€λ‹€. λ§Œμ•½ νŠΉμ • μ™ΈλΆ€μ˜ λ°˜λ³΅λ¬Έμ— λŒ€ν•΄μ„œ breakλ‚˜ continueλ₯Ό μ μš©ν•˜κ³  μ‹Άλ‹€λ©΄, 루프 λ ˆμ΄λΈ”μ„ μ‚¬μš©ν•  수 μžˆλ‹€. 루프 λ ˆμ΄λΈ”μ€ μž‘μ€ λ”°μ˜΄ν‘œ(')둜 μ‹œμž‘ν•œλ‹€. μ•„λž˜μ— μ€‘μ²©λœ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•œ μ˜ˆμ‹œλ₯Ό 보여쀀닀:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;

        loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("μ΅œμ’… count = {count}");
}

μ™ΈλΆ€ λ£¨ν”„μ—λŠ” counting_upμ΄λΌλŠ” 루프 λ ˆμ΄λΈ”μ΄ λΆ™μ–΄μžˆμœΌλ©°, 0μ—μ„œ 2κΉŒμ§€ μ¦κ°€ν•œλ‹€. 루프 λ ˆμ΄λΈ”μ΄ μ—†λŠ” λ‚΄λΆ€ λ£¨ν”„λŠ” 10μ—μ„œ 9κΉŒμ§€ κ°μ†Œν•œλ‹€. λ ˆμ΄λΈ”μ„ μ§€μ •ν•˜μ§€ μ•Šμ€ 첫 번째 breakλŠ” λ‚΄λΆ€ λ£¨ν”„λ§Œμ„ μ’…λ£Œν•œλ‹€. 반면 break 'counting_up;λŠ” μ™ΈλΆ€ 루프λ₯Ό μ’…λ£Œν•œλ‹€. μ‹€ν–‰ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

1
2
3
4
5
6
7
8
9
count = 0
remaining = 10
remaining = 9
count = 1
remaining = 10
remaining = 9
count = 2
remaining = 10
μ΅œμ’… count = 2

while을 ν™œμš©ν•œ 쑰건뢀 반볡문

ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μ’…μ’… 반볡문 λ‚΄λΆ€μ—μ„œ 쑰건을 검사할 ν•„μš”κ°€ μžˆλ‹€. 쑰건이 true인 경우 반볡문이 μ‹€ν–‰λ˜λ©°, 쑰건이 false이 될 λ•Œ 반볡문이 λ©ˆμΆ˜λ‹€. 이런 λ™μž‘μ€ loop, if, else, breakλ₯Ό μ‘°ν•©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ 쑰건뢀 반볡 νŒ¨ν„΄μ€ Rustμ—μ„œ 자주 μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ—, RustλŠ” while 루프λ₯Ό μ œκ³΅ν•œλ‹€. μ•„λž˜ μ˜ˆμ œμ—μ„œλŠ” while 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ 쑰건이 true인 λ™μ•ˆ μ„Έ 번 λ°˜λ³΅ν•˜κ³ , 각 λ°˜λ³΅λ§ˆλ‹€ μΉ΄μš΄νŠΈλ‹€μš΄ν•œ ν›„, 반볡문이 μ’…λ£Œλ˜λ©΄ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
// 쑰건이 true인 λ™μ•ˆ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ while 루프 μ‚¬μš©

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{number}!");

        number -= 1;
    }

    println!("LIFTOFF!!!");
}

이런 λ°©μ‹μœΌλ‘œ κ΅¬μ„±ν•˜λ©΄ loop, if, else, breakλ₯Ό μ‚¬μš©ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” λ³΅μž‘ν•œ 쀑첩 ꡬ쑰λ₯Ό ν”Όν•  수 있으며, μ½”λ“œμ˜ 가독성도 높아진닀. 쑰건이 true이면 μ½”λ“œκ°€ μ‹€ν–‰λ˜κ³ , false이면 λ£¨ν”„μ—μ„œ λ²—μ–΄λ‚œλ‹€.


for둜 μ»¬λ ‰μ…˜ 반볡

μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ₯Ό λ°˜λ³΅ν•  λ•Œ, while ꡬ쑰λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. 예λ₯Ό λ“€λ©΄, μ•„λž˜μ˜ λ£¨ν”„λŠ” λ°°μ—΄ a의 각 μš”μ†Œλ₯Ό 좜λ ₯ν•œλ‹€.

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
9
10
11
12
// while 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¬λ ‰μ…˜μ˜ 각 μš”μ†Œλ₯Ό 반볡

fn main() {
    let a = [10, 20, 30, 40, 50];
    let mut index = 0;

    while index < 5 {
        println!("이 값은: {}", a[index]);

        index += 1;
    }
}

이 μ½”λ“œμ—μ„œλŠ” λ°°μ—΄μ˜ 각 μš”μ†Œμ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆœνšŒν•œλ‹€. μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•˜κ³ , λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œμ— 도달할 λ•ŒκΉŒμ§€ 계속 루프λ₯Ό μ‹€ν–‰ν•œλ‹€(즉, index < 5 쑰건이 falseκ°€ 될 λ•ŒκΉŒμ§€). 이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄, 배열에 μžˆλŠ” λͺ¨λ“  μš”μ†Œλ“€μ΄ 좜λ ₯λœλ‹€.

1
2
3
4
5
6
7
8
9
$ cargo run
   Compiling loops v0.1.0 (file:///projects/loops)
    Finished dev [unoptimized + debuginfo] target(s) in 0.32s
     Running `target/debug/loops`
이 값은: 10
이 값은: 20
이 값은: 30
이 값은: 40
이 값은: 50

λ°°μ—΄μ˜ λͺ¨λ“  값을 터미널에 좜λ ₯ν•΄λ³Έ κ²°κ³Ό, μ˜ˆμƒλŒ€λ‘œ λ‹€μ„― 개의 값이 λͺ¨λ‘ λ‚˜νƒ€λ‚¬λ‹€. κ·ΈλŸ¬λ‚˜ indexκ°€ μ–΄λŠ μ‹œμ μ—μ„œλ“  5에 λ„λ‹¬ν•˜λ©΄, λ£¨ν”„λŠ” λ°°μ—΄μ˜ μ—¬μ„― 번째 값을 μ°ΎκΈ° 전에 μ’…λ£Œλœλ‹€.

ν•˜μ§€λ§Œ, 이 방식은 μ—λŸ¬λ₯Ό λ§Œλ“€κΈ° 쉽닀. λ§Œμ•½ 인덱슀의 κ°’μ΄λ‚˜ 쑰건식에 μ‹€μˆ˜κ°€ 있으면 ν”„λ‘œκ·Έλž¨μ—μ„œ νŒ¨λ‹‰ μƒνƒœκ°€ λ°œμƒν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ°°μ—΄ a의 크기λ₯Ό λ„€ 개의 μš”μ†Œλ‘œ μ€„μ˜€μ„ λ•Œ, 쑰건식을 while index < 4둜 μˆ˜μ •ν•˜λŠ” 것을 μžŠμ–΄λ²„λ¦°λ‹€λ©΄, μ½”λ“œλŠ” νŒ¨λ‹‰ μƒνƒœλ₯Ό μΌμœΌν‚¬ 것이닀. λ˜ν•œ 이 방식은 μƒλŒ€μ μœΌλ‘œ 느릴 수 μžˆλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” λ£¨ν”„μ˜ 각 λ°˜λ³΅λ§ˆλ‹€ λ°°μ—΄μ˜ λ²”μœ„ λ‚΄μ—μ„œ μΈλ±μŠ€κ°€ μœ νš¨ν•œμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ 쑰건을 κ²€μ‚¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

더 κ°„κ²°ν•˜κ³  μ•ˆμ •μ μΈ λ°©λ²•μœΌλ‘œλŠ” for 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¬λ ‰μ…˜μ˜ 각 μš”μ†Œλ₯Ό μˆœνšŒν•˜λŠ” 것이닀. for λ£¨ν”„λŠ” μ•žμ„œ μ œμ‹œλœ μ½”λ“œλ³΄λ‹€ 훨씬 μ§κ΄€μ μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ‹€.

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
9
// for 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¬λ ‰μ…˜μ˜ 각 μš”μ†Œλ₯Ό λ°˜λ³΅ν•˜κΈ°

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("이 값은: {element}");
    }
}

이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ΄μ „μ˜ μ½”λ“œμ™€ λ™μΌν•œ 좜λ ₯ κ²°κ³Όλ₯Ό 확인할 수 μžˆλ‹€. 무엇보닀도, 이 방법은 μ½”λ“œμ˜ μ•ˆμ „μ„±μ„ ν–₯μƒμ‹œν‚€λ©°, λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„œκ±°λ‚˜ ν•­λͺ©μ„ 놓칠 κ°€λŠ₯성을 쀄인닀.

for 루프λ₯Ό ν™œμš©ν•˜λ©΄, λ°°μ—΄μ˜ 값이 λ³€κ²½λ˜λ”λΌλ„ λ‹€λ₯Έ λΆ€λΆ„μ˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš”κ°€ μ—†λ‹€. μ΄λŸ¬ν•œ μž₯점(μ•ˆμ „μ„±κ³Ό κ°„κ²°μ„±)으둜 인해 for λ£¨ν”„λŠ” Rustμ—μ„œ κ°€μž₯ 자주 μ‚¬μš©λ˜λŠ” λ°˜λ³΅λ¬Έμ΄λ‹€.

λ˜ν•œ, νŠΉμ • 횟수만큼 μ½”λ“œλ₯Ό 반볡 μ‹€ν–‰ν•˜λ €λŠ” κ²½μš°μ—λ„ for 루프가 ꢌμž₯λœλ‹€. 예λ₯Ό λ“€λ©΄, 숫자의 λ²”μœ„λ₯Ό μƒμ„±ν•˜λŠ” ν‘œμ€€ 라이브러리인 Rangeλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

μ•„λž˜ μ½”λ“œλŠ” for 루프와 rev 방법을 ν™œμš©ν•œ μΉ΄μš΄νŠΈλ‹€μš΄μ˜ 예λ₯Ό 보여쀀닀.

파일λͺ…: src/main.rs

1
2
3
4
5
6
fn main() {
    for number in (1..4).rev() {
        println!("{number}!");
    }
    println!("LIFTOFF!!!");
}

이 μ½”λ“œλŠ” 더 κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜λ‹€.


정리


μš°λ¦¬λŠ” μ§€κΈˆκΉŒμ§€ λ³€μˆ˜, 슀칼라 및 볡합 μžλ£Œν˜•, ν•¨μˆ˜, 주석, if ν‘œν˜„μ‹, 그리고 λ°˜λ³΅λ¬Έμ— λŒ€ν•˜μ—¬ λ°°μ› λ‹€. 이번 μ„Ήμ…˜μ—μ„œ 배운 λ‚΄μš©μ„ ν™œμš©ν•˜μ—¬ λ‹€μŒκ³Ό 같은 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄ λ³΄λŠ” 것을 μΆ”μ²œν•œλ‹€:

  • 화씨와 섭씨 κ°„μ˜ μ˜¨λ„λ₯Ό λ³€ν™˜ν•˜λŠ” ν”„λ‘œκ·Έλž¨
  • n번째 ν”Όλ³΄λ‚˜μΉ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨
  • β€œThe Twelve Days of Christmas” 크리슀마슀 캐둀의 가사λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨, μ΄λ•Œ λ…Έλž˜μ˜ 반볡 뢀뢄을 잘 ν™œμš©ν•΄λ³΄μž.

λ‹€μŒ μ„Ήμ…˜μ—μ„œλŠ” λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—λŠ” ν”νžˆ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ†Œμœ κΆŒμ΄λΌλŠ” κ°œλ…μ„ 배울 μ˜ˆμ •μ΄λ‹€.


좜처: rust-lang book

이 ν¬μŠ€νŠΈλŠ” μ €μž‘κΆŒμžμ˜ CC BY-NC-ND 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.
졜근 μ—…λ°μ΄νŠΈ
λ°”λ‘œκ°€κΈ°

[Rust] 주석

[Rust] μ†Œμœ κΆŒμ΄λž€?