[Swift] 06. Optional

·2023년 1월 28일
1

Swift 문법

목록 보기
5/8
post-thumbnail

Optional

Optional은 Optional의 뜻은 '값이 있을 수도, 없을 수도 있음'이다. 즉, 옵션 같이 선택적이라고 직관적으로 이해하면 편할 것 같다.

Optional이 필요한 이유?

다음과 같이 Optional이 아닌 상수에 nil을 할당하려고 하면 에러가 발생한다.
Optional은 이를 방지하기 위해, 즉 nil의 가능성을 명시적으로 표현하기 위해 사용한다.

'?'와 '!'

Optional을 사용할 땐, '?'나 '!'를 사용하게 된다. 각자 어느 상황에 쓰이는지 살펴보자.

01. 암시적 추출 옵셔널

'!'를 쓰는 경우를 '암시적 추출 옵셔널'이라고 한다.

var optionalValue: Int! = 100

switch optionalValue {
case .none:             //값이 없다
	print("This Optional variable is nil")
case .some(let value):  //값이 있다
	print("Value is \(value)")

암시적 추출 옵셔널 형식은 기존 변수처럼 사용 가능하다.

optionalValue = optionalValue + 1

또한 nil을 할당 가능하다.

optionalValue = nil

그러나 잘못된 접근으로 인해 런타임 오류가 발생할 수 있다.

(런타임 에러가 난 이유: optionalValue에 nil값을 넣어주었는데, optionalValue에 접근하려다보니 오류가 발생)



02.일반적인 옵셔널

'?'를 쓰는 경우를 '일반적인 옵셔널'이라고 한다.

var optionalValue: Int? = 100

switch optionalValue {
case .none:
	print("This Optional variable is nil")
case .some(let value):
	print("Value is \(value)")

일반적인 옵셔널도 마찬가지로 nil이 할당 가능하다.

optionalValue = nil

하지만 기존 변수처럼 사용 불가하다. (아래 참고)

optionalValue = optionalValue + 1 //불가능함

옵셔널과 일반 값은 다른 타입이므로 연산이 불가능하기 때문이다.



Optional 추출, 활용

Optional을 추출하는 방법에는 Optinal Binding 과   Force Unwrapping(강제 추출)이 있다.

Optinal Binding

Optinal Binding은 옵셔널의 값을 꺼내오는 방법 중 하나로 nil 체크를 함과 동시에 안전하게 값을 추출할 수 있는 것이 특징이다.

아래 그림과 같이 메모리 공간이 있을 때, Optional 같은 경우, 값을 보호해주는 보호막이 있다고 생각을 해보자.

Optional Binding 방식은 '상자에 노크를 한다'고 비유하면 편하다. 값이 있으면 그 값을 꺼내오고, 그렇지 않으면 값을 꺼내오지 않고 지나친다.

Optional Binding을 해주는 방법?

'if-let' 방식을 통해서 Optional Binding을 해줄 수 있다.


참고로 한 번만 binding 할 수 있는 게 아니라, 여러 옵셔널 변수들을 한 번에 binding할 수 있다.(쉼표 이용)



Force Unwrapping(강제 추출)

Force Unwrapping은 옵셔널 값을 강제로 추출하는 방법이다.

옵셔널 보호막을 강제로 깨부수고 가지고 나오는 방법이라 생각하면 편하다.


아래와 같이 옵셔널 변수를 강제로 꺼내와서 옵셔널을 벗겨내고 안에 있던 값을 넘겨줄 수 있다.


그리고 중간에 값을 nil을 할당해주면 강제 추출시 값이 없으므로 런타임 오류가 발생한다.


그리고 함수를 사용할 때(변수를 전달할 때), '!'를 붙이지 않아도 붙인 효과가 난다.

위도 마찬가지로 nil값이 전달되므로 런타임 오류가 발생한다.




강제 추출 방법은 추천되지 않는 방법이다. 안전하게 binding 하기 위해선, Optional Binding 방식을 사용하는 게 좋다.




출처
야곰의 스위프트 기본 문법 강좌

0개의 댓글