ν™ˆ [Rust] ν•¨μˆ˜
포슀트
μ·¨μ†Œ

[Rust] ν•¨μˆ˜


Title


κ°œμš”

ν•¨μˆ˜λŠ” Rustμ—μ„œ 많이 μ‚¬μš©λœλ‹€. κ°€μž₯ 기본적인 ν•¨μˆ˜λ‘œλŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•˜λŠ” main ν•¨μˆ˜κ°€ μžˆλ‹€. ν•¨μˆ˜λŠ” fn ν‚€μ›Œλ“œλ₯Ό 톡해 λ§Œλ“€ 수 μžˆλ‹€.

Rustμ—μ„œ ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ˜ 이름을 μ§“λŠ” 방식은 보톡 μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€λ₯Ό λ”°λ₯Έλ‹€. μ—¬κΈ°μ„œ μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€λž€, λͺ¨λ“  κΈ€μžλ₯Ό μ†Œλ¬Έμžλ‘œ μ“°κ³ , 단어 사이에 밑쀄을 λ„£λŠ” 방식을 λœ»ν•œλ‹€. μ•„λž˜ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž:

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
9
fn main() {
    println!("Hello, world!");

    another_function();
}

fn another_function() {
    println!("Another function.");
}

Rustμ—μ„œ ν•¨μˆ˜λŠ” fn ν‚€μ›Œλ“œ 뒀에 ν•¨μˆ˜ 이름과 κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•΄ μ •μ˜ν•  수 μžˆλ‹€. ν•¨μˆ˜μ˜ λ‚΄μš©μ€ μ€‘κ΄„ν˜Έ μ•ˆμ— μž‘μ„±ν•˜λ©°, 이 μ€‘κ΄„ν˜ΈλŠ” μ»΄νŒŒμΌλŸ¬μ—κ²Œ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹œμž‘κ³Ό 끝을 μ•Œλ €μ€€λ‹€.

μ •μ˜ν•œ ν•¨μˆ˜λŠ” κ·Έ 이름 λ‹€μŒμ— κ΄„ν˜Έλ₯Ό λΆ™μ—¬μ„œ ν˜ΈμΆœν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, another_function은 ν”„λ‘œκ·Έλž¨ 내에 이미 μ •μ˜λ˜μ–΄ μžˆμœΌλ―€λ‘œ, main ν•¨μˆ˜μ—μ„œ 이λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. μ†ŒμŠ€ μ½”λ“œμ—μ„œ main ν•¨μˆ˜ 뒀에 another_function을 μ •μ˜ν–ˆμ§€λ§Œ, ν•„μš”ν•˜λ‹€λ©΄ main ν•¨μˆ˜ μ•žμ— μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€. Rustμ—μ„œλŠ” ν•¨μˆ˜κ°€ 어디에 μœ„μΉ˜ν•˜λŠ”μ§€λŠ” μ€‘μš”ν•˜μ§€ μ•Šλ‹€. μ€‘μš”ν•œ 것은 κ·Έ ν•¨μˆ˜κ°€ 호좜될 λ•Œ κ·Έ μœ„μΉ˜κ°€ 확인될 수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것이닀.

λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν™œμš©μ„ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ functionsλΌλŠ” μ΄λ¦„μ˜ μƒˆλ‘œμš΄ ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€μ–΄λ³΄μž. μœ„ another_function 예제λ₯Ό src/main.rs νŒŒμΌμ— μž‘μ„±ν•œ ν›„ μ‹€ν–‰ν•˜λ©΄, μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ 좜λ ₯될 것이닀.

