# if let, while let

if let과 while let은 match 표현식과 유사하게 패턴 매칭을 수행하지만, 일반적인 match 구문보다 간결하게 특정 경우만 처리하고 싶은 상황에서 매우 유용하다. 둘 다 매칭해야 하는 경우의 수가 하나이거나, 혹은 가장 빈번한 케이스가 하나인 경우 깔끔한 문법으로 코드를 표현할 수 있다. 여기서는 if let, while let이 어떤 상황에서 쓰이는지, 그리고 match 구문과 어떤 차이가 있는지 살펴본다.

if let은 특정 패턴을 만족하는지 간단히 검사하고, 만족할 경우에만 블록 안의 코드를 실행한다. match 구문을 사용할 때는 모든 가능한 경우를 다 열거해야 하지만, if let은 한 가지 패턴만 매칭하면 되기 때문에 코드가 짧아진다. 예를 들어 Option 타입에서 Some 값을 꺼내올 때 자주 쓴다.

```
fn main() {
    let some_option = Some(10);

    if let Some(value) = some_option {
        println!("값을 꺼내왔다: {}", value);
    } else {
        println!("매칭되지 않았다.");
    }
}
```

위 예시에서 if let Some(value) = some\_option 구문은 some\_option이 Some으로 감싸진 값일 때만 블록이 실행되도록 한다. 만약 None이었다면 else 절이 실행된다. match 구문으로 작성하려면 같은 로직을 수행하기 위해서도 모든 경우를 다 기술해야 한다.

if let 문법은 다양한 패턴에 적용할 수 있다. 튜플, 구조체, 열거형 등 패턴 매칭이 가능한 모든 타입에 대해 사용 가능하다. 또한 여러 패턴을 연결하는 조건부 문장도 활용할 수 있다. 다만, 복잡한 경우에는 오히려 match가 더 직관적이 될 수 있으므로 상황에 따라 선택하는 것이 좋다.

while let은 반복문 안에서 특정 패턴을 만족하는 동안 반복을 계속하고, 패턴이 더 이상 만족되지 않으면 반복을 종료한다. 주로 Iterator를 통해 값을 순회하면서 일치하는 데이터를 처리하는 데 자주 사용한다.

```
fn main() {
    let mut numbers = vec![1, 2, 3, 4, 5].into_iter();

    while let Some(num) = numbers.next() {
        println!("숫자: {}", num);
    }

    println!("while let 반복문이 종료되었다.");
}
```

위 예시는 numbers라는 이터레이터에서 next() 메서드를 호출해 Some(num) 패턴이 매칭되는 동안 반복을 수행한다. next()가 None을 반환하면 while let 구문의 조건이 만족되지 않으므로 반복문이 종료된다. match 구문으로도 같은 동작을 할 수 있지만, 매 루프마다 match를 작성하는 것보다 while let이 훨씬 간결하다.

while let을 사용하면 반복 중에 특정 패턴만 걸러내서 처리할 수도 있다. 예를 들어 열거형을 이터레이터로부터 꺼내며 원하는 variant인 경우에만 반복을 계속하는 식으로 활용할 수 있다. 이 역시 match 구문으로 작성하면 패턴 매칭과 반복 로직이 섞여서 복잡해지기 쉽다.

if let과 while let은 match 구문을 부분적으로 축약해 주는 문법적 설탕(syntactic sugar)이다. 따라서 match의 강력한 패턴 매칭 개념을 그대로 상속받으면서 단순화된 형태로 코드를 짧고 명확하게 만들어 준다. 그러나 완전히 같은 기능을 제공하지는 않는다. match 구문은 모든 패턴을 exhaustively 하게 검증하는 반면, if let이나 while let은 특정 패턴에만 집중한다. 여러 갈래로 분기하는 로직이 필요하다면 match가 더 적절할 수도 있다.

패턴 매칭은 러스트의 강력한 특징 중 하나이며, if let과 while let은 이 패턴 매칭을 더욱 편리하게 만들기 위해 제공된 문법이다. 핵심은 다음과 같은 특징에 있다. 첫째, 처리하고자 하는 특정 패턴만 자주 발생하는 경우 if let과 while let을 사용하면 코드 양이 크게 줄고 가독성이 높아진다. 둘째, 남은 경우를 어떻게 처리할 것인지(else 절이나 반복 종료 등)를 명시함으로써 예외 상황에 대한 처리를 한눈에 파악할 수 있다. 셋째, 문법적으로 match보다 제한적이므로 복잡한 매칭 로직을 간단하게 대체할 수는 없지만, 특정 부분 매칭에 최적화되어 있다.

이러한 장점을 염두에 두고 구조체나 열거형, 튜플 등에서 부분적으로 값을 빼내야 하는 경우가 잦다면 if let이나 while let 사용을 적극 고려해 볼 수 있다. 상황마다 match, if let, while let을 조합하여 러스트가 제공하는 패턴 매칭의 편의성과 안정성을 극대화하는 것이 좋다.
