About Swift – “Optional, 강제 언래핑, 옵셔널 바인딩”
About Swift – “Optional, 강제 언래핑, 옵셔널 바인딩”
Swift에서의 Optional
옵셔널 은 swift가 가지고 있는 가장 큰 특징 중 하나입니다. 값이 있을 수도 있고 없을 수도 있는 것을 나타내는 것인데요.예를 들면 Int형은 정수형입니다. var x : int
는 정수형 변수 x를 선언하는 문장입니다. x라는 공간에는 정수만이 저장될 수 있습니다.
var x : Int?
는 Optional Int 형 변수를 선언하는 문장입니다. 타입 선언부 뒤에 ?문자를 씀으로서 선언할 수 있는데요, 옵셔널은 다음의 상황에서 사용됩니다.
- 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환됩니다.
- 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법을 제공합니다.
- Optional 타입만이 nil값을 가질 수 있습니다.
- optional 타입의 기본값은 nil입니다.
var x : Int? = 100
print(x)
위의 코드를 실행해 본다면 Optional(100)이라고 print될 것입니다. Optional 타입은 기본적으로 wrapping 되어 있는 상태입니다. optional로 선언된 것들은 값이 있는지 없는지(nil인지 아닌지)를 모르는 상태라는 것입니다.
var x : Int? = 100
를 컴파일러 입장에서는 x라는 변수가 값이 있는 변수인지, 아니면 nil값인지 모르는 상태라는 겁니다. Swift 3.0 부터는 값이 있다고 해도 그 값을 출력하지 않습니다. Optional(100)이라고 출력된 이유도 그것 때문입니다.
대부분의 경우에서는 Optional로 wrapping되어있는 상태의 출력은 개발자가 원하는 출력이 아닐 것입니다. 이러한 경우 올바른 출력을 하기 위해서 필요한 몇 가지 방법을 소개합니다.
1. 강제 언래핑 (forced unwrapping): exclamation mark(느낌표) 사용하기
느낌표를 사용함으로서 언래핑을 할 수 있습니다. 변수명 뒤에 ! 를 사용하면 됩니다.
var x : Int? = 5 // Optional Int 형 변수 x를 선언했습니다.
print(x!) // !를 사용하여 언래핑하여 출력합니다.
위의 예제를 실행해 볼 경우 언래핑되어 5라는 값이 나옴을 확인할 수 있습니다.
var x : Int? // Optional Int형 x 선언
x = 50 // x에다가 50 대입, nil이 아님
if x != nil { //만약 x가 nil이 아니면..
print(x!) //언래핑하여 출력해라!
}
else { //만약 x가 nil이라면,
print("nil") // nil을 출력해라!
}
위의 코드의 경우 x = 50이라는 문장으로 x에 값을 대입해주었기 때문에, x라는 변수는 nil값이 아니게 됩니다.
var y : Int? // Optional Int형 y 선언
// 초기화하지 않았으므로 , Optional 형의 기본 nil이 됨
if y != nil { //만약 y가 nil이 아니면..
print(y!) //언래핑하여 출력해라!
}
else { //만약 y가 nil이라면,
print("nil") // nil을 출력해라!
}
위의 코드의 경우 변수 y를 선언하고 아무런 값을 대입해주지 않았으므로, nil이 됩니다.
2. 옵셔널 바인딩 : optional binding
옵셔널에 할당된 값을 임시 변수나 상수에 할당합니다.저번 시간에 배웠던 let 키워드를 정리하고 가겠습니다. let는 상수를 선언할 때 사용하는 단어입니다.
if let 상수명(or 변수명) = 옵셔널변수명 {
// 옵셔널 변수가 nil이 아니라면, 언래핑 후 상수(or 변수)에 대입하고 if문을 실행합니다.
// 옵셔널 변수가 nill이라면 if문이 실행되지 않습니다.
}
var x : Int?
var y : Int?
x = 10 // nill값이 아니게 됩니다.
if let X = x {
print(X,x)
}
else {
print("nil")
}
if let y = Y {
print(Y,y)
}
Optional Int형 변수 x를 선언하고 10이라는 값을 대입했습니다.그 후, a라는 상수에 x값을 대입했습니다. x는 값이 있기 때문에, 상수에 대입할 수 있습니다. let a 대신, var a 를 사용하여 변수 a에 대입할 수도 있습니다.
var x : Int?
var y : Int?
x = 10
y = 100
if let X = x, let Y = y {
....
}
추가로, 여러 값을 동시에 언래핑하고 싶을 때는 콤마를 사용하면 됩니다.
3. 암묵적인 언래핑(implicitly unwrapped)
옵셔널이 항상 유효한 값으 가질 경우에는, 옵셔널이 암묵적인 언래핑이 되도록 선언할 수도 있습니다.이러한 방법으로 옵셔널이 선언되면, 위에 소개했던 강제 언래핑이나 옵셔널 바인딩을 하지 않아도, 값에 접근할 수 있습니다. 사용 방법은, 선언 시 물음표 대신에 느낌표를 사용하는 것입니다.아래의 두 예제의 차이를 찾아 보시기 바랍니다.
var x : Int? = 1
var y : Int = x!
print(type(of:x),type(of:y))
print(x, y)
옵셔널 변수 x를 ?로 선언한 후에 1을 대입했습니다.
- x에는 Optional(1) 이 들어가 있습니다.
- Int형 변수 y를 선언한 후에 x를 강제 언래핑한 후에 대입했습니다.
- 원래 Optional 값은 Int형에 대입할 수 없습니다. 그렇기에 강제 언래핑을 한 것입니다.
var x : Int! = 1
var y : Int = x
print(type(of:x),type(of:y))
print(x, y)
옵셔널 변수 x를 !로 선언한 후에 1을 대입했습니다.
- x에는 Optional(1) 이 들어가 있습니다.
- Int형 변수 y를 선언한 후에 x를 대입했습니다.
- 바로 x를 대입한 것을 볼 수 있습니다. swift에서 Optional로 사용되지 않으므로 자동으로 unwrap한 것입니다.
이렇게 간단하게 Swift의 Optional 형에 대하여 알아보았습니다.