1
2
3
4
5
6
$ cargo run
   Compiling functions v0.1.0 (file:///projects/functions)
    Finished dev [unoptimized + debuginfo] target(s) in 0.28s
     Running `target/debug/functions`
Hello, world!
Another function.

main ν•¨μˆ˜ μ•ˆμ˜ μ½”λ“œλŠ” μœ„μ—μ„œλΆ€ν„° μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λœλ‹€. μ²˜μŒμ—λŠ” β€œHello, world!β€λΌλŠ” λ©”μ‹œμ§€κ°€ 화면에 좜λ ₯λœλ‹€. 이후 another_function ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λ©΄μ„œ κ·Έ μ•ˆμ˜ λ©”μ‹œμ§€κ°€ 좜λ ₯λœλ‹€.


맀개 λ³€μˆ˜

ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ νŠΉμ • λ³€μˆ˜λ“€μ„ ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜μ— ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€. μ΄λŸ¬ν•œ λ³€μˆ˜λ“€μ„ λ§€κ°œλ³€μˆ˜λΌκ³  ν•œλ‹€. ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜κ°€ 있으면, ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜μ— ꡬ체적인 값을 전달할 수 μžˆλ‹€. μ΄λ ‡κ²Œ μ „λ‹¬λ˜λŠ” ꡬ체적인 값을 인수라고 ν•œλ‹€.

another_functionμ΄λΌλŠ” ν•¨μˆ˜μ˜ μƒˆλ‘œμš΄ 버전에 λ§€κ°œλ³€μˆ˜λ₯Ό ν¬ν•¨μ‹œμΌ°λ‹€:

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!("x의 값은: {x}");
}

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

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

ν•¨μˆ˜ another_function은 xλΌλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜λ‚˜ κ°–κ³  μžˆλ‹€. 이 λ§€κ°œλ³€μˆ˜ x의 μžλ£Œν˜•μ€ i32둜 μ •μ˜λ˜μ–΄ μžˆλ‹€. another_function에 5λΌλŠ” 값이 전달될 λ•Œ, println! λ§€ν¬λ‘œλŠ” 포맷 λ¬Έμžμ—΄ 쀑 xλ₯Ό λŒ€ν‘œν•˜λŠ” μ€‘κ΄„ν˜Έ μœ„μΉ˜μ— 5λ₯Ό ν‘œμ‹œν•œλ‹€.

ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•ŒλŠ” 각 λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μ„ λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€. μ΄λŠ” Rust의 핡심 원칙 쀑 ν•˜λ‚˜μ΄λ‹€. 이 원칙 덕뢄에 μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œμ˜ λ‹€λ₯Έ λΆ€λΆ„μ—μ„œ νƒ€μž…μ„ μΆ”λ‘ ν•  λ•Œ, 좔가적인 정보 없이도 μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ‹€. λ˜ν•œ, μ—λŸ¬ λ°œμƒ μ‹œ 더 μ •ν™•ν•œ λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.

ν•¨μˆ˜ λ‚΄μ—μ„œ μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ μ‰Όν‘œλ‘œ 각 λ§€κ°œλ³€μˆ˜λ₯Ό κ΅¬λΆ„ν•˜λ©΄ λœλ‹€:

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
fn main() {
    print_labeled_measurement(5, 'h');
}

fn print_labeled_measurement(value: i32, unit_label: char) {
    println!("μΈ‘μ • 값은: {value}{unit_label}");
}

이 μ˜ˆμ œμ—μ„œλŠ” print_labeled_measurementλΌλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€. 이 ν•¨μˆ˜λŠ” value와 unit_label 두 개의 λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ”λ‹€. value의 μžλ£Œν˜•μ€ i32이며, unit_label의 μžλ£Œν˜•μ€ char이닀. ν•¨μˆ˜λŠ” 이 두 λ§€κ°œλ³€μˆ˜λ₯Ό ν¬ν•¨ν•˜μ—¬ 좜λ ₯문을 μ‹€ν–‰ν•œλ‹€.

μœ„μ˜ 예제 μ½”λ“œλ₯Ό μ‹€μ œλ‘œ μ‹€ν–‰ν•΄ 보렀면, functions ν”„λ‘œμ νŠΈ λ‚΄μ˜ src/main.rs 파일의 λ‚΄μš©μ„ ν•΄λ‹Ή 예제둜 λ³€κ²½ν•œ ν›„, cargo run λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰ν•˜λ©΄ λœλ‹€.

