728x90
안녕하세요:)
오늘은 Optional에 대해서 알아보는 시간을 가져보도록 하겠습니다!
Optional을 우리말로 번역하면 "선택적인"으로 번역할 수 있습니다.
말 그대로 선택!
swift에서는 어떤 의미로 사용될까요?
지금부터 알아보도록 하겠습니다.
1. Optional
- 옵셔널은 값을 가지지 않아도 되는 형식입니다.
- 옵셔널이 아닌 타입 뒤에 물음표( ? )를 붙이면 옵셔널 타입이 됩니다.
- nil은 값이 없다는 것을 나타내는 특별한 키워드입니다.
- nil을 반환하려면 해당 값이 Type Annotation으로 옵셔널 타입을 지정해야 합니다.
name: Type? // 타입 뒤에 물음표(?)를 붙여주면 옵셔널 타입이 됩니다.
var optionalNum: Int? // nil, 옵셔널 Int라고 읽습니다.
var str: String = "iOS" // Non-optional Type은 항상 값을 가져야 합니다.
왜 Optional을 사용할까요?
그 이유는 crash 없이 처리하기 위해서 사용합니다.
그렇다면 이 옵셔널 값을 어떻게 사용해야 할까요?
옵셔널 Int와 일반 Int, 옵셔널 String과 일반 String 등 결합이 불가합니다. 이 값을 사용하려면 옵셔널 언래핑이 필요합니다.
2. Unwrapping
- 옵셔널 타입의 값을 추출하는 과정을 언래핑이라고 합니다.
- 옵셔널 타입의 값을 언래핑하면 non 옵셔널 타입으로 반환합니다.
- 옵셔널 해제 방식은 명시적 해제(강제 해제)와 묵시적 해제(비강제적인 해제)로 나누어집니다.
<Forced Unwrapping>
- 옵셔널 타입의 값 뒤에 느낌표( ! ) 기호를 붙여주면 됩니다.
- 강제 추출을 사용할 때는 옵셔널 값이 nil 인지 아닌지를 확인해야 합니다.
- nil(값이 없을 때) 강제 추출하면 에러가 일어납니다.
var num: Int? = 10
print("옵셔널 자체의 값 : \(num)") // 옵셔널 자체의 값 : Optional(10)
print("강제 추출한 값 : \(num!)") // 강제 추출한 값 : 10
var nilNum: Int?
print("옵셔널 값 : \(nilNum)") // nil
print(nilNum!) // 에러!
이와 같이 값이 없을 때 강제 추출하면 에러가 일어납니다.
그렇기 때문에 강제 추출할 때는 꼭 값이 있는지 없는지 확인하고 추출해야 합니다.
var str = "123"
var inStr = Int(str)
if inStr != nil {
print("\(inStr!)")
} else {
print("값 변환 실패")
} // 123
이렇게 때문에 Forced Unwrapping은 사용하지 않는 것이 좋습니다.
그렇다면 어떤 방식으로 언래핑을 해야 할까요?
Optional Binding을 사용하면 안전하게 언래핑을 할 수 있습니다.
3. Optional Binding
- 옵셔널 바인딩은 조건문 내에서 일반 상수에 옵셔널 값을 대입하는 방식으로 이루어집니다.
- 옵셔널 바인딩을 사용하면 안전하고 직관적으로 언래핑 할 수 있습니다.
- 옵셔널 바인딩은 표현식을 평가한 후 값이 반환되면 언래핑하여 변수나 상수에 저장합니다.
- 옵셔널 표현식에서 nil(값이 없음)이 반환되면 바인딩이 실패하고 다음 문장으로 제어를 전달합니다.
- if문, while문, guard문에서 사용할 수 있습니다.
if let name: Type = OptionalExpression { // let name: Type = OptionalExpression 이 부분을 바인딩이라고 부릅니다.
statement
}
while let name: Type = OptionalExpression {
statement
}
guard let name: Type = OptionalExpression else {
statement
}
var str: String? = "Hello"
guard let str = str else { // 여기서 바인딩된 상수는 else블록 다음에서 사용할 수 있습니다.
fatalError()
} // 값을 리턴하는 경우에만 Unwrapping하기 때문에 강제추출과 같은 에러는 발생하지 않습니다.
str // Hello
var num: Int? = nil
if let num = num {
print(num)
} else {
print("fail")
} // fail
4. Implicitly Unwrapped Optional(IUO)
- IUO는 자료형 뒤에 느낌표( ! )를 붙여주면 됩니다.
- 특정 조건에서 자동으로 추출합니다.
- nil이 저장되어 있는 상태에서 강제로 추출하면 에러가 발생합니다.
- 변수의 값이 ni이 될 가능성이 있다면 IUO를 사용하지 않아야 합니다.
- IBOutlet에서 사용하는 이유는, 연걸되지 않은 Outlet을 컴파일 시점에서 미리 발견하기 위해서 사용합니다.
var str: String! = "Swift"
str
var num: Int! = 12
num
5. Nil Coalescing Operator
- 옵셔널 바인딩을 한 줄로 줄이고 싶을 때 사용합니다.
- A ?? B -> OptionalExpression ?? Expression
- 단락 평가를 실시, 값이 있다면 좌측 값, 값이 없다면 우측 값을 반환합니다.
- 왼쪽에 있는 피연산자에 값이 저장되어 있는지 확인하고 값을 반환한다면 값을 언랩핑 한 다음 연산의 결과를 반환합니다.
var str: String! = nil
var result = "확인결과" + (str ?? "nil")
print(result) // 확인결과 nil
728x90
'Swift' 카테고리의 다른 글
Closures (0) | 2020.11.16 |
---|---|
Function (0) | 2020.11.12 |
Loop statements - While문 (0) | 2020.10.29 |
Loop statements - for문 (0) | 2020.10.29 |
Conditional Statement - guard문 (0) | 2020.10.29 |