본문 바로가기

Swift 문법정리

Optional 정리

옵셔널이란?

프로그램의 안정성을 위해 만들어진 개념으로 값이 있거나 혹은 없을 경우를 위해 사용됩니다. 

 

var optional : Int?
var optional : Int? = 43
var optional : Int? = nil
var optional = nil // Error

 

옵셔널은 값이 있거나 혹은 값이 없음을 나타내는 nil과 함께 사용이 가능합니다. nil 값은 반드시 옵셔널에서만 넣을 수 있는 값입니다. 43이라는 값이 들어가 있지만 나중에 nil값이 될 가능성이 존재한다는 의미이고 아무 값도 존재하지 않는다는 nil 값이 지금 들어가 있지만 나중에 어떤 값이 들어갈 수도 있다는 의미입니다. 마지막과 같이 옵셔널을 선언하지 않은 변수에 nil 값을 넣을 경우 에러가 발생됩니다.

 

let number = "123"
let convertedNumber:Int? = Int(number)
print(convertedNumber) // opotional(123)

let text = "hi"
let convertedText:Int? = Int(text)
print(convertedText) // nil

 

옵셔널은 2가지 값으로만 반환되는데 옵셔널로 반환된 타입 혹은 nil 값으로 반환됩니다. 예제처럼 문자열 "123"을 Int(number)를 통해 인트형 정수로 변환시키고자 할 때 print로 반환된 값을 보면 optional(123)인 옵셔널 정수 형태로 반환됩니다. 이는 일반 정수 형태와 옵셔널 정수는 전혀 다릅니다. 

다른 예제를 보면 "hi"라는 문자열을 인트로 바꾸고자 하지만 "hi"는 인트로 변경이 불가하기 때문에 nil 값을 반환하는 것을 볼 수 있습니다. 만약 옵셔널을 하지 않았다면 nil값을 반환시킬 수 없기 때문에 오류가 발생하지만 옵셔널을 만들었기 때문에 오류가 발생하지 않는 것을 볼 수 있습니다. 

옵셔널 값을 사용하기 위한 방법

그렇다면 optional(123)이라고 받은 값을 바로 사용할 수 있을까? 바로 사용할 수 없습니다. 앞서 말했듯이 옵셔널은 당장은 123이 들어가 있지만 나중에 nil 값이 될 수도 있는 불안정한 상태이며 옵셔널 형태를 가지고 있는 상태에서는 연산, 결합 등 어떠한 활동도 하지 못합니다.  optional 상태를 해제해야 사용이 가능합니다.

옵셔널을  해제하는  방법

1. 강제 해제 

let number = "123"
let convertedNumber:Int? = Int(number)
print(convertedNumber!) // 123

let number = "abc"
let convertedNumber:Int? = Int(number)
print(convertedNumber!) // Error

 

강제 해제 방법은 이름 뒤에! 를 붙이면 가능합니다. 그러나 위의 예제는 123으로 옵셔널이 해제되는 반면에 밑의 예제는 Error가 뜹니다. 강제해제의 경우 반드시 해당 옵셔널 값이 nil이 나올 수 없다는 전제하에 강제 해제시키게 됩니다. 문자열 "abc"는 인트형으로 바꿀 수 없기 때문에 nil 값을 반환하게 되고 Error 발생시킵니다.

 

if number != nil {
	print ("성공")
}else {
	print ("실패")
}

 

만약 위의 2번째 예제같이 nil 값을 반환하는 경우 오류가 발생하기 때문에 안전한 사용을 위해 옵셔널의 값이 nil 값이 아님을 확인하기 위해 조건절을 사용하면 좋습니다. 

2. 옵셔널 바인딩 

조건문을 이용해 일반 상수에 옵셔널 값을 대입하는 형식으로 사용합니다. 

 

if let value = convertedNumber {  //convertedNumber = optional(123)
	print("성공 \(value)")
} else {
	print ("실패")
}

 

상수에 옵셔널 값을 대입한 결과는 true, false로만 값이 리턴됩니다. 이와 같은 경우는 값이 있다면 true를 통해 print("성공 \(value)")가 실행되고 만약 값이 없다면 false를 통해 else의 print ("실패")가 실행됩니다. 이는 앞의 강제 해제가 nil 값이 될 경우 Error를 발생시키는데 반해 nil 값이 되더라도 다른 블록이 실행되기 때문에 더 안전하다고 볼 수 있습니다. 

'Swift 문법정리' 카테고리의 다른 글

1.3 Classes and Structures Method정리  (0) 2020.05.21
1.2 Classes and Structures Property 정리  (0) 2020.05.14
1.1 Classes and Structures 정리  (0) 2020.05.13
Function 정리  (0) 2020.05.11
Collection Types 정리  (0) 2020.05.08