옵셔널

JG Ahn·2024년 10월 2일

swift 기초

목록 보기
10/23

1. 옵셔널이란?

  • 값이 있을 수도, 없을 수도 있음을 의미하는 열거형

2. 옵셔널 문법과 선언

  • 옵셔널 문법 : enum + general
  • 옵셔널 선언
// 아래는 모두 같은 의미의 표현
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil

//일반 상수에 nil을 넣으려는 경우 오류 발생
//let someConstant: Int = nil

3. 옵셔널 방식

  • 옵셔널 바인딩 : if let / guard let 구문을 사용해 값이 없으면(nil) else블록 실행

    • if let : 옵셔널 값을 안전하게 추출하고 해당 코드블록 안에서만 사용할 때 사용
    • guard let : 옵셔널 값이 반드시 존재해야하는 경우 사용. nil이면 함수를 조기 종료. (return, throw, break, continue 등). 이후 언래핑된 변수를 계속 사용 가능
func printName(_ name: String) {
    print(name)
}

var myName: String? = nil

if let name: String = myName { // nil이 아닐 경우
    printName(name)
} else { // nil일 경우
    print("myName == nil")
}
// 옵셔널 바인딩은 여러개도 가능. 모두 nil이 아닐 경우 동작
var myName: String? = nil
var yourName: String! = nil

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
  • 옵셔널 체이닝 : 옵셔널을 연속으로 사용하는 것(메소드에 옵셔널이 하나라도 껴있으면)
    ex) person.contact?.address
    person?.contact?.address 등

  • 강제 언래핑 "!" : nil이 아니라면 언래핑되지만 nil이면 런타임에러 발생
    nil이 아님을 확신할 때 사용하며 지양하는 것이 좋음

var optionalInt: Int? = 10
let intValue = optionalInt! // ! => 강제추출
print("\(intValue)")

var optionalInt: Int?
let intValue = optionalInt! // 강제추출 했지만 nil이기 때문에 에러 발생
  • 묵시적 언래핑 "!" : 옵셔널 타입 선언시 "?" 대신 "!"을 사용. 별도의 언래핑 없이 동작하며 강제 언래핑과 마찬가지로 런타임에러 주의

  • 기본값 제공 : 옵셔널 값이 nil일 경우 ?? 뒤의 기본값을 제공

let name: String? = nil
print(name ?? "default name")

* Java에서 NullPointerException 예외처리 과정을 생각하면 될 것 같다

0개의 댓글