컴퓨터 공학 분야 별 지식/ios

[swift, ios] 옵셔널(Optional) 개념 정리

N돌핀 2022. 5. 5. 01:29

Swift Optional 개념 정리

옵셔널(Optional) 개념

  • 뜻 그대로 값이 있을 수도 없을 수도 있는 것, 그런 변수를 정의하는 것
  • “”는 빈 값, nil이 값이 없는 것을 말함
  • 이런 nil 값을 넣을 수 있는 게 옵셔널이라고 부름
  • 옵셔널로 선언시 기본값은 nil이다
  • 타입 어노테이션에 ‘?’ 키워드를 붙여서 정의
  • optional과 아닌 변수는 서로 구분된다(구분 x시 컴파일 에러가 뜸)
var student: String?
//nil
student = "John"
//John

옵셔널 바인딩(binding)

  • 옵셔널 값이 존재하는 지 검사한 뒤 존재한다면 값을 가져오는 방법
  • if let 혹은 if var 를 사용하여 값이 있다면 if문 안으로 들어가고 없으면 통과
if let stu = student {
	//옵셔널인 student의 값이 존재한다면 실행
}
  • 하나의 if 문에서 여러개 옵셔널 바인딩이 가능 (모든 값이 존재해야 if문 진입)
  • 바인딩 시 ‘,’를 이용해서 다른 조건도 함께 지정 가능하며 옵셔널 바인딩이 일어난 후에 조건절 실행
if let stu = student, stu == "John" {
	//옵셔널 변수 student가 존재한다면 stu에 저장되고 John이라면 if문 안 실행
}

옵셔널 체이닝(chaining)

  • 빈 값 검사 시 바인딩 과정을 ? 키워드로 줄여주는 것
  • 위 바인딩에서 student가 빈 값인지 검사할 때 예시
var isStudentEmpty = false
if let stu = student, stu.isEmpty {
	//stu가 빈 값이면 여기 실행
	isStudentEmpty = true
} else {
	isStudentEmpty = false
}
// 옵셔널 체이닝 이용하면 아래와 같음
let isStudentEmpty = student?.isEmpty == true

3가지 경우의 수

student?.isEmpty
  1. student가 nil인 경우: nil 반환
  2. student가 비었을 경우: true 반환
  3. student에 요소가 있는 경우: false 반환

isEmpty의 반환값은 Bool 이므로 ?를 이용해서 Bool?을 반환하도록 바뀜.

따라서 값이 실제로 true인지 확인하려면 ==true 를 해야 함.

옵셔널 벗기기

옵셔널을 사용할 때마다 옵셔널 바인딩을 하는 것이 가장 바람직하지만, 값이 존재할 것임에도 옵셔널로 사용하는 경우가 있음

  • 값이 있다고 가정하고 값에 바로 접근할 수 있도록 도와주는 키워드! 를 사용
  • 옵셔널 값이 nil일 경우 런타임 에러가 발생
print(student)  // Optional("John")
print(student!) // John

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

  • 옵셔널 정의 시 ? 대신! 를 붙이면 암묵적으로 벗겨진 옵셔널이 됨
  • nil을 포함할 수 있는 옵셔널이지만 접근 시 바로 접근 가능(바인딩 x, 벗기기x)
  • 옵셔널 값이 nil일 경우 런타임 에러가 발생
  • 가급적이면 일반적인 옵셔널을 사용해서 정의
var email: String! = "pcy@gmail.com"
print(email) // pcy@gmail.com