이해를 못한 부분이 있어서 추후 수정/보완이 필요한 게시물...
1. 옵셔널이란?
- 직역하자면 '선택적인'이라는 뜻... 즉, 값이 있을 수도, 없을 수도 있음을 표현
- nil이 할당될 수 있는지 없는지를 표현
- 값이 있을 수도 있고 없을 수도 있는 변수를 정의할 때에는 타입 어노테이션에 "?"를 붙여야 한다
func someFunction(someOptionalParm: Int?)
{
//...
}
-> someOptionalParm에 nil이 할당될 수 있다
func someFunction(someOptionalParam: Int)
{
//...
}
-> someOptionalParm에 nil이 할당될 수 없다
2. 옵셔널을 쓰는 이유
- 명시적 표현
- nil의 가능성을 코드만으로 표현이 가능하다
- 문서/주석을 작성하는 시간을 절약할 수 있다
- 안전한 사용
- 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용이 가능하다
- 예외 상황을 최소화 하는 안전한 코딩 방법
- 효율적인 코딩이 가능하다
3. 옵셔널 문법과 선언
- 옵셔널 문법 = enum + generics
- 옵셔널이 선언된 부분을 살펴보면
enum Optional<Wrapped>:ExpressibleByNiliteral
{
case none
case some(Wrapped)
}
옵셔널 변수를 선언해보면
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
- 옵셔널 표현
1) 느낌표(!)를 이용한 암시적 추출 옵셔널(Implicitly Unwrapped Optional)
var implicitlyUnwrappedOptionalValue: Int! = 100
이 변수를 사용해보면
switch implicitlyUnwrappedOptionalValue
{
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
Value is 100
기존 변수처럼 사용이 가능하다 (연산 가능)
implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1
옵셔널 변수이기 때문에 nil도 할당이 가능하다
implicitlyUnwrappedOptionalValue = nil
하지만 nil을 할당한 후에는 연산을 할 수 없기 때문에 잘못된 접근으로 인한 런타임 오류가 발생할 수 있다
implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1
-> 런타임 오류 발생!
2) 물음표(?)를 이용한 옵셔널
var optionalValue: Int? = 100
이 변수를 사용해보면
switch optionalValue
{
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
옵셔널 변수이기 때문에 nil을 할당할 수 있다
optionalValue = nil
그러나 기존 변수처럼은 사용이 불가능하다 (연산 불가)
optionalValue = optionalValue + 1
-> 컴파일 오류 발생!
암묵적 추출 옵셔널과 일반 옵셔널의 차이점에 대해 좀 더 알아보자면...
접근할 때 옵셔널 바인딩이나 옵셔널을 벗기는 과정을 거치지 않고도 바로 값에 접근할 수 있다는 점이 다르다고 한다
(옵셔널 바인딩과 옵셔널을 벗기는 과정에 대해서는 나중에 따로 포스팅해보자)
하지만 nil이 할당되어 있는데 접근을 시도하면 런타임 에러가 발생하기 때문에,
가급적이면 일반적인 옵셔널을 사용해서 정의하고, 옵셔널 바인딩 또는 옵셔널 체이닝을 통해 값에 접근하는 것이 더 바람직하다고 한다!
정리
1. 옵셔널이란?
- 직역하자면 '선택적인'이라는 뜻... 즉, 값이 있을 수도, 없을 수도 있음을 표현!
- nil이 할당될 수 있는지 없는지를 표현 -> 변수를 정의할 때 타입 어노테이션에 ? 를 붙인다
func someFunction(someOptionalParm: Int?) {}
2. 옵셔널을 쓰는 이유
- 명시적 표현 : nil의 가능성을 코드만으로 표현이 가능하며, 문서/주석을 작성하는 절약할 수 있음
- 안전한 사용 : 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 예외 상황을 최소화하는 안전한 코딩방법, 효율적 코딩
3. 옵셔널 문법과 선언
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
- 느낌표(!)를 사용한 암시적 추출 옵셔널
- 기존 변수처럼 사용이 가능하다 (연산 가능)
- 옵셔널 변수이기 때문에 nil을 할당할 수 있다
- 하지만 nil을 할당한 후에는 연산을 할 수 없기 때문에, 일반 변수처럼 연산했을 때 잘못된 접근으로 인한 런타임 오류가 발생할 수 있다
- 물음표(?)를 사용한 일반 옵셔널
- 옵셔널 변수이기 때문에 nil을 할당할 수 있다
- 기존 변수처럼은 사용이 불가능하다 (연산 불가능)
2022.02.23 - [Study/Swift_BoostCourse_Basic] - iOS 프로그래밍을 위한 스위프트 기초
'[Non-Updated] iOS > Swift_BoostCourse_Basic' 카테고리의 다른 글
[Swift_BoostCourse_Basic] CH 1_Quiz 1 (0) | 2022.03.08 |
---|---|
[Swift_BoostCourse_Basic] CH 1_12. 옵셔널 추출 (0) | 2022.03.08 |
[Swift_BoostCourse_Basic] CH 1_10. 반복문 (0) | 2022.03.02 |
[Swift_BoostCourse_Basic] CH 1_09. 조건문 (0) | 2022.02.25 |
[Swift_BoostCourse_Basic] CH 1_08. 함수 고급 (0) | 2022.02.25 |