본문 바로가기
⌨️ Language/swift

[Swift] 옵셔널 (Optional)

by hyebin (Helia) 2023. 2. 6.

옵셔널(Optional)

  • 값이 있을 수도 있고 없을 수도 있는 변수
  • 값이 없는 경우를 나타낼 때에는 nil을 사용
  • 변수 정의할 때 타입 어노테이션에 물음표(?)를 붙여 정의
  • Optional(value) 형태로 출력
  • 옵셔널에 초깃값을 지정하지 않으면 기본값은 nil
var name: String?
print(name) //nil

name = "hyebin"
print(name) //Optional("hyebin")
  • 옵셔널로 정의한 변수는 옵셔널이 아닌 변수와는 다름
var optional_name: String? = "hyebin"
let name: String = optional_name

 

Value of optional type 'String?' must be unwrapped to a value of type 'String'

name 변수는 옵셔널이 아닌 String이기 때문에 항상 값이 있어야 함

optional_name은 옵셔널로 선언된 변수이기 때문에, 코드가 실행되기 전까지는 값의 유무를 알 수 없음

Swift 컴파일러는 안전을 위해 옵셔널이 아닌 변수에 옵셔널로 선언된 변수를 대입할 수 없게 만듦

 

옵셔널 바인딩 (Optional Binding)

  • 옵셔널의 값을 가져오기 위해 옵셔널을 벗겨내는 행위
  • 옵셔널의 값이 존재하는지를 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입
  • if let 또는 if var 사용
  • 옵셔널의 값을 벗겨서 값이 있다면 if문 안으로 들어가고, nil이라면 그냥 통과
if let name = optional_name{
    print(name)  //optional_name의 값이 존재한다면 해당 값 출력
}
//optional_name의 값이 존재하지 않는다면 if문 지나침
  • 하나의 if문에서 여러 옵셔널 바인딩 가능
if let name = optional_name, let email = optional_email{
    print(name, email)
}

 

옵셔널 체이닝 (Optional Chaining)

  • 연속적인 옵셔널들을 연쇄적으로 확인
  • 옵셔널의 속성에 접근할 때, 옵셔널 바인딩 과정을 물음표(?) 키워드로 줄여주는 역할
//옵셔널 바인딩
let array: [String]? = []
var isEmptyArray = false

if let array = array, array.isEmpty {
  isEmptyArray = true
} else {
  isEmptyArray = false
}

//옵셔널 체이닝
let isEmptyArray = array?.isEmpty == true

 

강제 언래핑 (Force Unwrapping)

  • 옵셔널에 값이 있다고 가정하고 값에 바로 접근
  • 옵셔널 타입의 변수 이름 뒤에 느낌표(!)를 붙여 사용
  • 만약 옵셔널 값이 nil인 경우 런타임에러 발생
print(optional_name!)
fatal error: unexpectedly found nil while unwrapping an Optional value

 

nil 병합 연산자 (nil coalescing operator)

  • "??"를 사용하여 한 줄로 언래핑 수행
  • 언래핑하고자 하는 옵셔널 변수 ?? nil일 때 대신할 값
let name = optional_name ?? "abc"

print(name)

optional_name에 값이 있다면 optional_name의 값이 출력되고, 없다면 abc가 출력

 

암사적으로 벗겨진 옵셔널 (Implicitly Unwrapped Optional)

  • 옵셔널이지만 언래핑하지 않고도 사용할 수 있는 옵셔널
  • 옵셔널을 정의할 때, 물음표(?) 대신 느낌표(!)를 사용
  • nil을 포함할 수 있는 옵셔널
  • 접근할 때 옵셔널 바인딩이나 옵셔널을 벗기는 과정을 거치지 않고도 바로 값에 접근할 수 있다는 점에서 일반적인 옵셔널과 다름
  • 값이 없는데 접근을 시도하는 경우 런타임 에러 발생

 

반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 타입 캐스팅  (0) 2023.02.06
[Swift] 클래스(Class)와 구조체(Struct)  (0) 2023.02.06
[Swift] 열거형 (Enumerations)  (0) 2022.02.08
[Swift] 함수(Functions)  (0) 2021.12.02
[Swift] 제어문(Control Flow)  (0) 2021.11.26

댓글