κ°μ
ν¨μλ 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