티스토리 뷰

Programming/Swift

[Swift] optional 이란?

DangerCloz 2016. 9. 1. 00:12

Optional

Swift 를 배우는 사람들이 처음에 가장 어렵게 생각하는 것이 바로 이 optional 이다. Optional 을 간략하게 설명하자면

값이 존재할 수도 있고, 존재하지 않을 수도 있다

라고 설명할 수 있는데, 이 개념 자체가 처음에는 매우 낯설게 느껴지기 때문에 그렇다.

일단 바로 간단한 코드를 한번 보도록 하자.

let possibleNumber = "123"
let convertedNumber: Int? = Int(possibleNumber)

이 코드를 보면 possibleNumber 라는 변수를 선언하고 123 이라는 값을 스트링으로 대입해주고 있다. 변수명에서 볼 수 있듯이 우리는 String으로 선언을 해주었지만 숫자일 수도 있다라는 가능성을 열어두고 있다.


바로 다음 줄에서 convertedNumber 라는 변수에 possibleNumber 를 Int로 변환해주고 있다. 여기서 주목할 점은 convertedNumber 의 타입이 Int? 인 것인데, 여기서 사용된 ?가 optional 을 뜻하며 우리가 흔히 알고 있는 Int 타입이 아닌 optional Int 타입으로 선언이 된다.


possibleNumber 에는 숫자만 들어가 있기 때문에 결국 convertedNumber 에는 정상적으로 123이라는 수가 들어갈 것이다. 하지만 만약 possibleNumber 에 123이 아닌 abc라는 String이 들어가있었다면 Int()는 정상적으로 변환을 할 수 없고 nilconvertedNumber 에 반환할 것이다.

var responseCode: Int? = nil
// var responseCode: Int = nil .

쉽게 생각하는 방법으로는 optional 은 자료형을 상자 안에 집어 넣어둔다고 생각하면 되겠다. 상자를 직접 열어보기 전까지는 상자안에 정상적인 자료형의 값이 있는지 혹은 nil이 있는지 알아볼 수 없기 때문이다.

Force unwrapping


여기서 force unwrapping 이라는 개념이 나오게 된다. force unwrapping 은 상자 안에 nil이 아닌 값이 있을 것이다! 하고 직접 열어 확인해보지 않고 다른 사람에게 상자를 파는 행위로 생각하면 된다. 즉, force unwrapping으로 다른 함수나 변수에 값을 넘겼는데 상자를 열어보니 nil이 나올 경우 runtime error를 발생시키게 되는 것이다. (상자를 믿고 구매한 객체는 사기를 당한 것이다)

force unwrapping 을 사용한 곳은 항상 잠재적 에러 발생 장소라고 생각하면 될 정도로 위험한 문법이다. Force unwrapping 을 피하기 위한 방법은 다음과 같다.

if let number = convertedNumber {
print(number)
}

if 를 사용하여 새로운 변수에 optional Int 자료형을 가지고 있는 convertedNumber를 대입한다. 만약 number 가 nil이 된다면 if 문 내부는 자연스럽게 수행되지 않고 넘어가게 되며 number 에 정상적으로 값이 입력되면 if 문 내부를 수행하게 된다.

이러한 방법을 사용하면 force unwrapping 을 피할 뿐만 아니라 비정상적인 경우를 대처할 수 있게 된다.

Summary


요약하자면 Optional 은 특정 type 의 값을 저장하는 상자라고 생각하면 된다.
Optional Int 는 Int 를 담을 수 있는 상자로, 상자 안에는 값이 있을 수도 있고, 비어 있을 수도 있다.
Force unwrapping 을 사용하면 상자를 열어보지 않고 객체에게 넘겨 높은 확률로 runtime error가 발생할 수 있고, 이를 회피하기 위한 방법으로는 if 또는 guard를 사용하여 상자를 먼저 열어보면 되겠다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday