본문 바로가기
iOS/Swift

[Swift] 옵셔널과 언래핑(Optionals and Unwrapping)

by Dev.Andy 2023. 5. 8.

 

머리말

Swift 언어만의 특이한 자료형, 옵셔널(Optional)

Swift 언어를 계속 접하다 보면 다른 언어와는 다르게 물음표 기호(?)와 느낌표 기호(!)가 많은 것을 알 수 있다. 처음에는 생소한 개념이고 왜 이런 걸 쓰는지에 대한 의문이 남지만, 쓰면 쓸수록 유용하다는 옵셔널(Optional)에 대해 자세히 알아 보자.

참고 자료

 

옵셔널 타입(Optional Type)

정의

변수의 값이 없는 경우를 포함하는 임시적인 타입

'선택적인'이라는 뜻의 영단어 optional에서도 알 수 있듯이, 실제로 값이 있을지 없을지를 나타내는 임시적인 타입이다.

'optional'의 검색결과 : 네이버 영어사전

코드

var number: Int?
var greeting: String? = "Hello"

// Expression implicitly coerced from 'Int?' to 'Any'
print(number) // nil

// Expression implicitly coerced from 'String?' to 'Any'
print(greeting) // Optional("Hello")

목적

  • 옵셔널 타입이 없었을 때는 실수로 nil을 접근하는 경우가 많아 에러를 발생시켰다.
  • 에러 발생은 곧 앱의 실행 종료를 의미해서 치명적이다.
  • 이를 예방하기 위해 옵셔널 타입이 도입 되었다.

특징

  1. 일반 타입은 옵셔널에 담기지만, 반대는 성립하지 않는다.
  2. 옵셔널 타입의 값끼리는 임시적인 값이어서 서로 연산이 불가능하다
  3. 언래핑은 값이 nil인 경우는 되지 않으며 에러를 발생시킨다.

(질문) nil은 그러면 실제로 값이 없는 것인가?

(답안) nil은 값이 없는 게 아니라, 임시 값이 있지만 없는 것처럼 표현하는 임시적인 키워드(keyword)이다. 실제로는 임의의 값이 할당 되어 있으나 키워드로 나타날 뿐이다..

 

옵셔널 타입의 변환 3가지

1. 강제 언래핑(Forced Unwrapping)

추출 연산자(!)를 통하여 곧바로 옵셔널을 변환할 수 있다.

2. 옵셔널 바인딩(Optional Binding)

옵셔널 바인딩은 해당 옵셔널이 실제 값을 갖고 있는지 확인하고, 값이 있을 경우 해당 값을 임시적인 변수/상수에 할당하는 형식이다. 여기서 변수보다는 상수로서 자주 쓰이며 아래와 같이 두 가지 형식으로 많이 쓰인다.

  1. if let
  2. guard let

코드

import Foundation

// 옵셔널 변수 초기화
var number: Int? = 3
var myName: String? = "Andy"

// if let을 활용한 옵셔널 바인딩
if let level = number {
    print(level) // 3
    print(type(of: level)) // Int
}

if let studentName = myName {
    print(studentName) // Andy
    print(type(of: studentName)) // String
}

// guard let을 활용한 옵셔널 바인딩
func printName(_ name: String?) {
    guard let studentName = myName else { return }
    print(studentName)
    print(type(of: studentName)) 
}

printName(myName)
// Andy
// String

3. Nil 결합 연산자(Nil-Coalescing Operator)

연산자 ??는 Swift에서 옵셔널을 추출하되, 값이 nil일 경우에 대한 기본값을 제공하는 연산자이다.

이에 대한 내용은 아래에 정리해 놨으니 참고.

 

꼬리말

이렇게 Swift의 옵셔널에 대하여 개념과 특징, 코드를 실제 활용 방식을 알아 보았다. 나아가 옵셔널을 언래핑하여 어떻게 일반적인 타입으로의 변환하는지에 대해서도 알아 보았다.

 

댓글