Swift Optional, OptionalUnwrapping

Regular Kim·2026년 5월 16일

기타

목록 보기
25/29

Swift Optional, OptionalUnwrapping

Optional

값이 없을 수도 있는 변수를 다루는 방법

let number1: Int = 10 // 가능
let number2: Int = nil // 불가능

number1은 문제 없다. 하지만 number2는 에러가 출력된다. nil값을 number2에 할당할 수 없기 때문이다.

let number2: Int? = nil // 가능
let number3: Int? = 3 // 가능

이제 에러가 출력되지 않는다. 타입 뒤에 물음표를 추가하여 해당 변수에 nil 값이 할당될 수 있음을 표시한다. 이를 Optional이라고 부른다. 물론 nil 뿐만 아니라 실제 숫자도 할당 가능하다.

Optional Unwrapping

아래와 같은 함수가 있다.

func square(number: Int) {
	print("\(number)의 제곱값은 \(number * number)입니다.")
}

square(number: number1) // 가능 > 10의 제곱값은 100입니다.
square(number: number2) // 불가능 > error: value of optional type must be unwrapped to a value of type 'Int'

이 함수에 위에서 정의한 number1을 할당하면 10의 제곱값은 100입니다.의 결과를 출력한다. 하지만 number2을 투입할 수 없다. 왜냐? 파라미터 타입으로 Optional을 받는다고 선언하지 않았기 때문이다. number2를 할당하고 싶다면 Optional을 벗겨내고(Unwrapping) 할당해야한다.

Optional Unwrapping을 하려면 4가지 방법을 사용할 수 있다.
1. nil-coalescing : 기본값 넣어주기
2. forced-unwrapping : 강제로 벗기기
3. optional binding1(if-let) : 조심히 벗기기1
4. optional binding2(guard-let) : 조심히 벗기기2

4가지 방법을 알아보자.

nil-coalescing : 기본값 넣어주기

square(number: number2 ?? 0) // > 0의 제곱값은 0입니다.
square(number: number3 ?? 0) // > 3의 제곱값은 9입니다.

?? 연산자를 사용하여 옵셔널 값이 nil일 경우 우측에 있는 기본값을 대신 사용하도록 한다. number2의 값이 nil이면 0을 파라미터로 지정한다.

forced-unwrapping : 강제로 벗기기

square(number: number2!) // > error: Unexpectedly found nil while unwrapping an Optional value
square(number: number3!) // > 3의 제곱값은 9입니다.

값 뒤에 느낌표를 붙여 강제로 옵셔널을 벗겨내는 방법이다. 당연하게도 벗겨낸 값이 nil이라면 에러가 발생하고 앱이 강제종료된다. 개발할 때만 사용해야하고, 배포할 때는 당연히 지양해야 하는 코드다.

optional binding1(if-let) : 조심히 벗기기1

if let num = number2 {
	square(number: num) // > (실행되지 않음)
} else {
	print("언래핑 실패") // > 언래핑 실패
}

if let num = number3 {
	square(number: num) // > 3의 제곱값은 9입니다.
}

Optional의 값이 nil이 아니라면 num 변수에 해당 값을 할당하는 문법이다. 그리고 할당이 됐다면 중괄호 안의 코드가 진행된다(num 상수는 if문 블록 안에서만 사용 가능). 할당 되지 않았다면 else문의 코드가 실행된다. else문 코드가 없다면 아무 동작도 하지 않는다.

optional binding2(guard-let) : 조심히 벗기기2

func guardLetExample(input: Int?) {
    guard let num = input else {
        print("언래핑 실패")
        return
    }
    square(number: num)
}

guardLetExample(input: number2) // > 언래핑 실패
guardLetExample(input: number3) // > 3의 제곱값은 9입니다.

함수나 반복문 등 제어문 안에서만 사용할 수 있는 문법이다. 언래핑에 실패하는 경우 else문에 지정된 코드가 실행된다. 언래핑에 성공하면 다음 코드로 넘어간다.

profile
What doesn't kill you, makes you stronger

0개의 댓글