본문 바로가기
iOS (Swift)

[오늘의 코드 조각] [iOS 2-2] Optional : Swift가 안전한 이유 (nil을 다루는 법)

by 생각하는 개발자님 2026. 2. 10.
반응형

안녕하세요, **'생각하는 개발자'**입니다.

안드로이드 개발을 하다 보면 우리를 가장 괴롭히는 에러가 무엇인가요? 바로 NullPointerException(NPE)입니다. 값이 있을 줄 알고 사용했는데, 알고 보니 비어 있어서 앱이 터져버리는 상황이죠.

Swift는 이런 비극을 막기 위해 **'Optional(옵셔널)'**이라는 개념을 도입했습니다. "이 변수에는 값이 있을 수도 있고, 없을 수도(nil) 있어!"라고 미리 선언해두는 것이죠. 마치 선물을 뜯어보기 전까지는 내용물이 있는지 없는지 모르는 '상자'와 같습니다.


2.2.1 옵셔널 선언: 상자에 담기 🏺

비유: 선물 상자 Swift에서는 일반적인 타입 뒤에 **물음표(?)**를 붙여서 옵셔널을 선언합니다.

  • String: 절대 비어있을 수 없는 일반 타입 (안전한 내용물)
  • String?: 값이 있을 수도, 없을 수도 있는 옵셔널 타입 (내용물이 든 상자)
import UIKit

var name: String = "생각하는 개발자"
// name = nil // 🚨 에러! 일반 타입엔 nil을 넣을 수 없어요.

var optionalName: String? = "HFood Joa"
optionalName = nil // ✅ 가능! 옵셔널 타입은 '비어있음(nil)'을 허용합니다.
 

2.2.2 옵셔널 추출: 상자 열기 (Optional Unwrapping) 📜

상자 안에 든 선물을 쓰려면 상자를 열어야겠죠? 이를 **언래핑(Unwrapping)**이라고 합니다. 가장 안전한 방법 두 가지를 기억하세요.

1. 옵셔널 바인딩 (if let) - 안전하게 열기

상자를 열어보고 내용물이 있으면 꺼내서 쓰고, 없으면 그냥 지나가는 방식입니다.

 
if let unwrappedName = optionalName {
    print("이름이 있네요! 이름은 \(unwrappedName)입니다.")
} else {
    print("이름이 비어있습니다(nil).")
}
 

2. 가드 문 (guard let) - 미리 걸러내기

주로 함수 안에서 사용하며, 값이 없으면 바로 함수를 종료(return)해버리는 깔끔한 방식입니다.

func printName(name: String?) {
    guard let safeName = name else {
        print("이름이 없어서 작업을 종료합니다.")
        return
    }
    print("안전하게 추출된 이름: \(safeName)")
}

2.2.3 강제 추출 (Force Unwrapping) : 앱이 터지는 지름길! 🚀

물음표(?) 대신 **느낌표(!)**를 쓰면 상자를 발로 차서 억지로 엽니다. 만약 상자가 비어있다면? 앱은 그대로 종료(Crash)됩니다.

// print(optionalName!) // 🚨 만약 optionalName이 nil이라면 앱이 터집니다!

Tip: 코틀린의 !!와 같습니다. 정말 100% 값이 있다고 확신할 때가 아니면 사용을 지양하세요.

📝 핵심 포인트 요약

  1. **Optional(?)**은 값이 없을 수도 있는 상황을 안전하게 관리하는 '상자'입니다.
  2. if let이나 guard let을 사용해 안전하게 값을 꺼내는 것이 Swift의 정석입니다.
  3. nil은 안드로이드의 null과 같은 의미입니다.
  4. [GitHub 소스 코드 링크]

 

 
반응형