swift & iOS/swift

[swift] 옵셔널 optional 간단 정리

whale3 2022. 1. 8. 23:43

참고: https://www.youtube.com/watch?v=V6-WmAh4Y1E&list=PLJqaIeuL7nuFbWKMhG8-xLzF1T7gIPr8Z&index=26

 


옵셔널(optional)은 변수/상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법이다. 그리고 옵셔널 타입이어야 nil을 할당할 수 있다. var a = nil 이렇게 작성하면 에디터에 에러가 나타난다. a가 옵셔널 타입임을 명시해준 후에야 nil을 할당할 수 있다. 

 

var a : Int?

a라는 옵셔널 Int 형의 변수를 선언한 것이다. 이 변수에는 Int 형의 값을 할당할 수도 있고 값이 없을 수도 있다. (nil)

만약 a에 값을 할당하면 그 값은 옵셔널로 감싸지게 된다. 

a = 10
print(a) // Option(10) 과 같이 옵셔널로 감싸진 10이 된다.

 

10에 접근하려면 먼저 10을 감싸고 있는 옵셔널을 벗겨야 한다. 

 

옵셔널을 벗기는 방법 첫번째: 변수 이름 뒤에 ! 붙이기 

var a : Int?
a = 10
print(a) // Optional(10)
print(a!) // 10

변수 이름 뒤에 ! 붙여서 옵셔널을 벗기는 것을 forced unwrapping이라고 한다. ! 로 옵셔널을 벗길 때는 해당 변수에 값이 100% 확실하게 있을 때 사용하는 것이 좋다. 왜냐면 옵셔널형 변수를 선언만 하고 값을 할당하지 않으면 기본적으로 그 변수는 nil인데, nil을 !로 강제로 옵셔널을 벗기려고 하면 에러가 발생하며 프로그램 실행이 멈추기 때문이다. 

var x : Int? // x에 값을 할당하지 않는 이상 x는 nil

그러므로 ! 사용하여 옵셔널을 벗길 때는 nil인지 아닌지 확인하고 사용해야 한다. 

var x : Int?
x = 10

if x != nil {
	// do something...
} else {
	// do something else... 
}

(이거 말고 옵셔널 바인딩이라고 더 많이 사용하는 방법이 있는데 그것은 아래에...)

 

 

왜 forced unwrapping !을 '변수 이름 뒤'에 붙여야 한다고 강조를 했냐면 !가 타입 뒤에 붙으면 옵셔널형 변수를 선언하는 것이기 때문이다. 그러니까 사실 옵셔널형 변수를 선언하는 방법은 두 가지였다... 보통 ? 을 사용하여 옵셔널형 변수를 선언하는 일이 많다고 한다. ! 로 된 옵셔널형 변수는 xcode에서 ui 요소에 연결하는 IBoutlet 관련하여 볼 수 있는데, 옵셔널이 항상 유효한 값을 가질 때 ! 이 붙은 옵셔널형 변수를 선언한다. 

var firstName : String?
var firstName : String! // implicit optional

 

 

옵셔널을 벗기는 방법 두번째: 옵셔널 바인딩 (optional binding)

 

옵셔널을 벗길 때는 이 방법을 많이 쓴다고 한다. 옵셔널형 변수에 값이 있으면 if 글자 앞에 있는 변수에 그 값을 대입하고 if 부분을 실행하며 만약 옵셔널 변수에 값이 없으면 if 부분을 실행하지 않는다. else 부분 있으면 else가 실행되겠쥬

let myName = "apple"

if let userName = myName { // var도 당연히 사용 가능

} else {

}

여러 옵셔널을 풀 수도 있다. 다만 옵셔널형 변수들 중에 하나라도 nil이 있으면 if 부분이 실행되지 않는다.

let firstTime = 10
let secondTime = 20

// 둘 중에 하나라도 nil이면 if 부분을 실행하지 않는다
if let userTime = firstTime, let adminTime = secondTime {

} else {

}

 

반응형