-
Swift - Optional, 옵셔널swift 2023. 3. 13. 17:24
옵셔널이란?
- 값이 없을 수도 있음을 나타내는 타입이다.
- 특정 타입을 감싸는 형태이며, 해당 타입이 값이 없을 수도 있음을 의미한다.
- 사용 시, 프로그래머가 값이 없을 경우를 처리하도록 한다.
왜 옵셔널을 사용해야 할까?
- Swift 는 safety 안전을 중시하는 언어이다. https://developer.apple.com/kr/swift/#safety
- 프로그래밍 중 값이 없음을 나타내는 Null 을 다루다, 예상 못한 예외와 오류를 만나기 쉽다.
- Swift는 특정 타입들만이 값이 없을 수도 있도록 정의하며, 반대로 다른 타입들은 값이 있음을 보장한다.
- 값이 없을 수도 있는 타입들은 Optional, 옵셔널 타입이라 한다.
- 옵셔널 타입을 다룰 시 안전을 위해 Swift 언어 차원에서 제약을 둬, 값이 없음에 대한 예외 처리를 하도록 한다.
- 옵셔널 타입과 이들에 대한 예외 처리로 안전하지 않은 상황 및 동작을 방지한다.
사용 방법
정의
- 연관값 associated value를 사용하는 열거형 enum으로, 연관값은 Generic으로 받고 있다.
- 2개의 케이스로 구성돼 있으며, 값이 있음을 나타내는 .some, 값이 없음을 나타내는 .none 이다.
@frozen public enum Optional<Wrapped>: ExpressibleByNilLiteral { case none case some(Wrapped) // ... }
- Swift 코드에선 값의 없음을 nil 이라 나타낸다. 또한 값의 없음을 명시적으로 .none 으로 나타내기 보다 nil을 사용한다.
- ExpressibleByNilLiteral은 채택하고 있는 타입이 nil 리터럴에 의해 초기화 및 표현될 수 있도록 하는 프로토콜이다.
아래와 같은 생성자를 구현하도록 하며, 초기화 시 nil 을 입력하면 .none 케이스가 할당된다.
// ex) var optionalInt: Int? = nil public init(nilLiteral: ()) { self = .none }
etc
- 옵셔널과 관련해 연산자 뒤에 postfix 연산자 ?와 !가 붙은 형태를 볼 수 있다. ex) String? String! as? as!
값이 있거나 없거나, 처리가 성공하거나 실패하거나에 대한 의미가 달라진다.
? 물음표의 경우 값이 없을 수도 있음, 실패할 수도 있음 을 의미하며, 조심스러운 접근을 하겠다는 뉘앙스다.
! 느낌표의 경우 옵셔널이지만 값이 반드시 있거나, 반드시 성공함을 의미한다. 반드시 있음을 확신하며 강제적인 접근을 한다. - ! 느낌표와 같은 강제적인 접근과 사용 시, 값이 없거나 처리가 실패하면 런타임 에러로 이어지며 안전하지 않으니 주의.
선언
// 옵셔널 타입 선언 시, 아래 두 문장은 의미와 기능이 동일하다. // 옵셔널한 Int 타입임을 선언, Int(10) 을 대입 var optionalInteger: Optional<Int> = 10 // Optioanl<Type> 의 축약 표현, Type 뒤에 postfix 연산자 ? 붙임. var optionalInteger: Int? = 10
- 선언 시, 명시적으로 Optional<Type> 을 사용하기 보단, Type? 로 옵셔널 타입 선언을 한다.
- 선언 시, Type 뒤에 postfix 연산자 !를 붙인 Type! 같은 형태가 있는데, Implicitly Unwrapped Optional 로 해당 변수 사용 시 일반 변수와 같이 사용 가능하다.
다만, 일반 변수와 같이 사용 중 값이 없을 경우 런타임 에러로 이어지며 안전하지 않으니 주의.
사용
- 옵셔널로 둘러쌓인 값을 사용하기 위해, 옵셔널에서 꺼내는 작업 Unwrapping 이 필요하며 방법은 다양하다.
- 강제 언래핑
- nil 병합 연산
- 옵셔널 바인딩
- 옵셔널 체이닝
- 암시적 언래핑
그 외
- 옵셔널과 Equatable, Hashable
- 옵셔널 비교 연산
- nil
- 다양한 사용 예
'swift' 카테고리의 다른 글
Swift - UserDefaults extension 활용 편하게 사용하기 (0) 2022.10.14 UIView - touch 관련 메소드, 멀티 터치 (2) 2021.07.13 swift style guide - Naming (0) 2021.06.20 swift - escaping closure, result type (0) 2021.06.03 로그 출력 (0) 2021.06.01