[Swift] 옵셔널 (Optional), nil
- nil
- Non-optional Type (넌옵셔널 타입)
- optional Type (옵셔널 타입)
nil
값이 없다는 것을 나타내는 특별한 키워드.
옵셔널 변수에 특수한 값 nil을 지정하면 값이 없는 상태를 나타낼 수 있다.
nil은 타입이 없기 때문에 nil만으로는 타입을 추론할 수 없다.
let stock: Int? = nil
Non-optional Type (넌옵셔널 타입)
변수와 상수는 값을 읽기 전에 반드시 초기화해야 하며, 항상 타입에 맞는 값을 가지고 있어야 한다.
이런 타입을 Non-optional Type(넌옵셔널 타입)이라 부른다.
Non-optional Type(넌옵셔널 타입)에는 항상 값을 가지고 있어야 하므로 nil을 저장할 수 없다.
nil은 값이 없다는 것을 나타내는 특별한 값이므로 항상 값을 가져야 하는 Non-optional Type(넌옵셔널 타입)에는 저장할 수 없다.
let stock: Int = 10
옵셔널 (Optional)
옵셔널은 보통 값이 없는 경우 사용하는데,
값이 있을 수도 있고, 없을 수도 있는 상태의 타입을 옵셔널이라 한다.
옵셔널 변수를 선언할 때 초기값을 지정하지 않으면 해당 변수의 값은 nil로 설정된다.
값이 nil이라면 값을 가지지 않은 것이다.
let optionalStr: String?
위 코드처럼 타입뒤에 공백없이 ?(물음표)를 붙여주면 옵셔널타입이 된다.
옵셔널 타입은 값을 저장하지 않아도 되고, nil을 저장해도 된다. (nil == 값이 없다.)
var optionalInteger: Optional<Int>
var optionalInteger: Int?
물음표를 붙인 문법은 단축 문법을 사용한 것으로 위 두 가지 문법은 동일한 코드이다.
언래핑 (Unwrapping)
옵셔널 타입의 값을 사용하려면 값을 꺼내서 사용해야 하는데 이때 값을 추출하는 작업을 언래핑이라 한다.
// Optional Type
var num: Int? = nil
num = 123
print(num) // Optional(123)
// Non-optinal Type
let n = 123
print(n) // 123
옵셔널 타입의 값과 넌옵셔널 타입의 값 둘 다 동일하게 123이 저장되어 있지만 다른 결과가 출력됨을 확인할 수 있다.
옵셔널 타입의 값은 언래핑을 통해 값을 추출해야 한다.
값 강제 추출하기(Forced Unwrapping)
OptionalExpression!
값을 추출하는 방법은 옵셔널 표현식 뒤에 느낌표를 붙이면 된다.
!(느낌표)는 반드시 공백 없이 붙여야 한다.
nil이 아닌 값에 강제 언래핑을 하면, 언래핑된 값을 얻을 수 있다.
nil 값을 강제 추출할 경우 에러가 발생하므로 주의해야한다.
강제추출은 반드시 필요한 경우에만 제한적으로 사용하는 것이 좋다.
if문으로 값 확인하기
if num != nil{
print(num!)
}
강제추출을 안전하게 사용하는 방법은 값을 꺼내기 전에 값을 확인하는 방법이다.
위 예제는 if문으로 값을 확인하는 코드이다.
값이 저장되어 있으면 nil이 아니므로 true가 되고
값이 저장되어 있지 않다면 nil과 같아서 false가 된다.
이렇게 하면 값이 있는 경우에만 추출하기 때문에 안전하게 추출할 수 있다.
하지만 if문으로 값을 확인하는 방법은 거의 사용되지 않으며 다른 방법으로 옵셔널 바인딩을 사용한다.
옵셔널 표현식을 언래핑하면 결과는 항상 넌옵셔널 타입이 된다.