본문 바로가기

Swift 문법

[Swift] 옵셔널

옵셔널이라는 개념은
스위프트에서 최초로 도입되었다.

생소한 개념이라서 어렵다고 생각하는 경우가 많은데,
알고 보면 정말 도움되는 존재이다.

마치 자동차의 고장을 방지하는 윤활유 같은 존재랄까..

 

일반 타입의 오류 발생

어떠한 변수를 선언하고 값을 초기화하지 않는다면 오류가 발생한다.

그리고 프로그램은 그 즉시 작동을 멈춘다.

var a: Int
print(a) // 에러 발생: a의 메모리에 저장된 값 없음

이러한 융통성 없는 오류를 발생시키지 않고, 일단 프로그램을 실행시킬 수 있는 것이 옵셔널이다.

옵셔널 타입을 잘 활용한다면, 보다 자유롭게 데이터 관리가 가능하다.

 

옵셔널

// 간편표기
var a: Int?
print(a) // nil 출력

// 정식표기
var a: Optional<Int>
print(a) // nil 출력

옵셔널 타입은 일반 타입에 물음표를 붙여서 명시한거나 꺽새를 활용하여 표기한다.

옵셔널 타입은 초기화하지 않아도 오류가 나지 않고, 이는 변수 안에 어떠한 값이 있다는 것을 의미한다.

실제로 프린트해보면 nil이라는 값이 출력되고, 이는 옵셔널 선언 시 nil이라는 임시값이 기본값으로 초기화되기 때문이다. 

 

nil은 값이 "없음"을 나타내는 키워드이고, 옵셔널 타입은 항상 nil을 포함하고 있다.

 

만약 실질적인 값을 넣어준다면 어떻게 될까?

var a: Int? = 10
print(a) // optional(10)

a10을 넣고, 출력하면 optional(10)이 나온다.

 

설명하자면 옵셔널 타입은 항상 nil 임시값을 포함하고 있다고 했는데, a는 10과 nil 임시값이 섞인 데이터이다.

따라서 정수형(Int)과 옵셔널 정수형(Int?)은 서로 완전히 다른 타입인 것이다.

 

언래핑(Unwrapping)

옵셔널 타입을 출력하면 nil 또는 optional(값) 형식으로 나온다.

그리고 옵셔널 타입은 일반 타입으로 바꿔서 사용할 수도 있다.

오히려 바꿔 쓰는 것이 필연적이고, 따라서 옵셔널 타입은 항상 var로 선언된다.

 

하지만 옵셔널 타입을 그대로 적용할 수는 없고, nil 임시값을 없애야 사용이 가능하다.

이러한 작업을 "옵셔널을 벗겨낸다"라는 뜻으로 "Unwrapping" 작업이라고 부른다.

 

옵셔널 타입을 Unwrapping하는 방법은 4가지이다.

 

1. 강제추출

var str: String? = "안녕?"
print(str!) // "안녕?" 출력

var num: Int?
print(num!) // 오류 발생

강제추출법은 느낌표를 사용하여 언래핑하는 방법이다.

반드시 변수에 값이 있다는 것을 확신할 수 있을 때 사용해야 한다.

즉, 변수가 nil 값일 때 사용한다면 오류가 발생한다.

 

2. if문

var str: String? = "안녕?"

if str != nil {
	print(str!) // "안녕?" 출력
}

강제추출법을 사용하면서 발생하는 오류를 방지하기 위해 if문을 사용하는 방법이다.

조건문을 통해 변수의 nil 여부를 판단하고, 변수가 nil이 아닐인 경우를 구분하여 강제해제를 진행한다.

 

3. 옵셔널 바인딩

옵셔널 바인딩에는 if letguard let 방식이 있다.

// if let 방식
if let s = str {
	print(s)
}

// guard let 방식
guard let s = str else { return }

두 방식의 조건문 모두 "str의 nil이 아닌 공간이 s라는 변수에 담길 수 있다면"을 의미한다.

따라서 strnil이라면 담지 못할 것이기 때문에 false를, nil이 아니라면 true를 반환한다.

그리고 let 변수에는 자동으로 언래핑된 값이 담긴다.

 

if문의 let 변수는 if 영역 내에서만 사용할 수 있다.

guard 문은 함수 내에서 사용하며, let 변수는 함수 영역 내에서만 사용할 수 있다.

 

4. nil 코어레싱

var writtenName: String?

var userName = writtenName ?? "홍길동"
print(userName)

writtenName = "아들놈"

userName = writtenName ?? "홍길동"
print(userName)

변수에 대한 기본값을 제시할 수 있을 때, 물음표 2개를 사용하여 언래핑하는 방법이다.

 

옵셔널 변수에 값이 있다면, 언래핑되어 할당된다.

옵셔널 변수가 nil이라면 물음표 뒤에 위치한 기본값이 할당된다.

 

옵셔널 체이닝

nil 값을 점검할 때 간결하게 표현할 수 있는 코드이다.

불필요한 코드와 과정을 생략할 수 있다.

menuButton?.layer.borderWidth = 1

menuButtonnil 값이면 해당 코드는 실행되지 않는다.

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

[Swift] 클래스와 구조체  (0) 2022.07.17
[Swift] Enum(열거형)  (0) 2022.07.16
[Swift] 함수  (0) 2022.07.15
[Swift] 튜플  (0) 2022.07.14
[Swift] Switch문  (0) 2022.07.13