먼저 옵셔널이 무엇인지 본격적으로 알아보기 전에 아래의 코드를 한 번 살펴볼까요?
var someFruits = ["딸기", "사과", "망고", "수박", "복숭아"]
print(someFruits.first) // Optional("딸기")
someFruits = []
print(someFruits.first) // nil
Q. 옵셔널이란?
A. 옵셔널은 '값이 채워져 있을 수도 있고, 비어 있을 수도 있다' 라는 뜻입니다. Swift는 어떤 변수의 값이 비어있다면 nil
이라고 표현합니다(다른 언어에서는 null
이라고 합니다). 그리고 Swift에서는 어떤 변수가 비어 있을 수도 있다면 명시적으로 해당 변수가 Optional
이라고 선언해 주어야 합니다.
선언은 해당 타입에 물음표(?
)를 붙여줍니다.
var someValue: String? = "어떤 값"
someValue = nil
someValue = "다른 값"
var anotherValue: String = "또 어떤 값"
anotherValue = "또 다른 값"
anotherValue = nil // error! String 으로 선언된 값은 nil 이 될 수 없습니다
그래서 옵셔널 즉 물음표(?
) 를 보면
오 이 변수는
nil
일지도?
라고 생각해봅시다.
Q: 옵셔널을 쓰는 이유가 무엇일까요?
A: 태초에는 비어 있는 값이라는 개념이 없었습니다. 그래서 C언어와 그 이전 언어에서는 0
과 같은 값을 비어 있는 값이라고 약속하곤 했습니다. 그 뒤로 자바 정도의 언어에서는 null
이라는 값이 도입되었고, 이를 통해 해당 변수가 비어 있는지를 확인할 수 있었습니다. 하지만 여기서 문제가 발생합니다. 해당 변수가 null
인지 모르기 때문에 이를 확인하는 코드를 매번 작성해야 했어요. 이 때문에 코드가 쓸데없이 길어지게 되었습니다. 그래서 Swift 정도의 언어에서는 Optional 이라는 개념을 도입했습니다. 코드를 봤을 때 언어 단계에서 이 변수가 nil(null)
일 가능성이 있는지 미리 알고 시작합니다. nil
이 아니라고 확신하는 곳에는 굳이 값이 비어 있는지 확인할 필요가 없어졌습니다!
옵셔널은 이런 특징들이 있습니다.
//옵셔널 체인(Optional Chaining): 어디에선가 한번 nil이면 그 뒤로 쭉 nil
var someFruits = ["딸기", "사과", "망고", "수박", "복숭아"]
print(someFruits.**first?.count**) // Optional(2)
someFruits = []
print(someFruits.**first?.count**) // nil
//옵셔널 강제 해제: 옵셔널인 변수를 nil 이 될 리 없다고 확인시켜주는 느낌표 !
var obviousFruit: String = someFruit.first**!
print(obviousFruit) // 딸기**
그래서 옵셔널 근처에서 느낌표(!) 를 보면
이 변수는
nil
이 아니야!
라고 생각해봅시다.
!
더 자세히 알아보기- 변수의 옵셔널 관련된 선언은 사실 3가지가 있습니다!
-
//살짝만 살펴보고 이해가 안 된다 싶으면 너무 고민하지 말고 넘어가기! var value: Int = 3 var valueToBeSet: Int! = 4 var valueCanBeNil: Int? = 5 value = nil // 에러! valueToBeSet = nil // 가능 valueCanBeNil = nil // 가능 value = valueToBeSet // 가능 value = valueCanBeNil // 불가능 value = valueCanBeNil! // 가능
- 변수 뒤에
?
대신!
가 붙어서 선언된 친구들이 종종 있습니다. - 사실
!
는 (홍대와 합정 사이가 아니라) Optional과 Non-Optional 사이 어딘가입니다. 프로그래머 입장에서 처음부터 모든 변수에 값을 넣는 게 어려울 때도 있습니다. 하지만 변수를 선언한 직후 대부분은 값을 바로 넣기 때문에!
는 변수가nil
일 확률이 매우 작은 경우에 사용하곤 합니다. - 그럼 처음부터 변수를 Optional 로 선언하면 되는 거 아니냐고요?
- 하하 그건 프로그래머들 사이에서도 의견이 분분하지만.. 지금 당장은 값이 없지만 곧 값이 채워질 변수 라고 생각해주세요!
'WEB & App. > Swift' 카테고리의 다른 글
[iOS/Swift] 라면 타이머 앱 만들기 - 2021. 06. 18. (0) | 2021.06.18 |
---|---|
[iOS/Swift] 구조체(Struct)와 클래스(Class) - 2021. 06. 18. (0) | 2021.06.18 |
[iOS/Swift] 포커 카드 뒤집기 - 2021. 06. 17. (0) | 2021.06.18 |
[iOS/Swift] Flash App 만들어보기 - 2021. 06. 13. (0) | 2021.06.13 |