1
2
3
4
5
$ cargo run
   Compiling functions v0.1.0 (file:///projects/functions)
    Finished dev [unoptimized + debuginfo] target(s) in 0.31s
     Running `target/debug/functions`
μΈ‘μ • 값은: 5h

value λ§€κ°œλ³€μˆ˜μ— 5λ₯Ό, unit_label λ§€κ°œλ³€μˆ˜μ— hλ₯Ό 인수둜 μ „λ‹¬ν•˜μ˜€λ‹€. λ”°λΌμ„œ ν”„λ‘œκ·Έλž¨μ˜ 좜λ ₯ 결과에 ν•΄λ‹Ή 값듀이 λ‚˜νƒ€λ‚˜κ²Œ 된 것이닀.


ꡬ문과 ν‘œν˜„μ‹

Rustμ—μ„œ ν•¨μˆ˜μ˜ 본문은 주둜 ꡬ문으둜 κ΅¬μ„±λ˜λ©°, μ„ νƒμ μœΌλ‘œ ν‘œν˜„μ‹μœΌλ‘œ μ’…λ£Œλ  수 μžˆλ‹€. μ§€κΈˆκΉŒμ§€ 닀룬 ν•¨μˆ˜λ“€μ€ μ’…λ£Œ ν‘œν˜„μ‹μ΄ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šμ•˜λ‹€. κ·ΈλŸ¬λ‚˜, ꡬ문의 μΌλΆ€λ‘œμ„œ ν‘œν˜„μ‹μ„ λ³Ό 수 μžˆμ—ˆλ‹€. RustλŠ” ν‘œν˜„μ‹ μ€‘μ‹¬μ˜ μ–Έμ–΄μ΄λ―€λ‘œ, 이런 차이λ₯Ό μ΄ν•΄ν•˜λŠ” 것은 맀우 μ€‘μš”ν•˜λ‹€. λ‹€λ₯Έ μ–Έμ–΄λ“€κ³ΌλŠ” μ΄λŸ¬ν•œ 차이가 λ‹€λ₯Ό 수 μžˆμœΌλ―€λ‘œ, ꡬ문과 ν‘œν˜„μ‹μ΄ 무엇인지, 그리고 이 두 가지가 ν•¨μˆ˜ 본문에 μ–΄λ–»κ²Œ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž.

  • ꡬ문은 μ–΄λ– ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” λͺ…λ Ήμ–΄λ‘œ, 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • ν‘œν˜„μ‹μ€ μ–΄λ– ν•œ 값을 ν‰κ°€ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

μ‹€μ œλ‘œ μš°λ¦¬λŠ” 이미 ꡬ문과 ν‘œν˜„μ‹μ„ μ‚¬μš©ν•΄μ™”λ‹€. let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ³  κ·Έ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜λŠ” 것은 ꡬ문에 ν•΄λ‹Ήν•œλ‹€. 예λ₯Ό λ“€μ–΄, let y = 6;λŠ” ꡬ문이닀.

파일λͺ…: src/main.rs

1
2
3
4
5
// ꡬ문 ν•˜λ‚˜λ₯Ό ν¬ν•¨ν•˜λŠ” main ν•¨μˆ˜ μ„ μ–Έ

fn main() {
    let y = 6;
}

이 μ½”λ“œμ—μ„œ fn main() {...}λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” ꡬ문이닀. 그리고 μœ„μ˜ 전체 μ˜ˆμ œλŠ” κ·Έ 자체둜 ν•˜λ‚˜μ˜ 큰 ꡬ문이닀.

ꡬ문은 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” νŠΉμ„±μ΄ 있기 λ•Œλ¬Έμ—, let ꡬ문을 λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ €κ³  μ‹œλ„ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

파일λͺ…: src/main.rs

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

1
2
3
fn main() {
    let x = (let y = 6);
}

이 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄, λ‹€μŒκ³Ό 같은 μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό λ³Ό 수 μžˆλ‹€:

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
32
33
34
35
36
37
38
39
40
$ cargo run
   Compiling functions v0.1.0 (file:///projects/functions)
error: ν‘œν˜„μ‹μ„ κΈ°λŒ€ν–ˆμœΌλ‚˜ `let` ꡬ문을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€
 --> *src/main.rs*:2:14
  |
2 |     let x = (let y = 6);
  |              ^^^

error: ν‘œν˜„μ‹ μœ„μΉ˜μ—μ„œ κΈ°λŒ€λ˜λŠ” 것은 ꡬ문(`let`)이 μ•„λ‹™λ‹ˆλ‹€
 --> *src/main.rs*:2:14
  |
2 |     let x = (let y = 6);
  |              ^^^^^^^^^
  |
  = μ°Έκ³ : `let`을 μ‚¬μš©ν•œ λ³€μˆ˜ 선언은 κ΅¬λ¬Έμž…λ‹ˆλ‹€

error[E0658]: 이 μœ„μΉ˜μ—μ„œμ˜ `let` ν‘œν˜„μ‹μ€ μ•ˆμ •μ μ΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
 --> *src/main.rs*:2:14
  |
2 |     let x = (let y = 6);
  |              ^^^^^^^^^
  |
  = μ°Έκ³ : 더 λ§Žμ€ μ •λ³΄λŠ” 이슈 #53667 <https://github.com/rust-lang/rust/issues/53667>λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”

warning: ν• λ‹Ήλœ κ°’ 주변에 λΆˆν•„μš”ν•œ κ΄„ν˜Έκ°€ μžˆμŠ΅λ‹ˆλ‹€
 --> *src/main.rs*:2:13
  |
2 |     let x = (let y = 6);
  |             ^         ^
  |
  = μ°Έκ³ : `#[warn(unused_parens)]`κ°€ 기본적으둜 ν™œμ„±ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€
help: 이 κ΄„ν˜Έλ₯Ό μ œκ±°ν•˜μ„Έμš”
  |
2 -     let x = (let y = 6);
2 +     let x = let y = 6;
  |

이 μ—λŸ¬μ— λŒ€ν•œ 더 μžμ„Έν•œ μ •λ³΄λŠ” `rustc --explain E0658`λ₯Ό μ‹œλ„ν•΄λ³΄μ„Έμš”.
κ²½κ³ : `functions` (bin "functions")λŠ” 1개의 κ²½κ³ λ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€
error: 이전 3개의 μ—λŸ¬λ‘œ 인해 `functions`λ₯Ό μ»΄νŒŒμΌν•  수 μ—†μŠ΅λ‹ˆλ‹€; 1개의 κ²½κ³ κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€

let y = 6 ꡬ문은 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, x에 바인딩될 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŠ” Cλ‚˜ Ruby 같은 λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό 차이가 μžˆλ‹€. κ·Έ μ–Έμ–΄λ“€μ—μ„œλŠ” ν• λ‹Ή μ—°μ‚°μžκ°€ ν• λ‹Ήλœ 값을 λ°˜ν™˜ν•˜λ―€λ‘œ, x = y = 6처럼 μž‘μ„±ν•˜μ—¬ x와 y λ‘˜ λ‹€ 6의 값을 κ°–κ²Œ ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ Rustμ—μ„œλŠ” 이와 같은 λ™μž‘μ„ ν•˜μ§€ μ•ŠλŠ”λ‹€.

λŒ€λΆ€λΆ„μ˜ Rust μ½”λ“œλŠ” 값을 λ°˜ν™˜ν•˜λŠ” ν‘œν˜„μ‹μœΌλ‘œ κ΅¬μ„±λœλ‹€. μ˜ˆμ»¨λŒ€, 5 + 6은 11μ΄λΌλŠ” 값을 λ°˜ν™˜ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€. ν‘œν˜„μ‹μ€ ꡬ문 λ‚΄μ—μ„œλ„ μ‚¬μš©λ  수 μžˆλ‹€. μœ„μ—μ„œ λ³Έ let y = 6;의 경우, 6은 6μ΄λΌλŠ” 값을 λ°˜ν™˜ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€. ν•¨μˆ˜λ‚˜ 맀크둜 호좜 λ˜ν•œ ν‘œν˜„μ‹μ— ν•΄λ‹Ήν•œλ‹€. λ˜ν•œ, μ€‘κ΄„ν˜Έ {}λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ μŠ€μ½”ν”„ 블둝 μ—­μ‹œ ν‘œν˜„μ‹μœΌλ‘œ κ°„μ£Όλœλ‹€. 예λ₯Ό λ“€λ©΄:

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("y의 값은: {y}");
}

μœ„μ˜ ν‘œν˜„μ‹:

1
2
3
4
{
    let x = 3;
    x + 1
}

이 경우, μœ„μ˜ μŠ€μ½”ν”„λŠ” 4둜 ν‰κ°€λ˜λ©°, ν•΄λ‹Ή 값은 let ꡬ문의 μΌλΆ€λ‘œ y에 λ°”μΈλ”©λœλ‹€. μ£Όμ˜ν•  점은 x + 1의 쀄 끝에 μ„Έλ―Έμ½œλ‘ μ΄ μ—†λ‹€λŠ” 것이닀. 이전에 λ³Έ λŒ€λΆ€λΆ„μ˜ μ½”λ“œ μ€„κ³ΌλŠ” 달리, ν‘œν˜„μ‹μ€ λ§ˆμ§€λ§‰μ— μ„Έλ―Έμ½œλ‘ μ„ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. ν‘œν˜„μ‹ 끝에 μ„Έλ―Έμ½œλ‘ μ„ μΆ”κ°€ν•˜κ²Œ 되면 그것은 ꡬ문이 λ˜μ–΄, 값을 λ°˜ν™˜ν•˜μ§€ μ•Šκ²Œ λœλ‹€. ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ„ κ²°μ •ν•˜κ±°λ‚˜ ν‘œν˜„μ‹μ„ λ‹€λ£° λ•Œ 이 뢀뢄은 νŠΉλ³„νžˆ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.


λ°˜ν™˜κ°’μ„ 가진 ν•¨μˆ˜

ν•¨μˆ˜λŠ” 값을 λ°˜ν™˜ν•˜μ—¬ κ·Έ 값을 ν˜ΈμΆœν•œ μ½”λ“œμ— μ „λ‹¬ν•œλ‹€. λ°˜ν™˜κ°’μ˜ 이름을 λ³„λ„λ‘œ 지정할 ν•„μš”λŠ” μ—†μ§€λ§Œ, λ°˜ν™˜ νƒ€μž…μ€ ν™”μ‚΄ν‘œ(->) λ‹€μŒμ— λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€. Rustμ—μ„œλŠ” ν•¨μˆ˜μ˜ λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ˜ 값이 κ·Έ ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ²˜λ¦¬λœλ‹€. return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 값을 λ°˜ν™˜ν•˜λŠ” 것도 κ°€λŠ₯ν•˜μ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ ν•¨μˆ˜λŠ” λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ˜ 값을 μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. μ•„λž˜λŠ” λ°˜ν™˜κ°’μ„ 가진 ν•¨μˆ˜μ˜ μ˜ˆμ‹œμ΄λ‹€.

파일λͺ…: src/main.rs

1
2
3
4
5
6
7
8
9
fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("x의 값은: {x}");
}

