걔: 너 이 자식 대체 뭘 뒤집어쓴 거야?
???: 이게 바로 옵셔널이란 건데···

옵셔널(Optional)
옵셔널(Optional)은 Swift에서 값이 있을 수도 있고, 없을 수도 있는 변수 또는 상태를 나타내기 위해 사용됩니다. 이는 값이 없는 상태를 명시적으로 나타내며, 코드의 안전성을 높이는 중요한 기능입니다. 옵셔널을 사용하면 값이 nil일 수 있는 경우를 안전하게 처리할 수 있는데, 이때 옵셔널 타입은 값이 있는 경우 해당 값을 포함하고, 값이 없는 경우 nil을 포함합니다. 이러한 옵셔널을 선언할 때는 타입 뒤에 물음표( ? )를 붙입니다.
옵셔널 선언
var name: String? // 옵셔널 String 타입
var age: Int? // 옵셔널 Int 타입
옵셔널 해제(Unwrapping)
옵셔널 해제란 옵셔널 객체를 해제하고, 옵셔널 내부에 있는 값을 추출하는 과정을 말합니다. 옵셔널 해제 방법은 강제 언래핑, 옵셔널 바인딩, 옵셔널 체이닝 등이 있습니다.
강제 언래핑(Forced Unwrapping)
강제 언래핑은 옵셔널 변수에 항상 값이 있다 확신할 때, 느낌표( ! )를 사용하여 강제로 값을 추출하는 방법입니다.
※ 그러나, 이 값이 nil일 경우 런타임 에러가 발생합니다.
var name: String? = "Alice"
print(name!) // "Alice" 출력
name = nil
// print(name!) // 런타임 에러 발생
옵셔널 바인딩(Optional Binding)
옵셔널 바인딩은 조건문을 사용하여 옵셔널 변수의 값 여부를 판단, 확인하고 값이 있을 경우에만 일시적으로 다른 변수에 값을 할당하여 사용하는 방법입니다. 이 경우 변수가 nil이 아닌 경우에만 코드 블록이 실행되기 때문에 강제 언래핑보다 안정적입니다.
if let 예시
var name: String? = "Alice"
if let unwrappedName = name {
print("Hello, \(unwrappedName)!")
} else {
print("Name is nil")
}
// "Hello, Alice!" 출력
name = nil
if let unwrappedName = name {
print("Hello, \(unwrappedName)!")
} else {
print("Name is nil")
}
// "Name is nil" 출력
guard let 예시
func greet(person: String?) {
guard let name = person else {
print("No name")
return
}
print("Hello, \(name)!")
}
greet(person: "Alice") // Hello, Alice!
greet(person: nil) // No name provided
옵셔널 체이닝(Optional Chaining)
옵셔널 체이닝이란 옵셔널 값에 접근할 수 있도록 하는 방법이며, 옵셔널 값이 연속적으로 연결된 경우에도 안전하게 값을 가져오거나 메서드를 호출할 수 있는 방법입니다. 옵셔널 체이닝을 사용하면 중간에 nil이 발생하더라도 전체 표현식이 nil을 반환하게 되어 안전하게 처리됩니다.
struct Person {
var contacts: Contact?
}
struct Contact {
var address: Address?
}
struct Address {
var street: String?
}
let person = Person(contacts: Contact(address: Address(street: "123")))
if let street = person.contacts?.address?.street {
print("Street: \(street)")
} else {
print("No street found")
}
// "Street: 123" 출력
let anotherPerson = Person(contacts: nil)
if let street = anotherPerson.contacts?.address?.street {
print("Street: \(street)")
} else {
print("No street found")
}
// "No street found" 출력
옵셔널 체이닝은 옵셔널에 속한 프로퍼티, 메서드, 또는 서브스크립트에 접근할 때 사용합니다. 옵셔널 체이닝의 결과는 항상 옵셔널이며, 체인의 중간에 nil이 포함되어 있으면 전체 체인은 nil이 됩니다. 기본값을 제공하려면 ?? 연산자를 사용하여 nil일 경우 대체값을 지정할 수 있습니다.
let personWithDefault = Person(contacts: Contact(address: Address(street: nil)))
let street = personWithDefault.contacts?.address?.street ?? "Unknown street"
print("Street: \(street)")
// "Street: Unknown street" 출력
위 예시에서 옵셔널 체이닝을 사용하여 contacts와 address가 nil인지 확인한 후 street 값에 접근합니다. 만약 중간에 nil이 존재하면 전체 체인이 nil이 되고, ?? 연산자를 사용하여 기본값을 제공할 수 있습니다. 이러한 방법을 통해 옵셔널 체이닝은 안전하고 효율적인 옵셔널 값 접근을 가능하게 합니다.
요약하자면,
옵셔널이라는 가면을 쓴 무언가가 우리 집 문을 두드립니다. 그런데 가면을 쓰고 있으니 누군지 알 길이 없죠?
이때 누군지 확실히 알고 있다면 강제 언래핑을 사용하면 되고,
슬쩍 목소리만 듣고 누군지 확인해서 아는 사람일 때만 집 안에 들어오게 하는 절차가 옵셔널 바인딩입니다.
옵셔널 체이닝은 마치 여러 명이 줄을 서서 문을 두드리는 상황과 비슷합니다. 각 사람은 가면을 쓰고 있고, 우리는 이 줄에 있는 모든 사람을 확인할 필요가 있습니다. 만약 첫 번째 사람의 목소리를 듣고 아는 사람이라면 문을 열어줍니다. 그러면 두 번째 사람이 나타나는데, 이 사람도 가면을 쓰고 있죠. 다시 한번 목소리를 확인하고 아는 사람이라면 문을 열어줍니다. 이런 식으로 계속해서 확인해 나가다가 모르는 사람이 나오면 바로 문을 닫고 더 이상 확인하지 않는 것입니다.
'걔 (개발)로그 > Swift' 카테고리의 다른 글
| Swift에서 인스턴스 (Instance) 및 인스턴스 메서드 (Instance Methods) (0) | 2024.05.17 |
|---|---|
| Swift에서 UserDefaults의 정체 (0) | 2024.05.16 |
| Swift에서의 전달인자(Argument), 매개변수(Parameter), 반환타입(Return Type) | 이건 또 뭐여 (0) | 2024.05.15 |
| Swift에서의 함수? 클래스? 메서드? | 그래서 걔들이 뭔데? (0) | 2024.05.15 |
| Swift에서의 소프트웨어 아키텍처 개념 및 MVVM, MVC 패턴 (0) | 2024.05.15 |