본문 바로가기

Swift

Swift - 옵셔널(Optional)

안녕하세요 오늘은 옵셔널(Optional)에 대해 공부해보려고 합니다.

 

실제 앱을 만들 때 이 옵셔널 때문에

 

시간이 오래 걸렸던 기억이 납니다.

 

하지만 옵셔널을 제대로 관리하고 사용할 줄 알아야 한다고 생각이 듭니다.

 

그럼 바로 시작해 보도록 하겠습니다.

 

 

1. 옵셔널(Optional)

 

처음으로 옵셔널(Optinal)이란 무엇일까요?

 

옵셔널이란 "값이 있을 수도 없을 수도 있는 타입"입니다.

 

var name: String? = nil
var age: Int? = 20
var weight: Int?

 

 

 

타입 옆에 "?" 붙이고,

 

값으로 "nil" 값을 넣었습니다.

 

이처럼 옵셔널 타입을 사용하려면 타입에 "?"를 붙여주면 되고,

 

nil, 타입 값, 혹은 값을 설정 안 해주어도 됩니다.

 

옵셔널도 타입이기에

 

타입을 출력하면

 

var name: String? = nil
var age: Int? = 20
var weight: Int?

print(type(of: name))
//Optional(String)
print(type(of: age))
//Optional(Int)
print(type(of: weight))
//Optional(Int)

 

이런 식으로 옵셔널로 감싸져(Wrapping)되어 출력됩니다.

 

만약 이 옵셔널 타입을 출력하려고 한다면

 

var name: String? = nil
var age: Int? = 20
var weight: Int?

print(name)
//nil
print(age)
//Optional(20)
print(weight)
//nil

 

이런 식으로 출력됩니다.

 

이런 옵셔널 타입은 사용하려면 언랩핑(Unwrapping)을 해주어야 합니다.

 

값이 들어있을 수도, nil값일 수도 있기에

 

안전하게 확인 후 사용하기 위함입니다.

 

 

2. 강제 언랩핑(Forced Unwrapping)

 

언랩핑의 방식 중의 하나인

 

강제 언랩핑(Forced Unwrapping)입니다.

 

강제 언랩핑은 "!"를 붙여 사용합니다.

 

var name: String? = "윤수"

print("my name is \(name!)")
//"my name is 윤수"

 

이런 식으로 name 뒤에 "!"를 붙여 강제 언랩핑을 하였습니다.

 

하지만 이 방식은 말 그래도 "강제"로 언랩핑을 하는 방식으로

 

지금처럼 값이 아니라 nil 값이 들어있다면 오류가 발생합니다.

 

var name: String? = nil

print("my name is \(name!)")
//error!

 

그렇기에 이 방식은 권장되지 않습니다.

 

 

3. 옵셔널 바인딩(Optional Binding)

 

옵셔널 바인딩(Optional Binding)이란

 

옵셔널 내부의 값이 nil이 아니라면 옵셔널을 벗기는 것 입니다.

 

강제 언랩핑과 다르게 내부 값을 먼저 확인해 보고 

 

언랩핑을 하기에 더욱 안전합니다.

 

옵셔널 바인딩에는 2가지 방식이 있습니다.

 

if letguard let입니다.

 

두 방식 모두 새로운 값에 할당하여

 

nil 값인지 확인한 후 사용하도록합니다.

 

var name: String? = "윤수"

if let name = name {
	print(name)
    //"윤수"
}

 

if let 같은 경우 블럭 내에서만 변수를 사용할 수 있습니다.

 

만약 name 값이 nil 값이라면,

 

print(name)이 실행되지 않습니다.

 

var name: String? = "윤수"

guard let name = name else { return }
print(name)
//"윤수"

 

guard let은 nil 값이 아니라면 하위 구문을 실행합니다.

 

만약 nil 값이라면 종료를 해버립니다.(return)

 

guard let을 사용할 때는 종료 코드(return)를 꼭 사용해야합니다.

 

if let과 guard let 두 경우 모두

 

새로운 값을 할당하는데,

 

이를 바인딩(Bind) 한다고 하여 옵셔널 바인딩이라고 합니다.

 

이 때 if let의 경우 코드 블럭 내에서만 변수를 사용할 수 있어

 

간단한 코드에서는 사용이 용이하지만

 

guard let은 하위 구문에서 사용할 수 있기에 

 

guard let을 많이 사용합니다.

'Swift' 카테고리의 다른 글

Swift - 클래스(Class)  (0) 2026.04.15
Swift - 1급 객체(First-Class Object)  (0) 2026.04.03
Swift -Async Await  (0) 2026.03.26
Swift - Generic  (0) 2026.02.27
Swift - ARC(Automatic Reference Counting)  (0) 2026.02.26