Optional을 다루는 것이 필요한 이유
nil 이 가능한 타입을 다루기 위해서 Swift는 Optional을 사용한다. 하지만 Optional로 값이 오게 되면 Optional로 감싸여 있어 그 안에 있는 값을 사용하기 위해서는 Optional을 제거해야 한다.
이번 글에서는 다음의 dictionary를 사용해 Optional 타입의 변수가 들어왔을 때 어떻게 처리해야하는지에 대해 알아볼 것이다.
let dictionary : [String : Int] = ["A" : 0, "B" : 1, "C" : 2]
! 을 이용한 옵셔널 강제 제거
첫 째로 !을 이용해 Optional을 강제 제거하는 방법이 있다.
예를 들어 아래와 같이 dictionary에서 값이 Optional로 오는 상황을 가정해보자.
dictionary에서 값을 받아올 때 !을 사용하면 Optional이 강제로 제거된다.
!을 사용한 옵셔널 강제 제거의 한계점
'강제'라는 어감에서도 볼 수 있듯이 코드를 짤 때는 자주 사용하면 언제 오류가 발생할지 모르는 코드가 되어버린다. 특히 !는 nil이 아님을 단언하는 것인데, nil이 발생해버리면 프로세스가 죽어버린다.
위의 dictionary에 없는 Key 값인 "D"를 사용해 변수를 얻어온다음 !을 사용해보면 다음과 같이 Fatal Error가 발생하는 것을 확인할 수 있다.
따라서 !은 사용을 지양하는 것이 좋으며, 간단히 사용해야 할 경우를 제외하고는 사용하지 말도록 하자.
?? 을 이용해 Optional 풀릴 때의 default value 설정하기
Optional을 다루는 두 번 째 방법은 '??'을 이용해 Optional로 감싸진 값이 nil일 때 default value로 대체하는 방법이다. '??' 뒤에 Default Value를 씀으로써 Optional로 감싸진 값이 nil일 때 어떤 값으로 대체할 지를 지정할 수 있다.
let aValue = dictionary["A"] ?? default value
위와 같이 쓰면 aValue 값에서 바로 Optional이 풀린다. 예를 들어 아래와 같이 INVALID VALUE 값을 -1로 둔다음 Optional 내부의 값이 nil일 때 대체하도록 만들면 "A"에 해당하는 값인 0이 나오는 것을 확인할 수 있다.
위 그림3에서 "D" 를 Key 값으로 써서 Optional 내부를 nil로 만들었던 상황을 보자. aValue 값을 프린트 해보면 -1이 나오는 것을 확인 할 수 있다. Optional(nil)이 옵셔널이 풀리면서 -1로 대체되었기 때문이다.
if를이용해 Optional이 nil이 아닐 때 수행될 블록 만들기
위의 두 방법 모두 한계점이 있다. Optional 내부에 nil 값이 왔을 때 오류가 생기거나, default value로 설정되어 사용된다는 점이다. Swift에서는 이에 대해 Optional 내부의 값이 nil값이 아닐 때만 수행될 수 있는 블록을 만드는 하는 문법을 제공한다.
Swift에서는 if let이나 if var 을 사용해 변수를 선언하고 해당 변수의 값이 nil이 아닐 때만 Optional이 풀린 값이 변수에 저장되게 하여 if블록 내부가 실행될 수 있도록 해준다.
예를 들어 아래와 같이 사용되면 aValue가 null이 아닐 때만 블록 내부의 작업이 사용되게 된다.
if let aValue = dictionary["A"] {
//aValue에 대해 수행할 작업 작성
}
실제 사용을 보자. Dictionary에 "A" 키는 0에 대응되므로 aValue의 값이 nil이 아니다. 따라서 0이 출력되는 것을 확인할 수 있다.
하지만 다음과 같이 Dictionary에 대응되는 값이 없는 "D"를 넘기면 no value가 출력되는 것을 확인할 수 있다.
'IOS > Swift' 카테고리의 다른 글
[Swift 제어문] switch case 사용해 다중 조건 처리하기 (0) | 2021.12.19 |
---|---|
[Swift 제어문] if 문 다루는 방법 한 번에 정리하기 (0) | 2021.12.19 |
[Swift] nil 과 Optional 이란 무엇인가? (0) | 2021.12.19 |
[Swift] suffled 사용해 Array 순서를 랜덤으로 바꾸기 (0) | 2021.12.09 |
[Swift] Random 값을 뽑아내는 다양한 방법 : Random 숫자, Collection Random 값 뽑기 (0) | 2021.12.09 |