ㅈㅣㄴ 2024. 10. 31. 14:14

옵셔널 타입

1. Option Type vs. Nullable Type

  • 옵션 타입: 옵션 값을 캡슐화하는 다형성 타입으로, 함수가 의미 있는 값을 반환할 수도 있고 그렇지 않을 수도 있을 때 사용됩니다. 위키백과: Option type
  • Nullable 타입: 프로그래밍 언어에서 값이 NULL로 설정될 수 있는 특별한 값을 허용하는 기능입니다. 위키백과: Nullable type

2. Int형 vs. 옵셔널 Int형

  • Int형
    • 예: var x: Int = 10
    • 값 저장: Int는 정수 값을 저장합니다.
  • 옵셔널 Int형
    • 예: var y: Int? = 10 또는 var z: Int!
    • 값 저장: Int?는 정수 값을 저장하거나 값이 없음을 나타낼 수 있습니다(nil).

3. 옵셔널 타입의 중요성

  • 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입으로 감싸서 반환합니다.
    • 예: Int("123")은 Optional(123)을 반환하고, Int("Hi")는 nil을 반환합니다.
    • Swift의 기본 자료형(Int, Double, String 등)은 nil 값을 저장할 수 없으며, 이를 저장하려면 옵셔널 타입으로 선언해야 합니다.
  • 옵셔널 타입은 값이 할당되지 않는 상황을 안전하게 처리하는 방법을 제공합니다.
  • 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 ? 문자를 씁니다.
    • 예: var index: Int?

4. 옵셔널 타입 강제 언래핑(forced unwrapping)

  • 옵셔널 변수에 값이 있으면 이를 강제 언래핑하여 사용할 수 있습니다.
    • 예: 
    • swift
      코드 복사
      var x: Int? = 10 print(x!) // 10
  • 주의: 강제 언래핑 시 값이 nil인 경우 런타임 오류가 발생할 수 있으므로 옵셔널 바인딩이나 옵셔널 체인을 사용하는 것이 좋습니다.

5. 옵셔널 바인딩(optional binding)

  • 강제 언래핑 대신 옵셔널 바인딩을 사용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당할 수 있습니다.
    • 예:
      swift
      코드 복사
      if let xx = x { print(xx) } else { print("nil") }
  • 여러 옵셔널 변수를 한 번에 언래핑하는 방법도 있습니다.
    • 예:
      swift
      코드 복사
      if let firstPet = pet1, let secondPet = pet2 { print(firstPet, secondPet) } else { print("nil") }

6. 암묵적 언래핑 옵셔널(implicitly unwrapped optional)

  • 항상 유효한 값을 가질 경우 암묵적 언래핑 옵셔널로 선언할 수 있습니다.
    • 예:
      swift
      코드 복사
      var x: Int! x = 10 print(x) // 10

7. 옵셔널 사용 이유

  • 옵셔널 타입은 값을 갖지 않는 상태(nil 값)를 표현할 수 있습니다.
  • 옵셔널이 아닌 변수나 상수에는 nil을 할당할 수 없습니다.
    • 예:
      swift
      코드 복사
      var myInt: Int? = nil // 가능 var myString: String = nil // 불가능

8. 옵셔널은 연관 값을 갖는 열거형

  • Swift에서 옵셔널은 연관 값을 갖는 열거형입니다.
    • 예:
      swift
      코드 복사
      public enum Optional<Wrapped> { case none case some(Wrapped) } var x: Int? = 20 // .some(20) var y: Int? = Optional.some(10) var z: Int? = Optional.none // nil

9. Any와 AnyObject

  • AnyObject: 모든 클래스 타입의 인스턴스를 나타낼 수 있습니다.
    • 예:
      swift
      코드 복사
      var someObject: AnyObject
  • Any: 모든 타입의 인스턴스를 나타낼 수 있습니다.
    • 예:
      swift
      코드 복사
      var anything: Any

예시 코드

swift
코드 복사
var x: Int? var y: Int? x = 10 y = 20 if let xx = x { print(xx) } else { print("nil") } if let yy = y { print(yy) } else { print("nil") }