옵셔널이란?
값이 있을수도 있고, 없을수도 있음을 표현하는 것
nil이 할당될 수 있는지 없는지 표현
import Swift
//someOptionalPram에 nil이 할당 될 수 있다.
func someFunction(someOptionalParam: Int?) {
//...
}
// someOptionalPram에 nil이 할당 될 수 없다.
func someFunction(someOptionalParam: Int) {
}
someFunction(someOptionalParam: nil)
위와 같이 형식에 ? 가 붙어있으면 nil이 할당될 수 있고, 없으면 할당될 수 없는 것이다.
옵셔널을 쓰는 이유
명시적 표현
nil의 가능성을 코드만으로 표현가능
문서/주석 작성 시간 절약 가능
안전한 사용
전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않고 사용가능
예외 상황을 최소화 하는 안전한 코딩
효율적 코딩
옵셔널 문법과 선언
/*enum Optional<Wrapped>: ExpressibleByNilLiteral {
case none
case some(Wrapped)
}*/
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
아래의 두 코드를 보면 둘다 nil을 할당 할 수 있는 코드들이다.
느낌표를 이용한 암시적 추출 옵셔널
var implicitlyUnweappedOptionalValue: Int! = 100
switch implicitlyUnweappedOptionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
// 기존 변수처럼 사용가능
implicitlyUnweappedOptionalValue = implicitlyUnweappedOptionalValue + 1
// nil 할당 가능
implicitlyUnweappedOptionalValue = nil
// 잘못된 접근으로 인한 런타임 오류 발생
//implicitlyUnweappedOptionalValue = implicitlyUnweappedOptionalValue + 1
기존의 옵셔널과 같이 같은 switch 문의 case 들을 가지고 있고, nil일 경우 This Optional variable is nil 을 출력하고, 값일 경우 그 값을 출력해준다.
아래 코드와 같이 기존 변수처럼 더하거나 빼는것 같은 행위를 할수 있고 , nil 또한 할당이 가능하다.
그러나, 마지막 코드에서 볼 수 있듯이, nil로 이미 할당을 해준 것에 +1을 하게 될 경우 잘못된 접근으로 인한 런타임 에러가 발생하게 된다.
물음표를 이용한 옵셔널
var optionalValue: Int? = 100
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("value is \(value)")
}
// nil 할당 가능
optionValue = nil
// 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산불가
// optionalValue = optionalValue + 1
물음표를 사용해서 "이것은 Int 값이 들어있을 수도 있고, 아닐 수도 있다" 라는 표현을 하게 된다.
그리고 switch 문으로 값이 있는지 없는지를 확인할 수 있다.
그리고 일반적인 변수처럼 nil 또한 할당이 가능하다.
하지만, Optional 타입은 일반타입과는 다른타입으로 취급이 되기 때문에 연산이 불가능하다. 값 교환 또한 제한된다.
댓글