본문 바로가기
App 개발/Swift

옵셔널(Optional) 기초

by TomAdmin 2024. 6. 7.

Swift에서 옵셔널에 대해 알아보기 전에 nil라는 개념을 먼저 살펴봐야 한다. 

 

nil(nonexistent)

nil은 변수 값이 없는 상태를 의미하며 파이썬 사용자는 null 또는 nan이라고 생각하면 이해하기 쉬울 것이다.

 

그렇다면 옵셔널은 무엇인가? 

보통 변수에는 특정 타입의 내용이 저장되는데, 변수에 아무것도 할당이 안될 수 있는 상황(즉, 빈 값이 저장될 수 있는 경우)이 있다.

예를 들어 회원가입 페이지를 예로 들어보자.  필수적으로 입력할 사항(이름, 전화번호, 아이디, 비밀번호) 외에 입력해도 되고 안해도 되는 선택사항의 변수(이메일 주소, 닉네임 등)를 본적이 있을 것이다.

사용자가 회원가입을 완료했을 때, email 변수에 실제로 이메일을 입력받아 저장될 수도 또는 비어있게 될 수도 있는데 이런 불확실한 상황을 표현하기 위해 스위프트에서는 Optional(?)이라는 개념을 사용한다.

 

옵셔널 정식 표현

var 변수명: Optional<String>

var 변수명: String?

=> 변수명에 String값이 저장되거나 비어(nil)있을 수 있다

 

또한, 비어있는 변수를 생성하고 싶을 때

var 변수명: String = nil     (X)  # 에러 발생!
var 변수명: String? = nil   (O)
var 변수명: String?           (O)  # 자동으로 nil 설정

 

 

옵셔널 타입의 변수는 서로 연산이 불가능하다.

var num1: Int? = 1
var num1: Int? = 2
num1 + num2   (X)   # 에러 발생!

 

이러한 문제를 해결하기 위해 옵셔널을 안전하게 벗겨내는(?) 작업이 필요하다. 

 

옵셔널 언래핑 방법은 다음과 같다. 

  • 강제 언래핑(Force Unwrapping)은 !를 써서 강제로 옵셔널을 추출하는 방법이다. 하지만, 강제 언래핑의 경우 잘못 사용할 경우 프로그램이 강제로 종료될 수 있는 부작용이 있어 최대한 안쓸려고 하는게 맞는 것 같다(임시방편 용으로 사용할 것)
let number = Int("42")!
// 강제 언래핑이 안될 때
let address: String? = nil   # 에러 발생 -> nil값은 강제로 언래핑할 수 없다.
  • 옵셔널 바인딩(Optional Binding)은 옵셔널 값이 빈값인지 존재하는지 검사한 후, 만약 존재하는 경우 수동적으로 그 값을 다른 변수에 대입시켜 바인딩하는 것을 의미한다. 
  • 옵셔널 바인딩 방법은 크게 2가지가 있다. 

if let : if문의 코드 구현부 내에서만 상수 사용이 가능하다.(지역 변수)

let boyName: String?
let girlName: String?

boyName = "예찬" 
girlName = "나연"
if let boy = boyName, let girl = girlName {
   print(boy, girl)}        //  출력값 : 예찬 나연     

 

 

guard let : guard문을 통과한 상수를 guard문 밖에서 사용이 가능하다.(전역 변수)

var name3: String? = "joo"
func example() {
   guard let name = name3 else {
       print("이름을 입력해주세요")
       return }