조앤의 기술블로그

[Swift] 옵셔널 (Optional) 본문

Study/Swift

[Swift] 옵셔널 (Optional)

쬬앤 2020. 2. 13. 17:00

Swift 언어의 가장 큰 특징 중 하나로,

값이 있을 수도 있고, 없을 수도 있는 것Optional 이라고 합니다. 

 

예를 들어, 파일에서 읽어온 상수를 문자열에 저장한다고 할 때.

- 파일에 값이 있을 수 있다. 

- 파일에 읽을 값이 없을 수 있다.(nil)

 

'?' 키워드로 나타냅니다.

그리고 값이 없는 상태를 nil 이라고 나타냅니다. 

 

옵셔널은 값이 없고, 추론할 형식이 없기 때문에 선언할 때 type을 지정해주어야 합니다.

let str: String? = nil

 

옵셔널로 정의한 변수는 옵셔널이 아닌 변수와는 다릅니다. 

let optionalStr: String? = "abc"
let requiredStr: String = optionalStr // 컴파일 에러

 

<Unwrapping>

Optional 값은 '랩으로 포장되어 있는 상태' 라고 이해할 수 있습니다. 

var num: Int? = 123
print(num) // Optional(123) 이 출력됨

위의 코드를 실행하면 결과로 'Optional(123)'이 출력됩니다. 

원하는 값인 123 만을 출력하기 위해서는 랩을 벗겨 값을 추출해야 합니다. (unwrapping)

 

강제로 추출하는 방법(Forced Unwrapping)과 안전하게 추출하는 방법(Optional Binding)이 있습니다. 

 

<Forced Unwrapping>

var num: Int? = 123
print(num!) // 123 출력

! 키워드를 사용합니다. 

 

하지만 

num = nil
print(num!) //런타임 에러 (값이 없는데 강제로 꺼내서)

 값이 존재하지 않을 때 강제로 값을 추출하는 경우에는 crash가 발생합니다. 

 

값이 존재하는지 확인하고 사용하면 되지만, if 문 등으로 확인하여 사용하기 보다는 '옵셔널 바인딩' 으로 처리하는 것이 안전하고, 많이 사용하는 방법입니다.

 

이처럼 강제 추출 방법은 crash 발생의 위험이 있으므로, 가급적 사용하지 않는 것이 좋습니다. 

 

옵셔널 바인딩(Optional Binding)에 대한 설명은 다음 포스팅에서 하겠습니다. 

감사합니다.