스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

15. 스파르타 코딩 클럽 - 옵셔널 언래핑

seongpil Heo 2025. 3. 17. 18:18

 옵셔널 언래핑 (Optional Unwrapping)

📚 옵셔널 타입은 값이 없을수도 있는 경우를 안전하게 처리하기 위해 사용되지만, 값에 접근하면 Optional(값)으로 래핑 되어 있어서 바로 사용하지 못하는 불편함이 있습니다. 따라서 이 옵셔널로 래핑 된 값에서 옵셔널을 제거하고 값으로 변환하는 과정을 옵셔널 언래핑 이라고 부르며, 몇 가지 방법으로 이를 수행할 수 있습니다.
       
        • 옵셔널 바인딩     • 강제 언래핑 옵셔널
        • 기본값 제공        • 묵시적 언래핑

 옵셔널 바인딩 (Optional Binding)

  • 조건문 if , guard 구문을 사용하여 안전하게 옵셔널을 언래핑하는 방법입니다.
  • if let
    • if let을 사용하여 옵셔널 바인딩을 할 수 있습니다.
    • 값이 있다면 if let 코드블록이 실행되고, 이 블록 안에서 언래핑 된 값을 사용할 수 있습니다.
    • 값이 없을 때 작업을 하고 싶다면 else 코드블록을 작성하면 됩니다.
// 값이 있을 때 if let 옵셔널 바인딩 코드
var intValue: Int? = 10

if let intValue = intValue { 
    print(intValue) // 출력 값 : 10
                    // Optional 언래핑되어 실제 값이 출력됩니다.
                    // 옵셔널 언래핑된값은 해당 블록에서만 사용 가능합니다.
}

print(intValue) // Optional(10)

 

// 값이 없을 때 if let 옵셔널 바인딩을 사용하여 else에서 작업 진행

var optionalValue: String? // 아무런 값을 주지않아서 nil인 상태
if let optionalValue = optionalValue {
    print(optionalValue) // optionalValue가 nil이 아니면 해당 코드블록이 실행되어 값이 출력됩니다.
} else {
    print("optionalValue 값은 nil 입니다.") // 출력 값 : optionalValue 값은 nil 입니다.
}

 

  • guard let
    • guard let 구문은 옵셔널 바인딩 결과가 nil일 경우, 해당 코드 블록을 빠져나가게 하여 이후 코드가 실행되지 않도록 합니다.
    • 클로저나 메서드 내부에서 주로 사용됩니다.
    • 코드의 가독성을 높이고, 중첩된 조건문을 피할 수 있습니다.
// 값이 없는 경우
func guardLetFunction() {
    var optionalValue: String? // 아무런 값을 주지않아서 nil인 상태
    guard let optionalValue = optionalValue else {
        print("guard 실행") // optionalValue가 nil이면 해당 코드블록이 실행됩니다.
        return // 함수를 종료하여 아래의 코드로 내려가지 못하게 막습니다.
    }
    
    print(optionalValue) // 위의 guard let에서 함수가 종료되어 실행되지 못함
}

guardLetFunction()

/* 출력 값
	"guard 실행"
*/

 

func guardLetFunction() {
    var optionalValue: String? = "Hello"
    guard let optionalValue = optionalValue else {
        print("guard 실행") 
        return // 함수를 종료하여 아래의 코드로 내려가지 못하게 막습니다.
    }
    
    print(optionalValue) // Optional이 언래핑된 값 "Hello"가 출력됩니다.
}

guardLetFunction() 

/* 출력 값
	"Hello"
*/

 기본값 제공

  • Nil-결합 연산자(Nil-Coalescing Operator) 방법을 사용하는 방법입니다.
  • 옵셔널 값 뒤에 ?? 를 붙인 후 기본값을 제공할 수 있습니다.
  • 옵셔널 값이 nil이면 ?? 뒤에 있는 기본 값을 사용합니다.
let name: String? = nil
print(name ?? "Default Name") // 값이 nil이여서 ?? 뒤에 있는 "Default Name"이 출력됩니다.

let greeting = "안녕하세요 \(name ?? "A")님!"
print(greeting) // "안녕하세요 A님!" 이 호출됩니다.
                // name이 nil이여서 기본 값 "A"를 사용합니다.

 옵셔널 강제 언래핑 (force unwrapping)

  • 옵셔널 값에 ! 를 붙여서 사용합니다.
  • nil이 아니라면 언래핑이 되지만 nil이면 런타임오류를 발생시킵니다!
  • nil 이 아님을 확신할 때 사용합니다.
    • 지양하는 것이 좋습니다.
var name: String? = "Brody"

print(name!)  // "Brody" 출력

name = nil

print(name!) // 런타임 오류 발생

 옵셔널 묵시적 언래핑(Implicitly Unwrapped Optional)

  • 옵셔널 타입을 선언할 때 ?가 아닌 !를 사용하면 묵시적 언래핑 되는 옵셔널로 정의할 수 있습니다.
  • 값을 사용할 때 자동으로 언래핑되어, 별도의 언래핑 작업 없이 직접 사용할 수 있습니다.
  • 값이 nil 일 때 접근하면 런타임 오류가 발생합니다.
  • 값이 있다고 확신이 들 때 사용해야 합니다.
  • 옵셔널 바인딩이 가능합니다.
var name: String! = "Brody" // 타입을 String!으로 설정하여 묵시적 옵셔널 언래핑을 사용

print(name) // Optional("Brody") : 값 자체는 옵셔널
print(name.count) // 5 : 값에서 가져온 값은 옵셔널값이 아닌 일반 값 출력

if let name = name {
    print(name) // "Brody" 출력
}