Swift Optional이란
Swift에서 Optional은 값이 있을 수도 있고 없을 수도 있는 변수나 상수를 표현하는 데이터 타입입니다. Optional은 기본적으로 열거형으로 정의되어 있으며, Optional 값을 사용할 때는 값이 있는지 없는지 검사한 후에 사용해야 합니다.
Optional 타입은 ? 기호를 이용하여 변수나 상수의 타입 뒤에 지정합니다. 예를 들어, 정수형(Optional Int) 변수를 선언하는 방법은 다음과 같습니다:
var optionalInt: Int?
optionalInt 변수는 값이 있을 수도 있고 없을 수도 있는 정수형 변수입니다. 값이 없는 경우에는 nil이 할당됩니다.
Optional 값은 강제 언래핑(Forced Unwrapping), 옵셔널 바인딩(Optional Binding), 옵셔널 체이닝(Optional Chaining) 등의 방법을 사용하여 값을 추출할 수 있습니다. 강제 언래핑은 ! 기호를 사용하여 값을 추출하는 방법입니다. 옵셔널 바인딩은 if let 또는 guard let 구문을 사용하여 값을 추출하는 방법입니다. 옵셔널 체이닝은 ? 기호를 사용하여 옵셔널 값에 접근하는 방법입니다.
예를 들어, 다음 코드는 Optional 값을 사용하여 값을 추출하는 방법을 보여줍니다:
var optionalString: String? = "Hello, World!"
// 강제 언래핑
let forceUnwrapString = optionalString!
print(forceUnwrapString)
// 옵셔널 바인딩
if let optionalBindingString = optionalString {
print(optionalBindingString)
}
// 옵셔널 체이닝
let optionalChainingString = optionalString?.uppercased()
print(optionalChainingString)
위의 코드에서 optionalString 변수는 Optional String 타입으로 선언되어 있으며, 값이 "Hello, World!"인 경우가 있습니다. 강제 언래핑을 사용하여 ! 기호를 이용하여 값에 접근하면, optionalString 변수가 nil인 경우 런타임 에러가 발생합니다. 따라서, 강제 언래핑을 사용할 때는 값이 반드시 존재할 때에만 사용해야 합니다.
옵셔널 바인딩은 if let 또는 guard let 구문을 사용하여 Optional 값을 추출하는 방법입니다. if let 구문은 Optional 값이 존재하는 경우에만 실행되며, 추출된 값을 지정한 변수에 할당합니다. guard let 구문은 Optional 값이 존재하지 않는 경우에 빠르게 종료할 수 있도록 도와줍니다.
옵셔널 체이닝은 Optional 값에 대해 메서드를 호출하거나 프로퍼티에 접근할 때 사용됩니다. Optional 값이 존재하지 않는 경우에는 메서드나 프로퍼티 호출이 무시되고, nil이 반환됩니다.
예를 들어, 위의 코드에서 optionalString 변수에 대해 옵셔널 체이닝을 사용하여 uppercased() 메서드를 호출하면, optionalString 변수가 nil인 경우에는 uppercased() 메서드가 호출되지 않으며, 결과값도 nil이 반환됩니다.
강제 언레핑 (Force Unwrapping)
강제 언래핑(Force Unwrapping)은 Optional 변수나 상수에 값을 강제로 할당하는 것입니다. 즉, Optional 변수나 상수에 저장된 값을 강제로 가져오는 것입니다. 강제 언래핑은 느낌표(!)를 사용하여 수행합니다.
예를 들어, 아래와 같이 Int 타입의 Optional 변수 num이 있다고 가정합니다.
var num: Int? = 10
num 변수에 값이 있으므로, 이를 출력하려면 강제 언래핑을 사용할 수 있습니다.
print(num!) // Output: 10
하지만, Optional 변수나 상수에 값이 없는 경우 강제 언래핑을 시도하면 런타임 에러가 발생합니다. 따라서 강제 언래핑은 사용할 때 주의해야 합니다. 가능하면 안전한 Optional 바인딩 방법을 사용하는 것이 좋습니다.
옵셔널 바인딩(Optional Binding)
Swift에서 옵셔널 바인딩(Optional Binding)은 Optional 변수나 상수에 값이 있는지 확인하고, 값이 있다면 그 값을 다른 변수나 상수에 할당하는 것을 말합니다. 옵셔널 바인딩은 if let 또는 guard let을 사용하여 수행합니다.
if let을 사용한 예시를 살펴보겠습니다. 아래와 같이 Int 타입의 Optional 변수 num이 있다고 가정합니다.
var num: Int? = 10
num 변수에 값이 있으면, 이 값을 다른 변수에 할당할 수 있습니다.
if let unwrappedNum = num {
print(unwrappedNum) // Output: 10
}
위 예제에서, num 변수에 값이 있으므로 if문 안의 unwrappedNum 상수에 num 변수의 값을 할당하고, 이 값을 출력합니다.
guard let을 사용한 예시도 살펴보겠습니다. 아래와 같이 String 타입의 Optional 변수 name이 있다고 가정합니다.
var name: String? = "John"
guard let을 사용하여 name 변수에 값이 있는지 확인하고, 있다면 이 값을 다른 변수에 할당합니다.
func printName() {
guard let unwrappedName = name else {
return
}
print(unwrappedName)
}
printName() // Output: John
위 예제에서, guard let문 안의 unwrappedName 상수에 name 변수의 값을 할당합니다. 만약 name변수에 값이 없으면, guard문이 실행되어 return문으로 함수를 빠져나갑니다. 그렇지 않으면, name 변수의 값이 출력됩니다.
옵셔널 바인딩은 Optional 변수나 상수에 값이 있는지 확인하고, 값이 있으면 해당 값을 사용할 수 있습니다. 이를 통해 안전하게 Optional 변수나 상수에 접근할 수 있습니다.
옵셔널 체이닝(Optional Chaining)
Swift에서 옵셔널 체이닝(Optional Chaining)은 Optional 변수나 상수의 프로퍼티에 접근할 때, 해당 변수나 상수가 nil이 아니면 프로퍼티에 접근하고, nil이면 nil을 반환하는 것을 말합니다. 옵셔널 체이닝은 물음표(?)를 사용하여 수행합니다.
예를 들어, 아래와 같이 Person 클래스가 있고, 이 클래스에는 name과 job 프로퍼티가 있습니다.
class Person {
var name: String?
var job: Job?
}
class Job {
var title: String
init(title: String) {
self.title = title
}
}
let person = Person()
Person 인스턴스인 person의 job 프로퍼티에 접근하고, 이 프로퍼티의 title 프로퍼티에 접근하려면, 옵셔널 체이닝을 사용할 수 있습니다.
let jobTitle = person.job?.title
print(jobTitle) // Output: nil
위 예제에서, person 인스턴스의 job 프로퍼티는 nil이므로, jobTitle 상수에는 nil이 할당됩니다.
반면, 아래와 같이 person 인스턴스에 job 인스턴스를 할당한 경우, jobTitle 상수에는 해당 job 인스턴스의 title 프로퍼티 값이 할당됩니다.
let job = Job(title: "Developer")
person.job = job
let jobTitle = person.job?.title
print(jobTitle) // Output: Developer
옵셔널 체이닝은 중첩된 Optional 변수나 상수의 프로퍼티에 접근할 때 유용하게 사용됩니다. 중첩된 Optional 변수나 상수에 안전하게 접근할 수 있으며, 이를 통해 앱의 안정성을 높일 수 있습니다.
'Programming Language > Swift' 카테고리의 다른 글
[Swift] Swift 간단 정리 5, Error Handling (0) | 2023.04.29 |
---|---|
[Swift] Swift 간단 정리 4, Type Casting (0) | 2023.04.29 |
[Swift] Swift 간단 정리 2, 흐름제어문 (0) | 2023.04.28 |
[Swift] Swift 간단 정리 1 (0) | 2023.04.28 |