티스토리 뷰

Swift

[Swift] 옵셔널

Hani_Levenshtein 2021. 1. 12. 00:19

변수는 때로는 값을 갖고있지 않을 때도 있습니다.

Optional은 변수의 값이 없을(=변수의 값이 nil 일) 가능성이 있다는 것을 암시하는 장치입니다.

변수명 뒤에 ?를 붙여서 옵셔널 타입 변수임을 명시할 수 있고, 옵셔널 타입 변수가 아니면 nil이 될 수 없습니다.

 

Optional이 붙지 않은 변수에 nil을 대입하려고 시도하면 에러가 나타나며 프로그램이 동작하지 않습니다.

이를 통해 정상적이지 않은 코드가 생성되지 않도록 방지할 수 있습니다.


var A : Int? = 1
var B = A
//A와 B는 nil일 수도 있으며, 값 1을 가지고 있습니다.
var C : Int? = 2
var D : Int = C  // 오류
//C는 nil일 수도 있으며, 값 2을 가지고 있습니다.
//D는 자료형이 Int로 고정되어있기 때문에 자료형이 Int?인 C와 같을 수 없습니다.

var E : Int? = 3
var F : Int = E! //F=3
//E는 nil일 수도 있으며, 값 3을 가지고 있습니다.
//F는 자료형이 Int로 고정되어있지만 E!를 통해 강제로 E가 가진 값 3을 가져올 수 있습니다.

자료형 뒤에 ?가 붙으면 nil이 할당될 수 있으며 변수의 값이 nil이라도 메모리를 차지하게 됩니다.

옵셔널 타입 변수의 값을 옵셔널 타입이 아닌 변수가 갖기 위해 !를 붙여 뽑아올 수 있습니다.

옵셔널 타입의 변수가 가진 값을 강제로 추출하는 것을 Force Unwrapping이라고 합니다.

 

Force Unwrapping

var G : Int? = nil
var H : Int = G! //오류
//G의 값은 nil일 수도 있고, 실제로 nil을 가지고 있습니다.
//H는 G의 값을 가져오기 위해 !을 사용했으나 값을 가져올 수 없습니다.

단, 이 방법은 해당 변수가 nil이 아님을 확신할 수 있는 경우가 아니라면 사용해서는 안됩니다.

따라서 변수의 값을 안전하게 가져오기 위해 다른 방법이 권장됩니다.

 

Optional Binding

var A: Int? =  nil
 if let B = A {
	print(B)
 }
 //출력이 안됨
 
var C: Int? =  2
 if let D = C {
	print(D)
 }
 //2가 출력됨

Force Unwrapping의 위험성을 피하기 위해 미리 if로 체크해주는 것을 Optional Binding라고 합니다.

옵셔널의 값이 존재한다면 그 값을 변수에 넣어주지만 값이 없다면 if문이 실행되지 않습니다.

 

Optional Chaining

array?.isEmpty

스위프트는 코드의 간결성을 위해 옵셔널을 이용한 Optional Chaining이라는 방법이 존재합니다.

 

array가 nil일 경우 ? 까지만 실행이 되고 nil이 반환됩니다.

array가 [ ]일 경우 (=nil은 아닌 상태) isEmpty까지 실행되고 true를 반환합니다.

array가 [ ... ]일 경우 (=nil은 아닌 상태) isEmpty까지 실행되고 false를 반환합니다.

 

암시적 추출 옵셔널(Implicitly Unwrapped Optionals)

var name: String! = "levenshtein"
print(name) // levenshtein

name = nil

if var hani = name {
    print(hani)
} else {
    print("nil")    
}

암시적 추출 옵셔널은 자료형에 ! 를 붙여 nil이 아님을 명시할 수 있습니다.

nil은 될 수 없지만 호출되지만 않으면 nil을 잠깐 가지고 있을 수 있습니다.

nil이 아닌 경우에만 접근 가능하며 nil일 경우 에러가 발생합니다.

 

암시적 추출 옵셔널도 일단 옵셔널이긴 하기 때문에 옵셔널 바인딩을 통해 에러가 발생하는 것을 막을 수 있습니다.

'Swift' 카테고리의 다른 글

[Swift] 인스턴스  (0) 2021.01.16
[Swift] 프로퍼티의 종류  (0) 2021.01.13
[Swift] 메서드  (0) 2021.01.13
[Swift] 클래스와 구조체  (0) 2021.01.10
[Swift] 객체 지향 프로그래밍  (0) 2021.01.09
댓글