옵셔널 언래핑 (Optional Unwrapping)
📚 옵셔널 타입은 값이 없을수도 있는 경우를 안전하게 처리하기 위해 사용되지만, 값에 접근하면 Optional(값)으로 래핑 되어 있어서 바로 사용하지 못하는 불편함이 있습니다. 따라서 이 옵셔널로 래핑 된 값에서 옵셔널을 제거하고 값으로 변환하는 과정을 옵셔널 언래핑 이라고 부르며, 몇 가지 방법으로 이를 수행할 수 있습니다.
• 옵셔널 바인딩 • 강제 언래핑 옵셔널
• 기본값 제공 • 묵시적 언래핑
옵셔널 바인딩 (Optional Binding)
- 조건문 if , guard 구문을 사용하여 안전하게 옵셔널을 언래핑하는 방법입니다.
- if let
- if let을 사용하여 옵셔널 바인딩을 할 수 있습니다.
- 값이 있다면 if let 코드블록이 실행되고, 이 블록 안에서 언래핑 된 값을 사용할 수 있습니다.
- 값이 없을 때 작업을 하고 싶다면 else 코드블록을 작성하면 됩니다.
// 값이 있을 때 if let 옵셔널 바인딩 코드
var intValue: Int? = 10
if let intValue = intValue {
print(intValue) // 출력 값 : 10
// Optional 언래핑되어 실제 값이 출력됩니다.
// 옵셔널 언래핑된값은 해당 블록에서만 사용 가능합니다.
}
print(intValue) // Optional(10)
// 값이 없을 때 if let 옵셔널 바인딩을 사용하여 else에서 작업 진행
var optionalValue: String? // 아무런 값을 주지않아서 nil인 상태
if let optionalValue = optionalValue {
print(optionalValue) // optionalValue가 nil이 아니면 해당 코드블록이 실행되어 값이 출력됩니다.
} else {
print("optionalValue 값은 nil 입니다.") // 출력 값 : optionalValue 값은 nil 입니다.
}
- guard let
- guard let 구문은 옵셔널 바인딩 결과가 nil일 경우, 해당 코드 블록을 빠져나가게 하여 이후 코드가 실행되지 않도록 합니다.
- 클로저나 메서드 내부에서 주로 사용됩니다.
- 코드의 가독성을 높이고, 중첩된 조건문을 피할 수 있습니다.
// 값이 없는 경우
func guardLetFunction() {
var optionalValue: String? // 아무런 값을 주지않아서 nil인 상태
guard let optionalValue = optionalValue else {
print("guard 실행") // optionalValue가 nil이면 해당 코드블록이 실행됩니다.
return // 함수를 종료하여 아래의 코드로 내려가지 못하게 막습니다.
}
print(optionalValue) // 위의 guard let에서 함수가 종료되어 실행되지 못함
}
guardLetFunction()
/* 출력 값
"guard 실행"
*/
func guardLetFunction() {
var optionalValue: String? = "Hello"
guard let optionalValue = optionalValue else {
print("guard 실행")
return // 함수를 종료하여 아래의 코드로 내려가지 못하게 막습니다.
}
print(optionalValue) // Optional이 언래핑된 값 "Hello"가 출력됩니다.
}
guardLetFunction()
/* 출력 값
"Hello"
*/
기본값 제공
- Nil-결합 연산자(Nil-Coalescing Operator) 방법을 사용하는 방법입니다.
- 옵셔널 값 뒤에 ?? 를 붙인 후 기본값을 제공할 수 있습니다.
- 옵셔널 값이 nil이면 ?? 뒤에 있는 기본 값을 사용합니다.
let name: String? = nil
print(name ?? "Default Name") // 값이 nil이여서 ?? 뒤에 있는 "Default Name"이 출력됩니다.
let greeting = "안녕하세요 \(name ?? "A")님!"
print(greeting) // "안녕하세요 A님!" 이 호출됩니다.
// name이 nil이여서 기본 값 "A"를 사용합니다.
옵셔널 강제 언래핑 (force unwrapping)
- 옵셔널 값에 ! 를 붙여서 사용합니다.
- nil이 아니라면 언래핑이 되지만 nil이면 런타임오류를 발생시킵니다!
- nil 이 아님을 확신할 때 사용합니다.
- 지양하는 것이 좋습니다.
var name: String? = "Brody"
print(name!) // "Brody" 출력
name = nil
print(name!) // 런타임 오류 발생
옵셔널 묵시적 언래핑(Implicitly Unwrapped Optional)
- 옵셔널 타입을 선언할 때 ?가 아닌 !를 사용하면 묵시적 언래핑 되는 옵셔널로 정의할 수 있습니다.
- 값을 사용할 때 자동으로 언래핑되어, 별도의 언래핑 작업 없이 직접 사용할 수 있습니다.
- 값이 nil 일 때 접근하면 런타임 오류가 발생합니다.
- 값이 있다고 확신이 들 때 사용해야 합니다.
- 옵셔널 바인딩이 가능합니다.
var name: String! = "Brody" // 타입을 String!으로 설정하여 묵시적 옵셔널 언래핑을 사용
print(name) // Optional("Brody") : 값 자체는 옵셔널
print(name.count) // 5 : 값에서 가져온 값은 옵셔널값이 아닌 일반 값 출력
if let name = name {
print(name) // "Brody" 출력
}
'스파르타 코딩 클럽 - iOS 스타터 6기 > 본 캠프' 카테고리의 다른 글
17. 스파르타 코딩 클럽 - 프로토콜 (Protocol), 확장 (Extension) (0) | 2025.03.17 |
---|---|
16. 스파르타 코딩 클럽 - 접근제어자 (0) | 2025.03.17 |
14. 스파르타 코딩 클럽 - 옵셔널 (1) | 2025.03.17 |
13. 스파르타 코딩 클럽 - 프로그래밍 기초 주차 과제 Lv3 (0) | 2025.03.14 |
12. 스파르타 코딩 클럽 - 열거형 (Enum) (1) | 2025.03.13 |