본문 바로가기

Programming/iOS : Swift

[swift] 1.기본 문법 : 옵셔널(Optional)

옵셔널(Optional) : 잠재적인 오류를 다루는 방법



옵셔널은 대부분의 언어에서 존재하지 않은 문법이라 낯설게 느껴지실 텐데요, Apple의 개발 문서에서는 옵셔널을 “You use optionals in situations where a value may be absent. ”이라고 설명하고 있습니다. 즉, 값을 성공적으로 반환한다는 보장이 없으면 사용한다는 것인데요. 쉽게 설명하자면 null이 반환될 가능성이 있는 값에 사용하는 것입니다. 그러면 여기서 null이 반환될 가능성이 있으면 'null을 사용하면 되는 것이 아닌가?'라는 생각이 듭니다. 



하지만 보시는 바와 같이, '값이 없음'을 의미하는 nil을 대입하였는데 에러가 생겼습니다. nil은 Int타입에 넣을 수 없다는 에러인데요. 이와같이 스위프트에서는 안정성 확보를 위해 일반 자료형은 nil 값을 가질 수 없다는 제약을 두었습니다.  그러면 '값이 없음'을 표현하려면 어떻게 해야될까요? 이같은 문제를 해결하기 위해 옵셔널이 나왔습니다. 이것은 앞에서 설명한 '값을 성공적으로 반환한다는 보장이 없으면 사용'과 의미가 같습니다.


옵셔널 정의

일반 자료형을 옵셔널 타입으로 정의하는 방법은 자료형 뒤에 ?(물음표)만 붙이면 됩니다.

var num : Int?

var str : String?

var arr : [Int]?


값을 할당하는 방법은 일반 자료형과 같이 대입하면 됩니다.

num = 3

str = "Hello"

arr = [3,4,5]


그러면 이제 값이 할당된 변수들을 사용해 볼 차례입니다. 간단하게 num, str, arr값을 print함수로 출력해보겠습니다.

print("num : \(num), str : \(str), arr[0] : \(arr[0])")


결과를 보면 두 가지 문제가 생깁니다. 첫 번째는 arr변수를 출력할 수 없는 것이고, 두 번째는 num, str 출력하였을 때 값이 우리 예상과 다르다는 것입니다. 당연히 num값은 3이 출력되어야 하고 str은 Hello를 출력해야 되는데 결과는

num : Optional(3), str : Optional("Hello"), arr[0] : Optional(3)


모든 값이 Optional로 감싸져 있습니다. 이렇게 전달받은 옵셔널 값들로는 아무것도 할 수가 없습니다. 우리가 원하는 대로 사용하려면 옵셔널 객체를 해제해야 합니다. 


옵셔널 해제

옵셔널 해제하는 방식은 여러가지가 있지만, 공통적인 특징은 옵셔널 값이 nil인지 확인을 해야한다는 것입니다.


1.강제 해제와 if문 : 강제 해제하는 방법은 변수나 상수 뒤에 !만 붙이면 해제가 됩니다. 그러나 옵셔널 객체를 해제하기 이전에 옵셔널 값이 nil인지 점검해야 합니다. 옵셔널을 해제하기 이전에 nil값인지 점검하는 과정은 매우 중요한데요.  그 이유는 만약 옵셔널 값이 nil인데, 점검을 하지 않고 강제 해제를 하였을 경우 오류가 발생합니다. 

var str : String?

str = "Hello"


if str != nil {

    print ("\(str!)"

} else {

    print ("실패하였습니다")

}


이 예제는 str에 nil값이 아닌 정상적으로 값이 할당되어있어 결과는 Hello로 정상 출력합니다. 다음 예제는 str에 nil값을 넣어 결과를 살펴보겠습니다.


var str : String?

str = nil


if str != nil {

    print ("\(str!)")

} else {

    print ("실패하였습니다")

}


이번 예제의 출력은 "실패하였습니다" 입니다. 옵셔널 값이 nil이여도 if문을 통해 점검을 하여 오류 처리를 하여 오류가 발생하지 않았지만, 점검을 하지 않고 옵셔널 값을 강제 해제 하였을 경우는 에러가 발생합니다.

이처럼 에러가 나지않기 위해서는 옵셔널을 강제로 해제할 때 nil값인지 점검을 무조건 해야합니다.



'Programming > iOS : Swift' 카테고리의 다른 글

[swift] 2. iOS앱의 기본 구조 및 생명 주기  (0) 2017.02.07