옵셔널(Optional)은 프로그래밍 언어에서 값이 있을 수도 있고 없을 수도 있는 상태를 나타내는 데이터 타입이다. 이를 통해 변수나 속성에 값이 존재하지 않을 때에도 코드가 안전하게 실행될 수 있도록 도와준다.
예를 들어보면,
var name : String = "가나다"
print(name)
다음과 같은 코드가 있다면 '가나다'가 출력될 것이다.
만약 name에 할당된 문자열이 없다면 오류가 발생한다. print함수가 name의 값을 출력해야하는데 name에 할당된 값이 없기 때문에 오류가 생긴다. 즉, 변수에는 항상 값이 할당되어야 한다.
이때 주의할 점은 '값이 없다'와 '빈 값'은 다르다는 것이다.
var a: String
var b: String = ""
print(a) //오류
print(b) //오류X
해당 코드에서 a는 값이 없는 것이고 b는 빈 값을 가지고 있는 것이다.
옵셔널 변수는 자료형뒤에 ?를 붙여서 만든다.
Q: 그렇다면 옵셔널 변수가 다른 점은 무엇일까?
A: 동일하게 예를 들어보면,var name : String? print(name)
다음과 같은 코드에서는 name에 값이 할당되지 않아도 오류가 발생하기 않고 nil이 출력이 된다. nil은 값이 없다는 뜻을 나타내는데, 옵셔널 변수가 값을 할당받지 못하면 nil값을 가지게 된다.
Q: 그렇다면 옵셔널 변수에 값을 할당되어있다면?
A1: 옵셔널의 값을 가져오고 싶은 경우에는 옵셔널 바인딩을 사용해야한다.
옵셔널 바인딩은 먼저 옵셔널의 값의 존재를 검사하고, 존재한다면 그 값을 사용할 수 있도록 한다.
이때 if let, guard let, while let 등을 사용하는데, 이는 옵셔널의 값을 안전하게 추출할 수 있다.if let unwrappedValue = optionalValue { // optionalValue가 nil이 아닌 경우, unwrappedValue에 값이 할당됨 // 이 블록 내에서 unwrappedValue를 사용할 수 있음 }
A2: 옵셔널을 강제로 해제할 수도 있다. !를 옵셔널 변수 뒤에 사용하여 해제할 수 있다.
이는 옵셔널 값이 nil이 아님을 확실할 때 사용한다. nil일 때 사용하면 오류가 발생한다.let unwrappedValue = optionalValue! // optionalValue가 nil이 아니라고 가정하고 강제 해제
Q: if let, guard let, while let의 차이점은?
- if let 구문은 옵셔널 값을 추출하고, 해당 값이 존재하는 경우에만 특정 코드 블록을 실행한다.
if let unwrappedValue = optionalValue { // optionalValue가 nil이 아닌 경우에만 실행되는 코드 블록 // unwrappedValue를 사용할 수 있음 }
옵셔널 값이 nil이 아니라면, 추출된 값을 지정된 상수에 할당하고 그 상수를 사용할 수 있다.
- guard let 구문은 함수나 메서드 내에서 옵셔널 값이 존재하는지 확인하며, 값이 존재하지 않는 경우 특정 조건을 만족하지 않는 상황에서 일찍 반환한다.
func someFunction() { guard let unwrappedValue = optionalValue else { return // optionalValue가 nil인 경우 빠른 종료 } // unwrappedValue를 사용할 수 있는 상황 }
- while let 구문은 옵셔널 값이 존재하는 동안 계속해서 코드 블록을 반복 실행한다.
옵셔널 값이 nil이 될 때까지 반복문이 실행된다. 반복마다 옵셔널 값을 추출하고, 값이 존재하면 반복 코드 블록이 실행된다.while let unwrappedValue = optionalValue { // optionalValue가 nil이 될 때까지 실행되는 반복문 // unwrappedValue를 사용할 수 있음 }