five ν•¨μˆ˜λŠ” 숫자 5λ§Œμ„ ν¬ν•¨ν•˜κ³  있으며, ν•¨μˆ˜ ν˜ΈμΆœμ΄λ‚˜ 맀크둜, let ꡬ문은 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. μ΄λŠ” Rust의 νŠΉλ³„ν•œ ν•¨μˆ˜ ν˜•νƒœμ΄λ‹€. λ˜ν•œ, λ°˜ν™˜ νƒ€μž…μ΄ -> i32둜 μ§€μ •λ˜μ–΄ μžˆμŒμ„ 확인할 수 μžˆλ‹€. μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄, λ‹€μŒκ³Ό 같은 좜λ ₯ κ²°κ³Όλ₯Ό λ³Ό 수 μžˆλ‹€:

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

five ν•¨μˆ˜ λ‚΄λΆ€μ˜ 5λŠ” ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ, μ΄λŠ” λ°˜ν™˜ νƒ€μž…μ΄ i32κ°€ λ˜λŠ” μ΄μœ μ΄λ‹€. 더 깊이 λ“€μ–΄κ°€ 보면, 첫 번째둜, let x = five(); ꡬ문은 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ„ λ³€μˆ˜μ— μ΄ˆκΈ°ν™”ν•˜λŠ” 것을 보여쀀닀. five ν•¨μˆ˜κ°€ 5λ₯Ό λ°˜ν™˜ν•˜λ―€λ‘œ, ν•΄λ‹Ή ꡬ문은 μ•„λž˜μ™€ 같이 이해할 수 μžˆλ‹€:

