옵셔널(Optional)
💡 옵셔널(Optional)
- 값이 존재할 수도 있고 존재하지 않을 수도 있는 상황을 다루는 데 사용
- 주로 닐(nil)이나 빈 값 등을 처리하는 데 유용
- 초깃값을 지정하지 않으면 기본값은 닐(nil)
- 일종의 컨테이너 혹은 래퍼(wrapper)로 값이 존재하는 경우에는 해당 값을 감싸고,
값이 없는 경우에는 닐(nil)을 나타내는 특별한 상태를 가짐
→ 이를 통해 값이 없을 때 발생할 수 있는 예외를 방지하고, 코드를 안전하게 작성할 수 있음
모든 변수에 nil을 넣을 수 있는 것은 아님
- name이라는 변수에 nil을 넣으려 하면 에러가 발생
var name: String = "전수열"
name = nil // 컴파일 에러!
// error: Nil cannot be assigned to type 'String'
해결
- 일반적으로 변수에 값을 할당할 때 해당 변수의 타입과 일치하는 값이어야 함
- 문자열 변수에 nil을 할당하는 것은 허용되지 않음
→ 옵셔널(Optional)을 명시적으로 사용하여 값이 없음을 나타내야 하기 때문
→ 만약 문자열 변수에 값이 없을 수 있는 상황이라면, 해당 변수를 옵셔널로 선언하여 이를 나타내야 함
var name: String? = "전수열" // ?은 문자열이거나 nil일 수 있는 옵셔널 타입을 의미
name = nil // 올바른 코드!
옵셔널 바인딩
- 옵셔널 값이 빈값인지 존재하는지 검사 후, 존재하는 경우 그 값을 다른 변수에 바인딩하는 것을 의미
- 빈 값을 체크하고 옵셔널 값을 언래핑 해주는 것은 강제로 언래핑하는 것보다 훨씬 안전
- if let / if var, guard let / guard var을 써서 옵셔널값을 추출, 새로운 변수에 바인딩
if let / guard let 차이점
- if let : if문의 코드 구현부 내에서만 상수 사용 가능(지역 변수)
- guard let : guard문을 통과한 상수를 guard문 밖에서 사용 가능(전역변수)
if let <#상수 이름#> = <#옵셔널 값#> {
// 구현 코드
}
let roommateNumbers: Int? = nil
if let roommates = roommateNumbers {
print (roommates)
}
// 출력값 없음
let ticketCounts: Int? = 3
if let ticket = ticketCounts {
print (ticket)
}
// 출력값: 3
// 옵셔널 바인딩 할 변수가 여러 개인 경우
let boyName : String?
let girlName : String?
boyName = "하늘"
girlName = "나연"
// , 콤마로 나열합니다
if let boy = boyName,
let girl = girlName {
print(boy, girl)
}
// 출력값: 하늘 나연
let x : Int? = 10
let y : Int? = nil
func opbinding() {
guard let x = x else { return }
print(x)
guard let y = y else { return } // y는 nil 이므로 여기서 return
print(y) // 위에서 return 하였기 때문에 이 코드 라인은 실행되지 않음
}
opbinding()
// 출력값: 10
옵셔널 강제 언래핑(unwrapping)
- 강제 언래핑을 잘못 사용할 경우 프로그램이 비정상적으로 종료될 수도 있으므로 반드시 nil이 아닌 것이 확실한 상황에서 사용
(최대한 안쓰는게 좋다)
- 강제 언래핑(Force unwrapping)은 !를 써서 강제로 옵셔널 추출
(변수 앞에 !를 붙이는 것은 not의 의미 - 헷갈리지 말것)
let number = Int("42")!
// String값을 Int로 변환하는 함수는 return값으로 옵셔널 값을 반환합니다.
print(number)
// 출력값: 42
// 강제 언래핑이 실패한 경우
let address: String? = nil
print(address!)
// 에러🚨 메시지: Unexpectedly found nil while unwrapping an Optional value
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - Collection Type(Array, Set, Dictionary) (0) | 2024.03.08 |
---|---|
Swift 기초 문법 - Stack(스택) & Queue(큐) (0) | 2024.03.08 |
Swift 기초 문법 - 반복문 (0) | 2024.03.07 |
Swift 기초 문법 - 데이터 타입 (0) | 2024.03.07 |
Swift 기초 문법 - replacingOccurrences(of: with: ) (0) | 2024.03.07 |