ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.