✏️ 옵셔널이란? : 안정성(Safty)을 문법적으로 담보하는 기능
옵셔널(Optional) 이란 두 가능성을 나타낸다: 값을 가지고 있어서 그 값을 풀어서(unwrap) 이용할 수 있거나 또는, 어떠한 값도 없는 것. (어떠한 값도 없는 것은 Swift에서는 nil)
다시 말 하면, 옵셔널을 이용하는 것 만으로도 이 값은 없을 수도 있는 값이다! 라는 것을 의미한다.
옵셔널로 선언된 곳에서만 nil을 할당할 수 있다.
✏️ 옵셔널 값 풀어쓰기(Unwrapping)
옵셔널 값을 풀어서 그 안의 값(value)을 추출하여 사용하는 것을 unwrapping한다고 한다.이 unwrapping방법은 몇가지가 있다.
- If문과 강제 언래핑(Forced Unwrapping)
아래와 같이 someOptional에 값이 있다는것을 확신할 때, someOptional뒤에 느낌표(!)를 붙여서 사용하며, 이 값은 절대로 nil이 아니니 사용해도 좋아~ 라는 의미를 동시에 가진다.
var someOptional: Int?
//자동으로 nil로 초기화
someOptional = 1
if someOptional != nil {
print("someOptional is \\(someOptional!)")
}
그런데 뭔가, 이런 확신을 함부로 가져도 될지 모르겠다. 나라면 웬만하면 이런 방법을 사용하지 않을 것 같다.(이런 생각이 언젠간 잘못됐다고 느낄 수도 있겠지만, 일단은!)
- 옵셔널 바인딩(Optional Binding)
옵셔널 바인딩을 사용하여 옵셔널에 값이 포함되어 있는지 확인하고, 그렇다면 해당 값을 임시 상수나 변수로 사용할 수 한다.
if let someConstant = someOptional {
print("someOptional is \\(someConstant)")
}
someOptional이 값을 가지고있냐, 그렇지 않냐에 따라서 if구문 안이 수행되거나 그렇지 않는데, 여기서 선언한 상수 someConstant는 if문 내부에서만 존재한다!
이 방법이 훨씬 안정적일 것 같다는 생각이 든다(1번의 방법에 비해서)
- 암시적 추출 옵셔널(Implicit Unwrapped Optionals)
옵셔널을 선언할 때 암시적으로 이 곳에는 값이 무조건 있을거야! 라는 표현으로 암시적으로 알려주는 것.그렇기 때문에 실제로 사용할 때 위의 두 예시와 같이, 강제 추출이나 옵셔널 바인딩의 과정을 거치지 않고도 일반 변수처럼 사용한다.
let possibleString: String? = "An optional string."
let assumedString: String! = "An implicitly unwrapped optional string."
let forcedString: String = possibleString! //꼭 느낌표를 사용해줘야 한다.(명시적 표현)
let implicitString: String = assumedString //느낌표를 사용하지 않아도 된다.(암시적 표현)
이렇게, 선언할 때 애초에 이 곳에는 무조건 값이 들어온다! 라고 (써 놓지는 않았지만) 암시적으로 알려주는 옵셔널이 되겠다.궁금해 하던 부분이 이 부분 이었는데, 공부 해 보니 이 방법 또한 좋아보이지 않는다는 생각이든다.(야곰 책에도 그렇게 적혀있군…!)
🍎 옵셔널 공부 전 궁금했던 점 1 : 옵셔널에서 암시적/명시적 이라는 말이 이해가 되질 않았다.
- 타입의 뒤에 느낌표(!)를 붙여서 선언한 것을 옵셔널의 암시적(implicit)표현이라고 한다는데…
그런데 이상하게도 나는 이런 궁금증이 들었다.느낌표를 붙인것은 옵셔널을 풀 때 그냥 붙이는 값 아니던가? 이게 왜 암시적 표현이라는거지?
- ⇒알고보니 암시적 표현이라는것은, 이미 옵셔널을 선언할 때 값이 있을 것이라고 암시적으로 써 놓았기 때문에, 사용자는 그냥 일반 변수처럼 사용해도 된다고 알려주는 그런 의미의 ‘암시적’ 이라는것 이었다.
🍎 옵셔널 공부 전 궁금했던 점 2 : 어떤 경우에 옵셔널을 사용해야하는지 몰랐다.
- 언젠가 값이 있을 수도? 없을 수도? 있는 value를 다뤄야할 때가 있을테니…?
아직 이 부분은 명확하지는 않다, 스터디가 필요하다.언젠가 앱을 개발한다면 그 때 이 값이 있을수도, 없을수도 있을텐데… 이걸 어떻게 표현해야할까?
그럴 때 문법적으로 보장을 해주는 옵셔널을 사용하면 될 것이라는 아주 막연한 생각이 들 뿐이다.
추후에 직접 사례들을 더 다뤄봐야 할 것 같다.
참고했던 글
'공부 > [iOS&Swift]' 카테고리의 다른 글
[iOS] UICollectionView에 대하여 - Overview (0) | 2022.02.23 |
---|---|
[iOS] UITableView에 대하여 (0) | 2022.02.21 |
[iOS] iOS 앱의 생명주기(App, Scene)에 대하여 (0) | 2022.02.19 |
[iOS] Scene, Window, View에 대한 아주 기초적인 정리 (0) | 2022.02.15 |
[iOS] View Controller 와 Segue에 대한 아주 아주 기초적인 개념 (0) | 2022.02.13 |
댓글