안녕하세요 오늘은 옵셔널(Optional)에 대해 공부해보려고 합니다.
실제 앱을 만들 때 이 옵셔널 때문에
시간이 오래 걸렸던 기억이 납니다.
하지만 옵셔널을 제대로 관리하고 사용할 줄 알아야 한다고 생각이 듭니다.
그럼 바로 시작해 보도록 하겠습니다.
1. 옵셔널(Optional)
처음으로 옵셔널(Optinal)이란 무엇일까요?
옵셔널이란 "값이 있을 수도 없을 수도 있는 타입"입니다.
var name: String? = nil
var age: Int? = 20
var weight: Int?
타입 옆에 "?" 붙이고,
값으로 "nil" 값을 넣었습니다.
이처럼 옵셔널 타입을 사용하려면 타입에 "?"를 붙여주면 되고,
nil, 타입 값, 혹은 값을 설정 안 해주어도 됩니다.
옵셔널도 타입이기에
타입을 출력하면
var name: String? = nil
var age: Int? = 20
var weight: Int?
print(type(of: name))
//Optional(String)
print(type(of: age))
//Optional(Int)
print(type(of: weight))
//Optional(Int)
이런 식으로 옵셔널로 감싸져(Wrapping)되어 출력됩니다.
만약 이 옵셔널 타입을 출력하려고 한다면
var name: String? = nil
var age: Int? = 20
var weight: Int?
print(name)
//nil
print(age)
//Optional(20)
print(weight)
//nil
이런 식으로 출력됩니다.
이런 옵셔널 타입은 사용하려면 언랩핑(Unwrapping)을 해주어야 합니다.
값이 들어있을 수도, nil값일 수도 있기에
안전하게 확인 후 사용하기 위함입니다.
2. 강제 언랩핑(Forced Unwrapping)
언랩핑의 방식 중의 하나인
강제 언랩핑(Forced Unwrapping)입니다.
강제 언랩핑은 "!"를 붙여 사용합니다.
var name: String? = "윤수"
print("my name is \(name!)")
//"my name is 윤수"
이런 식으로 name 뒤에 "!"를 붙여 강제 언랩핑을 하였습니다.
하지만 이 방식은 말 그래도 "강제"로 언랩핑을 하는 방식으로
지금처럼 값이 아니라 nil 값이 들어있다면 오류가 발생합니다.
var name: String? = nil
print("my name is \(name!)")
//error!
그렇기에 이 방식은 권장되지 않습니다.
3. 옵셔널 바인딩(Optional Binding)
옵셔널 바인딩(Optional Binding)이란
옵셔널 내부의 값이 nil이 아니라면 옵셔널을 벗기는 것 입니다.
강제 언랩핑과 다르게 내부 값을 먼저 확인해 보고
언랩핑을 하기에 더욱 안전합니다.
옵셔널 바인딩에는 2가지 방식이 있습니다.
if let과 guard let입니다.
두 방식 모두 새로운 값에 할당하여
nil 값인지 확인한 후 사용하도록합니다.
var name: String? = "윤수"
if let name = name {
print(name)
//"윤수"
}
if let 같은 경우 블럭 내에서만 변수를 사용할 수 있습니다.
만약 name 값이 nil 값이라면,
print(name)이 실행되지 않습니다.
var name: String? = "윤수"
guard let name = name else { return }
print(name)
//"윤수"
guard let은 nil 값이 아니라면 하위 구문을 실행합니다.
만약 nil 값이라면 종료를 해버립니다.(return)
guard let을 사용할 때는 종료 코드(return)를 꼭 사용해야합니다.
if let과 guard let 두 경우 모두
새로운 값을 할당하는데,
이를 바인딩(Bind) 한다고 하여 옵셔널 바인딩이라고 합니다.
이 때 if let의 경우 코드 블럭 내에서만 변수를 사용할 수 있어
간단한 코드에서는 사용이 용이하지만
guard let은 하위 구문에서 사용할 수 있기에
guard let을 많이 사용합니다.
'Swift' 카테고리의 다른 글
| Swift - 클래스(Class) (0) | 2026.04.15 |
|---|---|
| Swift - 1급 객체(First-Class Object) (0) | 2026.04.03 |
| Swift -Async Await (0) | 2026.03.26 |
| Swift - Generic (0) | 2026.02.27 |
| Swift - ARC(Automatic Reference Counting) (0) | 2026.02.26 |