[Swift]옵셔널 추출하기(Optional Unwrapping)

choe_ju·2023년 9월 25일

📖 옵셔널 타입이란?

  • 옵셔널(optional)타입은 스위프트에 특징중인 타입으로 nil(임시값)을 포함할 수 있도록 타입입니다.
    swift에서는 일반적인 데이터 타입의 경우 값이 비어있는 것은 오류로 처리합니다. 이러한 부분에서 값이 없는 경우 nil(임시값)을 부여하여 오류를 줄여주는 타입입니다.

📎 옵셔널 추출하기

  • 옵셔널 타입의 값을 일반 타입처럼 활용하기 위해서는 옵셔널 타입을 벗겨줘야합니다. 그러기 위해서는 아래와 같은 방법들이 있습니다.
  1. 강제 추출(Forced unwrapping)
  2. 옵셔널 바인당(Binding)
  3. nil 결합(Nil-Coalescing) 연산자
  4. 암시적 추출 옵셔널
  5. 옵셔널 체이닝(Chaining) - 연쇄적으로 옵셔널 접근

1. 강제 추출(Forced unwrapping)

  • 가장 간단한 방법으로 해당 옵셔널 값 뒤에 !를 붙여 값을 강제적으로 반환하는 방식이 있습니다.
  • 이 방식이 가장 간단하긴 하지만, 만약 해당 옵셔널 타입의 변수에 값이 없을 경우(nil)에는 런타임 오류가 발생할 수 있습니다.

그래서 간단한 테스트 이외에는 사용하는것은 비추천합니다!!

var x: String? = "test"

print(x)     // 출력결과 : Optional("test")
print(x!)    // 출력결과 : test

x = nil
print(x!)    // 🚨 런타임 오류 발생!!!

2. 옵셔널 바인당(Binding)

  • 가장 흔하게 이용하는 방식으로 옵셔널 값을 안전하게 추출할 수 있습니다.
  • 상수 letnil값이 들어올 수 없는 성질을 이용하는 방식으로 값이 해당 상수에 대입이 되는것을 조건문을 통해 확인하고 값이 넘어오면 해당 조건을 실행하는 방식으로 값을 추출합니다.
  • 기본적으로 if let, gurad let 구문으로 사용합니다.
let optionalString : String? = "Hello"
// if let
if let x = optionalString {
    // 값이 있는 경우 실행 코드
    print(x)	// 출력 결과 : Hello 
}else{
    // 값이 없는 경우 실행 코드
    print("값 없음")
}

// guard let
func bindingWithGuard() {
    guard let y = optionalString else{
    	// 값이 없는 경우 실행 코드
        print("값 없음")
    }
    // 값이 있는 경우 실행 코드
    print(y)	// 출력 결과 : Hello
}

3. nil 결합(Nil-Coalescing) 연산자

  • 옵셔널 타입의 값이 nil일 경우 대체값을 부여합니다.
  • 값이 nil일 경우에 실행 코드 없이 대체값을 부여해도 가능한 경우에는 코드가 간단하기 때문에 대신 사용합니다.
  • 사용 방식은 옵셔널 타입 변수 뒤 ??를 쓰고 뒤에 대체로 들어갈 값을 입력해 사용합니다.

    옵셔널 타입 변수 ?? 대체값

var optionalString : String? = "Hello"

let x = optionalString ?? "값 없음"   // String타입
print(x)							// 출력 결과 : Hello

optionalString = nil

let y = optionalString ?? "값 없음"   // String타입
print(y)							// 출력 결과 : 값 없음

4. 암시적 언래핑(Implicitly Unwrapped)

  • 암시적 언래핑은 변수 또는 상수를 선언할 때, 타입 뒤에 !를 사용하여 암시적 추출을 정의하고, 다른 변수에 값을 할당할 경우 자동으로 추출(Unwrapped)되는 옵셔널 타입입니다.
  • 단!! nil이 들어가는 경우에는 동일하게 런타임 오류가 발생합니다.
var myOptional: Int! = 42
print(myOptional) // 출력: Optional(42)

let value = myOptional! // 값 추출
print(value)	// 출력: 42

5. 옵셔널 체이닝(Chaining) - 연쇄적으로 옵셔널 접근

  • 옵셔널 체이닝은 옵셔널 값의 속성이나 메서드에 접근할 때 중간에 값이 하나라도 nil이라면, 체이닝은 멈추고 nil을 반환합니다.
  • 사용 방법은 해당 옵셔널 타입을 값을 사용할 때 값뒤에 ?를 붙여 사용합니다.
struct Address {
    var street: String?
}

class Person {
    var name: String?
    var address: Address?
}

var person: Person?
person = Person()
person.name = "John"
person.address = Address()
person.address?.street = "123 Main Street"

if let street = person.address?.street {
    print("Street: \(street)") // 출력: "Street: 123 Main Street"
} else {
    print("No street address")
}

// 만약 person.address = Address() 없이 person.address 가 nil일 경우 "No street address" 출력

0개의 댓글