본문 바로가기

iOS/iOS 기술 면접

Optional

Optional

옵셔널(Optional)은 언어적인 차원에서 안전성을 높이기 위해 사용하는 개념임

  • 간단하게 말하면 nil 타입을 사용할 수 있는 타입들을 Optional Type이라고 부름!

nil

  • 값이 없음을 의미하는 값

이거는 정수형의 0이나 문자열의 “”(빈문자열) 과는 다르게 진짜 값이 없음을 의미함

위 딕셔너리 처럼 값이 없을 때 오류를 처리하는 것이 아니라 nil을 내보냄으로써 안전성을 높힘

이러한 nil 값을 반환하기 위해서는 해당 타입이 옵셔널 타입이어야 함!

그럼 어떻게 옵셔널 타입을 선언할 수 있을깎???

  • 타입 앞에 ? 를 붙혀주면 끝임

var result: Int? = nil

위와 같이 하면 nil 값을 가질 수 있는 Optional Int가 되는거임

따라서 nil 또는 nil이 아닌 Int 값 을 가질수 있는 자료형이 된겁니다!

 

근데 여기서 보면 옵셔널은 그럼 Int, String, Struct 등등 타입에 다 붙힐 수 있짜나요

그 이유는 뭘까여

옵셔널 은 열거형이고, 제네릭으로 선언이 되어 있습니다!

제네릭이니까 다양한 타입을 받을 수 있어요~!!

 

그럼 출력을 해보면 어떤 값이 나올까요???

 

다음과 같이 Optional()로 감싸진 Int형이 출력이 됨

이 값을 Int형으로 사용하기 위해서는 옵셔널 언래핑(Optional Unwrapping)을 해줘야 함

지금까지 내용 정리

  • 옵셔널은 ? 키워드로 타입을 만들 수 있음
  • 이 타입들은 nil 또는 nil이 아닌 optional 값을 가질 수 있으며, 사용하기 위해선 언래핑이 필요

Optinal 값 없애는 법

강제 언래핑(Force Unwrapping)

  • 변수 뒤에 ! 를 붙혀주면 간단하게 됨.

하지만 강제적으로 하는 만큼 값이 무조건 있다는 확신이 있는 경우가 아니면 자제하는게 좋음

 

nil coalescing

닐 코얼레이싱? 닐 코얼레싱? 닐 코,,, 아무튼 이러한 방법도 있음

  • ?? 키워드를 이용해서 해당 변수가 nil 일 때 대입할 값을 지정해주는 방법

 

위에서 result 변수에 값을 넣어주지 않아 자동으로 nil이 할당되었고,

nil coalescing을 이용해 nil 값일 경우 10을 대입하기로 함.

Optional Binding

여기에 포함되는 방법은 2가지가 있습니다.

  • if let

 

if let을 이용하여 값이 있을 경우는 해당하는 값을, 없으면 else 문이 동작함!

그리구 다음과 같이 여러 옵셔널을 동시에 풀 수도 있음

 

 

  • guard let

guard let을 이용해 옵셔널 처리를 한 모습

해당 조건이 nil일 경우에만 else 문이 동작함.

옵셔널 체이닝(Optinal Chaining)

구조체나 클래스 등의 타입 내부의 프로퍼티나 메서드가 옵셔널 값을 가지고 있을 때 많이 사용하는 거!

.(dot)을 통해서 접근을 많이 하잖아여?

뭐 person.address 뭐 이런식으루? 이때 내부 값이 옵셔널 값이 있다면 옵셔널 체이닝으로 처리함!

옵셔널 체이닝에 관해서는

 

Swift) Optional 부수기 (6) - Optional Chaining (옵셔널 체이닝)

 

Swift) Optional 부수기 (6) - Optional Chaining (옵셔널 체이닝)

안녕하세요~~ 소들입니다 😎 휴~~ 오랜만에 다시 Swift 포스팅이네염~~~~ 이번엔 옵셔널 부수기의 마!지!막!편!인 바로 옵셔널 체이닝 이란 개념입니다 ;)))) 사실 마지막이 아닐 수도 있. ... 옵셔널

babbab2.tistory.com

여기 참고하시면 백점..

 

'iOS > iOS 기술 면접' 카테고리의 다른 글

KVO(Key-Value Observing)  (0) 2023.11.09
Struct는 뭐고 어떻게 사용할까?  (0) 2023.11.02
AnyObject  (0) 2023.11.02
Convenience init  (1) 2023.10.31
Copy On Write는 어떤 방식으로 동작할까?  (0) 2023.10.31