Optional은 값을 담고 있거나 nil(값 없음)을 담고 있는 타입입니다. Swift는 nil을 타입 시스템에서 명시적으로 표현합니다. String은 절대 nil이 될 수 없지만 String?은 될 수 있습니다. 이것이 Swift가 대부분의 널 포인터 크래시를 컴파일 시점에 제거하는 방식입니다.
Optional은 값을 담고 있거나 nil(값 없음)을 담고 있는 타입입니다. Swift는 nil을 타입 시스템에서 명시적으로 표현합니다. String은 절대 nil이 될 수 없지만 String?은 될 수 있습니다. 이것이 Swift가 대부분의 널 포인터 크래시를 컴파일 시점에 제거하는 방식입니다.
내부적으로 Int?는 두 가지 케이스를 가진 enum입니다: .some(value) 또는 .none. 래핑된 값을 직접 사용할 수 없으며, 먼저 언래핑해야 합니다.
var name: String? = "Ada" // Optional String, 현재 .some("Ada")
var missing: String? = nil // .none
// if let: nil이 아닐 때만 바인딩, 블록 범위로 한정
if let name = name {
print(name.count) // 안전: 여기서 name은 일반 String
}
// guard let: 언래핑하거나 조기 종료 — happy path를 중첩 없이 유지
func greet(_ input: String?) {
guard let input else { return } // Swift 5.7 축약 문법
print("Hi \(input)") // 아래에서 input은 non-optional
}
// nil 병합: 기본값 제공
let display = name ?? "Anonymous"
! 연산자는 강제 언래핑을 수행합니다. name!은 name이 nil이면 크래시가 납니다. 프로그램 로직상 값이 보장될 때만 사용하고, 그렇지 않으면 if let, guard let, ??를 선호하세요.
let url = URL(string: "https://a.com")! // OK: 리터럴은 항상 유효
let user = fetchUser()! // 나쁨: nil이면 크래시
String!)은 nil 상태에서 접근하면 조용히 크래시가 납니다. @IBOutlet에서 흔합니다.user?.address?.city는 크래시 대신 nil로 단락 평가됩니다.Optional은 "이 값은 없을 수도 있다"를 타입에 인코딩하므로, 컴파일러가 빈 경우를 강제로 처리하게 만듭니다. 면접관은 지원자가 여기저기 !를 뿌리는 대신 guard let과 ??를 사용하는지를 보는데, 이것이 크래시가 잦은 앱과 안전한 앱의 차이입니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기