798 단어
4 분
조건문

if / else#

if문은 if bool 형태로 작동합니다.
만약 bool 값이 true라면 아래 코드가 실행되며, 아니면 else 쪽의 코드가 실행됩니다.

main.rs
fn main() {
let a = 0;
if a == 0 {
print!("a는 짝수도 홀수도 아니야!");
} else if a % 2 == 0 {
print!("a는 짝수야!");
} else {
print!("a는 홀수야!");
}
}

if는 표현식#

러스트에서 if표현식(Expression) 이라서 값을 반환할 수 있습니다. 즉, if 전체를 변수에 바로 대입할 수 있습니다.

main.rs
fn main() {
let a = 5;
let msg = if a % 2 == 0 { "짝수" } else { "홀수" };
println!("{}", msg);
}

match / if let#

matchif let 둘 다 패턴을 사용합니다. 패턴에 대한 자세한 설명은 아래에 있습니다.

if let#

if let pattern = value 형식으로 쓰이며, value가 패턴과 일치한다면 아래 코드가 실행되고, 아니면 else문이 실행됩니다.

main.rs
fn main() {
let a = Some(1121);
if let Some(x) = a {
println!("The value is: {}", x);
} else {
println!("No value found");
}
if let None = a {
println!("No value found");
} else {
println!("The value found");
}
}

if let은 match의 축약형#

사실 if letmatch를 간단히 쓰는 방법입니다.

main.rs
let a = Some(10);
// if let
if let Some(x) = a {
println!("value: {x}");
}
// 같은 의미의 match
match a {
Some(x) => println!("value: {x}"),
_ => {}
}

match#

if let과 다르게 많은 패턴을 매칭시켜야 한다면 match를 사용합니다.

main.rs
fn main() {
let a: i32 = 10;
match a {
x @ 0..=10 => { // @ 바인딩
println!("0~10사이: {}", x)
}
x @ _ => {
println!("다른 값: {}", x);
}
}
}

match는 모든 경우를 처리해야 함#

러스트의 match빠짐없이 모든 경우를 처리해야 합니다. 그래서 _ 와일드카드를 자주 사용합니다.

main.rs
let a = 42;
match a {
0 => println!("zero"),
1 | 2 => println!("one or two"),
_ => println!("그 외 값"), // 없으면 컴파일 에러
}

pattern#

패턴은 기본값, range, or, enum, @ 바인딩, 와일드카드(_), 구조체/튜플 분해 등을 사용해 표현됩니다.

range#

특정 값 사이에 있는지를 검사할 때 사용됩니다.

  • 0~10 사이의 값 → 0..=10
  • a~c 사이의 값 → 'a'..='c'
main.rs
let c = 'b';
match c {
'a'..='c' => println!("a~c 사이"),
_ => println!("그 외"),
}

or#

| 연산자를 사용합니다.

main.rs
match 10 {
1 | 10 => println!("1 또는 10"),
_ => println!("그 외"),
}

enum#

enum 안의 값을 꺼낼 수 있습니다.

main.rs
let a = Some(7);
match a {
Some(x) => println!("값: {}", x),
None => println!("값 없음"),
}

와일드카드 _#

모든 값과 매칭됩니다.

main.rs
match 100 {
1 => println!("1"),
_ => println!("그 외 모든 값"),
}

구조체 / 튜플 분해#

패턴 매칭으로 내부 값을 쉽게 꺼낼 수 있습니다.

main.rs
struct Point(i32, i32);
fn main() {
let p = Point(3, 7);
match p {
Point(x, 0) => println!("x축 위에 있음: {x}"),
Point(0, y) => println!("y축 위에 있음: {y}"),
Point(x, y) => println!("좌표 ({x}, {y})"),
}
}

@ 바인딩#

패턴에 매칭된 값을 변수에 바인딩해서 사용할 수 있습니다.

main.rs
fn main() {
let a = 7;
match a {
x @ 1..=10 => println!("1~10 사이, 값은 {x}"),
_ => println!("그 외 값"),
}
}