What Optional?
IOS 개발을 하다보면 옵셔널 이라는 단어를 자주 듣게 됨.
옵셔널이란 값이 있을수도 있고 없을수도 있는 변수를 나타내는 타입임.
예를 들어, 문자열 변수를 선언하고 값을 할당한 후 이 변수를 출력하려고 할 때, 그 값이 nil일 경우 앱이 충돌할 수 있음. 이런 상황을 방지하기 위해 옵셔널 타입으로 변수를 선언하면 값이 nil일 때도 앱이 안전하게 동작할 수 있음.
How?
옵셔널 변수는 변수명 뒤에 물음표(?)를 붙여서 선언함.
물음표를 붙여 선언된 변수는 값이 있을 수도 있고 없을 수도 있으므로, 변수를 사용할 때에는 반드시 nil 여부를 체크해야 함.
var optionalString: String? = "Hello, world!"
print(optionalString) // "Optional("Hello, world!")"
optionalString = nil
print(optionalString) // "nil"
위 코드에서 optionalString 변수는 String? 타입으로 선언함.
초기값으로 "Hello, world!" 문자열을 할당하고 출력하면 Optional("Hello, world!")와 같이 Optional로 감싸진 문자열이 출력됨.
이어서 optionalString 변수에 nil 값을 할당한 후 출력하면 nil이 출력됨.
또한, 아래와 같은 방법으로 옵셔널 변수에 접근할 때에는 강제 언래핑(!)을 사용하여 옵셔널 값을 강제로 추출할 수도 있음.
var optionalString: String? = "Hello, world!"
print(optionalString!) // "Hello, world!"
optionalString = nil
print(optionalString!) // Error: unexpectedly found nil while unwrapping an Optional value
위 코드에서 optionalString 변수를 강제 언래핑하여 출력하면 Optional("Hello, world!") 대신 "Hello, world!"가 출력됨.
하지만, 옵셔널 변수에 nil 값이 할당되어 있을 때 강제 언래핑을 시도하면 앱이 충돌하므로 주의해야함!!
그리고 느낌표(!)를 쓰지 않고 언래핑하는 방법인 옵셔널 바인딩이라고 있음.
옵셔널 바인딩(Optional Binding)은 옵셔널 변수에 값이 있는지 확인하고, 값이 있다면 그 값을 다른 변수에 할당하는 것임.
옵셔널 바인딩을 사용하면 옵셔널 값을 안전하게 추출할 수 있으며, 값이 없을 때는 코드 실행을 건너뛰어 안전한 앱을 만들 수 있음.
if let 구문
if let 구문은 옵셔널 변수를 할당할 새로운 변수를 만들고, 그 변수에 옵셔널 값이 할당될 수 있는지 검사하는 구문임.
var optionalString: String? = "Hello, world!"
if let unwrappedString = optionalString {
print(unwrappedString) // "Hello, world!"
} else {
print("optionalString is nil")
}
위 코드에서 if let 구문을 사용하여 optionalString 변수를 검사하는 것임. optionalString 변수에 값이 있으면 unwrappedString 변수에 할당하고, 그 값을 출력합니다. 값이 없으면 else 블록이 실행됨.
guard let 구문
guard let 구문은 if let 구문과 유사하지만, 코드 실행 중 함수나 메소드를 빠져나가는 것이 가능함.
func printOptionalString(optionalString: String?) {
guard let unwrappedString = optionalString else {
print("optionalString is nil")
return
}
print(unwrappedString)
}
printOptionalString(optionalString: "Hello, world!") // "Hello, world!"
printOptionalString(optionalString: nil) // "optionalString is nil"
optionalString 변수에 값이 있으면 unwrappedString 변수에 할당하고, 그 값을 출력합니다. 값이 없으면 else 블록이 실행되어 "optionalString is nil"이 출력되고, 함수가 반환됨.
이상 IOS Optional에 대해서 적어봤음.