1
let x = 5;

그리고 five ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜κ°€ μ—†λ‹€. λ°˜ν™˜ νƒ€μž…μ€ μ •μ˜λ˜μ–΄ μžˆμ§€λ§Œ, ν•¨μˆ˜ λ³Έλ¬Έ λ‚΄μ—λŠ” 였직 λ°˜ν™˜ν•˜κ³ μž ν•˜λŠ” κ°’μ˜ ν‘œν˜„μ‹μΈ 5만 μ‘΄μž¬ν•œλ‹€.

λ‹€λ₯Έ 예둜, λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

파일λͺ…: src/main.rs

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

    println!("x의 값은: {x}");
}

fn plus_one(x: i32) -> i32 {
    x + 1
}

이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ "x의 값은: 6"이 좜λ ₯λœλ‹€. ν•˜μ§€λ§Œ, x + 1 라인의 끝에 μ„Έλ―Έμ½œλ‘ μ„ μΆ”κ°€ν•˜λ©΄, 그것은 ν‘œν˜„μ‹μ—μ„œ ꡬ문으둜 λ°”λ€Œκ²Œ 되고, 이둜 인해 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€:

파일λͺ…: src/main.rs

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

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

    println!("x의 값은: {x}");
}

fn plus_one(x: i32) -> i32 {
    x + 1;
}

