반응형
안녕하세요, **'생각하는 개발자'**입니다.
안드로이드 개발을 하다 보면 우리를 가장 괴롭히는 에러가 무엇인가요? 바로 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)'을 허용합니다.
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).")
}
print("이름이 있네요! 이름은 \(unwrappedName)입니다.")
} else {
print("이름이 비어있습니다(nil).")
}
2. 가드 문 (guard let) - 미리 걸러내기
주로 함수 안에서 사용하며, 값이 없으면 바로 함수를 종료(return)해버리는 깔끔한 방식입니다.
func printName(name: String?) {
guard let safeName = name else {
print("이름이 없어서 작업을 종료합니다.")
return
}
print("안전하게 추출된 이름: \(safeName)")
}
guard let safeName = name else {
print("이름이 없어서 작업을 종료합니다.")
return
}
print("안전하게 추출된 이름: \(safeName)")
}
2.2.3 강제 추출 (Force Unwrapping) : 앱이 터지는 지름길! 🚀
물음표(?) 대신 **느낌표(!)**를 쓰면 상자를 발로 차서 억지로 엽니다. 만약 상자가 비어있다면? 앱은 그대로 종료(Crash)됩니다.
// print(optionalName!) // 🚨 만약 optionalName이 nil이라면 앱이 터집니다!
Tip: 코틀린의 !!와 같습니다. 정말 100% 값이 있다고 확신할 때가 아니면 사용을 지양하세요.
📝 핵심 포인트 요약
- **Optional(?)**은 값이 없을 수도 있는 상황을 안전하게 관리하는 '상자'입니다.
- if let이나 guard let을 사용해 안전하게 값을 꺼내는 것이 Swift의 정석입니다.
- nil은 안드로이드의 null과 같은 의미입니다.
- [GitHub 소스 코드 링크]
반응형
'iOS (Swift)' 카테고리의 다른 글
| [오늘의 코드 조각] [iOS 2-4] 클래스와 구조체 : 객체지향 vs 값 타입, Swift가 구조체를 사랑하는 이유 (0) | 2026.02.11 |
|---|---|
| [오늘의 코드 조각] [iOS 2-3] 제어문과 함수 : 조건문, 반복문, 그리고 Swift다운 함수 작성법 (0) | 2026.02.11 |
| [오늘의 코드 조각] [iOS 2-1] Swift 문법 정수 : 변수와 상수의 본질 (let vs var) (0) | 2026.02.10 |
| [오늘의 코드 조각] [iOS 1-3] Hello Swift World! : 첫 프로젝트 생성과 시뮬레이터 구동 (0) | 2026.02.09 |
| [오늘의 코드 조각] [iOS 1-2] 안드로이드 vs iOS : 개발자가 알아야 할 두 플랫폼의 철학 차이 (1) | 2026.02.04 |