옵셔널(Optional) 에 대한 정리 🧑🏻‍💻

옵셔널

옵셔널은 Swift 언어의 중요한 기능 중 하나 이다. 옵셔널은 값이 존재할 수도 있고 존재하지 않을 수도 있는 값을 나타낸다. 이를 통해서 nil 값이 발생할 수 있는 상황에서 안전하게 코드를 작성할 수 있다.

옵셔널의 개념 두가지

  • 값이 존재하는 경우 : 변수나 상수에 유효한 값이 할당된 경우를 나타낸다.
  • 값이 존재하지 않는 경우 : 변수나 상수에 nil 이 할당된 경우를 나타낸다.

옵셔널은 ? 기호를 사용하여 선언되며, 예를 들어 Int? , String? 과 같은 형태로 사용된다.

옵셔널 해제(Optional Unwrapping)

옵셔널 변수에 접근하고 실제 값에 접근하기 위해서는 옵셔널 언랩핑이 필요하다.

  • 옵셔널 바인딩(Optional Binding) : 옵셔널 바인딩은 옵셔널 변수에 대해 nil 여부를 확인하고, 값이 존재하는 경우 해당 값을 상수나 변수에 할당하는 방법이며, 가장 일반 적인 형태는 if let , guard let 구문으로 사용한다.
func processOptionalValue(optionalValue: Int?) {
    // 옵셔널 바인딩을 사용하여 optionalValue가 nil이 아닌 경우에만 값을 가져와서 처리합니다.
    if let unwrappedValue = optionalValue {
        // optionalValue가 nil이 아닌 경우, unwrappedValue에 값을 할당합니다.
        print("값이 있습니다: \\(unwrappedValue)")
    } else {
        // optionalValue가 nil인 경우에는 else 블록이 실행됩니다.
        print("값이 없습니다.")
    }
}

func processOptionalValue(optionalValue: Int?) {
    // 옵셔널 바인딩을 사용하여 optionalValue가 nil이 아닌지 확인합니다.
    // nil인 경우, 함수 실행을 종료하고 else 블록을 실행합니다.
    guard let unwrappedValue = optionalValue else {
        print("값이 없습니다.")
        return
    }
    
    // optionalValue가 nil이 아닌 경우, unwrappedValue에 값을 할당하고 함수 계속 실행합니다.
    print("값이 있습니다: \\(unwrappedValue)")
}
	
  • 강제 옵셔널 해제(Forced Unwrapping) : 강제 옵셔널 해제는 옵셔널 변수 뒤에 ‘ ! ‘ 기호를 붙여서 사용한다. 변수의 값을 강제로 가져오는 방법이지만, 값이 nil 일 경우 런타임 에러가 발생할 수 있으므로 확실하게 nil 이 오지 않는 상황에서만 사용한다.
let unwrappedValue = optionalValue!
  • 옵셔널 체이닝(Optional Chaining) : 옵셔널 체이닝은 옵셔널 값의 프로퍼티나 메서드에 접근할 때 사용된다. 옵셔널 값이 nil 인 경우 연산이 중단되고 nil 을 반환한다.
let length = str?.count
  • 널 병합 연산자 : 옵셔널 값이 nil 일때 기본 값을 사용하고자 할 때 사용된다.
let result = optionalValue ?? defaultValue

옵셔널의 활용

  • 함수의 반환 값이 존재하지 않을 수 있는 경우
  • 프로퍼티나 변수가 초기화되지 않은 경우
  • 컬렉션에서 특정 인덱스의 값이 존재하지 않는 경우
  • 외부 리소스와의 상호 작용에서 값의 유무가 확실하지 않은 경우

옵셔널은 swift 에서 안전성을 보장하고 nil 관련 문제를 방지하는 기능이다. 옵셔널을 올바르게 사용하면 코드의 안정성을 높이고 런타임 에러를 방지할 수 있다.


'◽️ Programming > Swift 문법' 카테고리의 다른 글

Swift Protocal  (0) 2024.03.02
Swift Extention  (0) 2024.03.02
Swift Initializer  (0) 2024.03.02
Swift Type Casting  (0) 2024.03.02
Swift Class 상속 , overriding  (0) 2024.03.02