정의
- 값이 있을 수도 없을 수도 있는 것을 나타내는 것
- 옵셔널을 ?와 !를 사용해 변수를 선언하고 실행할 수 있습니다.
- 옵셔널로 선언된 변수의 값은 일반 (Int, Double, String) 자료형이 아닌, Optional 자료형이 됩니다.
선언문에 사용할 때
- ?와 ! 모두 동일하게 옵셔널 변수 선언을 목적으로 사용합니다, 하지만 !는? 와 또 다른 기능이 있습니다.
? - 옵셔널 변수 선언
! - 옵셔널 변수 선언, 옵셔널로 사용되지 않을 것 같으면 자동으로 옵셔널을 언래핑합니다.
옵셔널 실습
선언부에서 ?,! 사용
- ?,! 동일하게 옵셔널 변수 선언으로 실행돼, 변수 x의 값이 Optional(10)으로 초기화됩니다.
var x : Int? = 10 // 선언문에서 ?는 옵셔널 변수 선언.
print(x)
print(type(of:x))
실행결과
// Optional(10)
// Optional<Int>
--------------------------------------------------------------------------------
var x : Int! = 10
print(x)
print(type(of:x))
실행결과
// Optional(10)
// Optional<Int>
실행부에서 ?, ! 사용
- x에 저장된 Optional(10)이 !를 만나 강제 언래핑되어 일반 정수 10의 값이 출력됩니다.
- 그와 반대로 실행부에서 ?를 사용하면 오류가 발생합니다. 그 이유는 실행부에서 ?를 사용하면 옵셔널 체이닝으로 사용되기 때문입니다.
var x : Int? = 10 // 선언문에서 ?는 옵셔널 변수 선언.
print(x!)
print(type(of:x))
실행결과
// 10
// Optional<Int>
-----------------------------------------------------------------
var x : Int? = 10 // 선언문에서 ?는 옵셔널 변수 선언.
print(x?)
print(type(of:x))
실행결과
// 에러 발생!
옵셔널 체이닝 [Optional Chaining]
- 옵셔널 체이닝은 옵셔널 선언된 변수에 대해 실행부에서 ?를 사용했을 때,
옵셔널 내부에 값이 있으면 옵셔널 값을 불러오고, 값이 없다면 nil을 출력하고 실행을 종료시키는 것입니다.
2022.02.10 - [iOS/Swift 문법 심화 학습] - 옵셔널 체이닝 [ Optional Chaining ]
실습
- 다음과 같이 변수 x에 Optional("Hi")라는 값이 들어있을 때,
옵셔널 체이닝을 해보면, b1에는 "Hi"의 문자열 수를 count 해서 Optional(2)라는 값으로 출력합니다.
var x : String? = "Hi"
let b1 = x?.count
print(type(of:b1),b1, b1!)
실행결과
// Optional<Int> Optional(2) 2
- 그럼 옵셔널 내부에 값을 지우고 다시 실행해보겠습니다.
- 결과는 이전과 다르게 nil이 출력된 것을 확인할 수 있습니다.
var x : String?
let b1 = x?.count
print(type(of:b1),b1)
실행결과
// Optional<Int> nil
옵셔널 값을 푸는 3가지 방법
1, 옵셔널 바인딩 [Optional Binding]
- 옵셔널 바인딩은 옵셔널은 안전하게 처리하는 방법입니다.
- if let과 guard let과 같은 방법이 있습니다.
var x : Int? = 10
if let xx = x { // 옵셔널 바인딩.
print(x,xx)
}
실행결과
// Optional(10) 10
- 아래의 코드는 표현식이 참이므로 x의 값이 옵셔널 바인딩된, 정수 8이 출력됩니다.
func Num(x: Int?){
guard let myNum = x, myNum < 10 else {
print("잘못된 값이 입력되었습니다.")
return
}
print(myNum)
}
Num(x:8)
실행결과
// 8
- 아래의 코드는 표현식이 거짓이므로 else문 블록 안에 "잘못된 값이 입력되었습니다."가 출력됩니다.
func Num(x: Int?){
guard let myNum = x, myNum < 10 else {
print("잘못된 값이 입력되었습니다.")
return
}
print(myNum)
}
Num(x:12)
실행결과
// 잘못된 값이 입력되었습니다.
2022.01.28 - [iOS/Swift 문법 심화 학습] - guard
- guard 문은 아래에서 자세히 다루었습니다.
2, 강제 언래핑 [Forced Unwrapping]
- 강제 언래핑은 옵셔널 변수 뒤에 !만 붙여주면 돼 간단하지만, 프로그램이 비정상적으로 종료되는 위험이 있으니 주의하여 사용하여야 합니다.
var x : Int? = 10
print(x!)
실행결과
// 10
3, nil coalescing operator
- nil 병합 연산자는 var y = x ?? 0과 같은 식에서,
x의 값이 nil일 경우 x에 0 값을 초기화하고, nil이 아닐 경우 옵셔널을 푼 값을 초기화하는 것입니다.
- x가 옵셔널 값인 경우.
var x : Int? = 10
var y = x ?? 0
print(x,y)
실행결과
// Optional(10) 10
- x가 nil인 경우.
var x : Int?
var y = x ?? 0
print(x,y)
실행결과
// nil 0
내용 출처
https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA/featured
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
Dictionary (0) | 2022.04.19 |
---|---|
컬렉션 타입 [Collection Types] (0) | 2022.02.17 |
서브스크립트 [ Subscript ] (0) | 2022.02.15 |
프로퍼티 [ Properties ] (0) | 2022.02.14 |
옵셔널 체이닝 [ Optional Chaining ] (0) | 2022.02.10 |
댓글