Swift 문법 - if let, guard let 이해하기 [#12]

개발/iOS - Swift1 2025. 11. 7. 13:56

옵셔널(Optional) 먼저 이해하기

Swift에서는 변수나 상수가 값이 없을 수도 있다는 가능성을 표현하기 위해 Optional 타입을 사용합니다.
즉, 값이 있을 수도 있고(nil이 아닐 수도 있고), 없을 수도(nil일 수도 있고) 있는 상태를 안전하게 처리할 수 있도록 하는 기능이죠.

var name: String? = "홍길동"

위의 코드는 name이라는 변수가 String 값을 가질 수도 있고("홍길동"), nil이 될 수도 있다는 뜻입니다.
이제 이 값을 사용할 때에는 안전하게 꺼내는 방법이 필요합니다. 바로 그때 등장하는 것이 if let 과 guard let 입니다.

 


1. if let — 옵셔널 바인딩의 기본형

if let은 옵셔널 값이 nil이 아닐 때만 내부 블록을 실행하고, 그 안에서 안전하게 값을 꺼내 쓸 수 있게 해줍니다.

var name: String? = "홍길동"

if let unwrappedName = name {
    print("안녕하세요, \(unwrappedName)님!")
} else {
    print("이름이 없습니다.")
}

 

동작 원리

  • name이 nil이 아니라면, unwrappedName에 값이 할당되고 if 블록 내부 코드가 실행됩니다.
  • nil이라면 else 블록이 실행됩니다.

즉, 옵셔널 값을 안전하게 해제(unwrap) 하는 가장 기본적인 방법이죠.

 


여러 개를 동시에 바인딩하기

if let은 여러 개의 옵셔널을 한 번에 바인딩할 수도 있습니다.

var firstName: String? = "길동"
var lastName: String? = "홍"

if let first = firstName, let last = lastName {
    print("이름은 \(last)\(first)입니다.")
} else {
    print("이름 정보가 부족합니다.")
}

두 값 모두 nil이 아닐 때만 if 내부 코드가 실행됩니다.

하나라도 nil이라면 else 문으로 넘어가게 됩니다.

 


if let의 한계

if let 구문 안에서 바인딩된 변수(unwrappedName 등)는 해당 블록 내부에서만 유효합니다.
즉, 아래처럼 블록 밖에서는 사용할 수 없습니다.

if let name = name {
    print(name)
}
print(name) // X 여기서는 접근 불가

이런 경우, 코드 흐름을 이어가며 바인딩된 값을 계속 사용하고 싶다면 guard let이 훨씬 더 유용합니다.

 


2. guard let — 조기 탈출(Early Exit)

guard let은 조건이 만족되지 않으면 빠르게 함수를 종료(return) 시키고, 조건이 맞을 경우 이후 코드에서 계속 사용 가능하도록 하는 구문입니다.

반응형
func greet(name: String?) {
    guard let unwrappedName = name else {
        print("이름이 없습니다.")
        return
    }
    print("안녕하세요, \(unwrappedName)님!")
}

 

동작 원리

  • guard let은 조건이 성공하면 이후 코드로 진행,
  • 실패하면 else 블록을 실행하고 반드시 함수(또는 반복문 등)를 탈출(return) 해야 합니다.
  • guard let으로 언랩된 변수는 해당 함수 전체 범위에서 사용할 수 있습니다.

 


실제 예시 — 옵셔널 파라미터 처리

func divide(a: Int?, b: Int?) {
    guard let num1 = a, let num2 = b else {
        print("입력값이 잘못되었습니다.")
        return
    }
    guard num2 != 0 else {
        print("0으로 나눌 수 없습니다.")
        return
    }
    print("결과는 \(num1 / num2)입니다.")
}

divide(a: 10, b: 2)   // 결과는 5입니다.
divide(a: nil, b: 2)  // 입력값이 잘못되었습니다.
divide(a: 10, b: 0)   // 0으로 나눌 수 없습니다.

위 예시처럼 guard let을 이용하면, 조건이 맞지 않으면 일찍 함수를 탈출(Early Exit) 시켜 코드 흐름이 명확해집니다.

 

 

 

 

 

 


if let vs guard let 비교 정리

구분 if let guard let
목적 옵셔널 값이 존재할 때만 실행 옵셔널이 없으면 조기 탈출
사용 위치 주로 조건 분기 함수 초입부, 입력 검증 등
블록 밖에서 사용 X 불가능 O 가능
가독성 조건문 중첩 가능성 있음 코드 흐름이 단순하고 깔끔함

 


언제 어떤 걸 써야 할까?

  • if let → 특정 상황에서만 처리하고자 할 때
  • 예) "값이 있을 때만 이 부분 실행"
  • guard let → 함수 초입에서 입력 검증, nil 처리 후 빠르게 리턴할 때
  • 예) "조건을 만족하지 않으면 더 이상 진행하지 않는다"

실무에서는 대부분 guard let을 선호합니다.
가독성이 좋고, 조건이 맞지 않으면 초기에 리턴시켜 코드 흐름을 단순하게 유지할 수 있기 때문입니다.

 


정리

Swift의 if let과 guard let은 모두 옵셔널 바인딩(Optional Binding)을 위한 문법이지만

  • if let은 "조건이 맞을 때 실행"
  • guard let은 "조건이 안 맞으면 나간다"라는 차이가 있습니다.

안전한 코드, 즉 nil로 인한 앱 크래시를 방지하고 깔끔한 흐름을 유지하기 위해 이 두 문법은 Swift 개발에서 꼭 익혀야 할 기본기입니다.

반응형
admin