옵셔널(Optional)
- 값이 있을 수도 있고 없을 수도 있는 변수
- 값이 없는 경우를 나타낼 때에는 nil을 사용
- 변수 정의할 때 타입 어노테이션에 물음표(?)를 붙여 정의
- Optional(value) 형태로 출력
- 옵셔널에 초깃값을 지정하지 않으면 기본값은 nil
var name: String?
print(name) //nil
name = "hyebin"
print(name) //Optional("hyebin")
- 옵셔널로 정의한 변수는 옵셔널이 아닌 변수와는 다름
var optional_name: String? = "hyebin"
let name: String = optional_name
Value of optional type 'String?' must be unwrapped to a value of type 'String'
name 변수는 옵셔널이 아닌 String이기 때문에 항상 값이 있어야 함
optional_name은 옵셔널로 선언된 변수이기 때문에, 코드가 실행되기 전까지는 값의 유무를 알 수 없음
Swift 컴파일러는 안전을 위해 옵셔널이 아닌 변수에 옵셔널로 선언된 변수를 대입할 수 없게 만듦
옵셔널 바인딩 (Optional Binding)
- 옵셔널의 값을 가져오기 위해 옵셔널을 벗겨내는 행위
- 옵셔널의 값이 존재하는지를 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입
- if let 또는 if var 사용
- 옵셔널의 값을 벗겨서 값이 있다면 if문 안으로 들어가고, nil이라면 그냥 통과
if let name = optional_name{
print(name) //optional_name의 값이 존재한다면 해당 값 출력
}
//optional_name의 값이 존재하지 않는다면 if문 지나침
- 하나의 if문에서 여러 옵셔널 바인딩 가능
if let name = optional_name, let email = optional_email{
print(name, email)
}
옵셔널 체이닝 (Optional Chaining)
- 연속적인 옵셔널들을 연쇄적으로 확인
- 옵셔널의 속성에 접근할 때, 옵셔널 바인딩 과정을 물음표(?) 키워드로 줄여주는 역할
//옵셔널 바인딩
let array: [String]? = []
var isEmptyArray = false
if let array = array, array.isEmpty {
isEmptyArray = true
} else {
isEmptyArray = false
}
//옵셔널 체이닝
let isEmptyArray = array?.isEmpty == true
강제 언래핑 (Force Unwrapping)
- 옵셔널에 값이 있다고 가정하고 값에 바로 접근
- 옵셔널 타입의 변수 이름 뒤에 느낌표(!)를 붙여 사용
- 만약 옵셔널 값이 nil인 경우 런타임에러 발생
print(optional_name!)
fatal error: unexpectedly found nil while unwrapping an Optional value
nil 병합 연산자 (nil coalescing operator)
- "??"를 사용하여 한 줄로 언래핑 수행
- 언래핑하고자 하는 옵셔널 변수 ?? nil일 때 대신할 값
let name = optional_name ?? "abc"
print(name)
optional_name에 값이 있다면 optional_name의 값이 출력되고, 없다면 abc가 출력
암사적으로 벗겨진 옵셔널 (Implicitly Unwrapped Optional)
- 옵셔널이지만 언래핑하지 않고도 사용할 수 있는 옵셔널
- 옵셔널을 정의할 때, 물음표(?) 대신 느낌표(!)를 사용
- nil을 포함할 수 있는 옵셔널
- 접근할 때 옵셔널 바인딩이나 옵셔널을 벗기는 과정을 거치지 않고도 바로 값에 접근할 수 있다는 점에서 일반적인 옵셔널과 다름
- 값이 없는데 접근을 시도하는 경우 런타임 에러 발생
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 타입 캐스팅 (0) | 2023.02.06 |
---|---|
[Swift] 클래스(Class)와 구조체(Struct) (0) | 2023.02.06 |
[Swift] 열거형 (Enumerations) (0) | 2022.02.08 |
[Swift] 함수(Functions) (0) | 2021.12.02 |
[Swift] 제어문(Control Flow) (0) | 2021.11.26 |
댓글