이 μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λ©΄ λ‹€μŒκ³Ό 같은 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cargo run
   Compiling functions v0.1.0 (file:///projects/functions)
error[E0308]: mismatched types
 --> src/main.rs:7:24
  |
7 | fn plus_one(x: i32) -> i32 {
  |    --------            ^^^ expected `i32`, found `()`
  |    |
  |    implicitly returns `()` as its body has no tail or `return` expression
8 |     x + 1;
  |          - help: remove this semicolon to return this value

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

mismatched types μ—λŸ¬λŠ” plus_one ν•¨μˆ˜κ°€ i32 νƒ€μž… 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œλ €μ€€λ‹€. κ·ΈλŸ¬λ‚˜ ν˜„μž¬ μ½”λ“œλŠ” 아무 값도 λ°˜ν™˜ν•˜μ§€ μ•Šκ³ , ()(μœ λ‹› νƒ€μž…)을 λ°˜ν™˜ν•œλ‹€. 이둜 인해 ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…κ³Ό 좩돌이 λ°œμƒν•˜λ©° μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μ—λŸ¬ λ©”μ‹œμ§€κ°€ μ œμ‹œν•œ λ‚΄μš©λŒ€λ‘œ μ„Έλ―Έμ½œλ‘ μ„ μ œκ±°ν•˜λ©΄ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.


좜처: rust-lang book

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

[Rust] μžλ£Œν˜•

[Rust] 주석