옵셔널 타입은 사용하기 전에 꼭 옵셔널 언래핑을 통해 값을 꺼내야 한다. 그렇지 않으면 컴파일러가 불평을 한다.
다른 언래핑 방법에 비해 사용법이 간단하지만 동시에 가장 주의해야하는 방법이기도한 force unwrapping (강제 언래핑)에 대해 알아보자.
강제 언래핑으로 옵셔널 언래핑을 하려면 옵셔널 타입의 변수를 사용할 때 변수 이름 뒤에 느낌표(!)를 붙여주면 된다.
아래 예시에는 고양이 이름과 나이를 담았다. 고양이는 있을 수도 없을 수도 있기 때문에 옵셔널로 나타냈다. 고양이와의 1년이 지난 시점에 고양이의 나이를 갱신해주고자 한다.
var catName: String? = "미미"
var catAge: Int? = 3
catAge = catAge! + 1 // (A)
옵셔널에 감싸져있는 catAge 값을 강제언래핑을 통해 꺼내서 사용한 것을 볼 수 있다. 만약 느낌표를 붙이지 않고 강제 언래핑을 하지 않은 상태에서 실행하면 컴파일러가 에러를 뱉는다.
고양이를 키울 수 없는 환경이 되어 친구에게 입양을 보냈다고 가정하자. 고양이가 존재하지 않는데, 그 다음에 고양이의 나이를 1을 더하려고 하면 어떻게 될까?
var catName: String? = "미미"
var catAge: Int? = 3
catAge = catAge! + 1
// ⭐️⭐️
catName = nil
catAge = nil
catAge = catAge! + 1
그러면 다음과 같은 에러가 나면서 정상적으로 실행이 되지 않는다.
Fatal error: Unexpectedly found nil while unwrapping an Optional value
위 에러는 "옵셔널 값을 언래핑하는데 예측과는 다르게 nil
이 들어있었음" 즘으로 해석할 수 있다.
스위프트에서는 옵셔널을 언래핑한 후에 값이 들어있지 않으면 이 에러가 뜨면서 프로그램이 비정상적으로 종료된다.
강제 언래핑을 남발하는 것은 프로그램이 비정상적으로 종료할 수 있는 위험에 노출시키는 것과 같기 때문에 사용시에는 각별히 주의해야한다.
그렇다고 강제언래핑 사용을 꼭 지향해야된다는 것은 아니다. 검색을 통해 강제언래핑을 사용해도 되는 사례에 대해 자세히 다루는 포스트들을 쉽게 찾을 수 있다.
옵셔널을 언래핑할 때마다 프로그램이 비정상적으로 종료할 수도 있다는 두려움에 떨어야하는 것은 아니다. 오히려 옵셔널은 이러한 상황을 방지하기 위해 만들어졌다.
옵셔널에 대한 7가지 개념