Swift) Optional이란 무엇인지 설명하시오.
옵셔널(Optional)이란?
값이 있을수도 있고, 없을수도 있음
을 표현
1 | let optionalConstant : Int? = nil |
nil
이할당
될 수있는지 없는지
표현
1 | // someOptionalParam에는 nil이 할당 될 수 있다. |
옵셔널을 사용하는 이유
명시적 표현
- nil의 가능성을 코드만으로 표현 가능
- 문서/주석 작성 시간 절약
안전한 사용
- 전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않고 사용가능
- 예외 상황을 최소화하는 안전한 코딩
- 효율적인 코딩
옵셔널 문법과 선언
옵셔널 문법
enum + generics
옵셔널 선언
1 | enum Optional<Wrapped> : ExpressibleByNiliteral { |
💡 물음표는 띄어쓰지 않는다!
옵셔널 표현
!
(Implicitly Unwrapped Optional)
- 암시적 추출 옵셔널
기존 변수처럼 사용 가능
1 | var optionalValue : Int! = 100 |
?
(General Optional)
기존 변수처럼 사용 불가
- 옵셔널과 일반 값은 다른 타입이므로 연산불가
1 | var optionalValue : Int? = 100 |
옵셔널 추출
- 옵셔널에 들어있는 값을 사용하기 위해 꺼내오는 것이다.
옵셔널 바인딩
- nil 체크 + 안전한 추출
- 옵셔널 안에 값이 있는지 확인하고, 값이 있으면 값을 꺼내온다.
if-let
방식을 사용한다.
1 | func printName(_ name : String) { |
강제추출
- 옵셔널에 값이 들어있는지 아닌지 확인하지 않고,
강제로 값을 꺼내는 방식
이다. - 만약 값이 없을경우(nil) 런타임 오류가 발생하기 때문에 추천하지 않는다.
1 | func printName(_ name: String) { |
옵셔널 체이닝
옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때
유용하게 활용할 수 있다.- 매번 nil 확인을 하지 않고
최종적으로
원하는 값이 있는지 없는지확인
할 수 있다.
예제
1 | // 사람 클래스 |
만약 우리집 경비원 직업이 궁금하다면?
1 | // 옵셔널 체이닝을 사용하지 않는 경우 |
nil 병합 연산자
??
- 중위 연산자
- Optional ?? Value
- 옵셔널 값이
nil
일 경우,우측 값을 반환
한다. - 띄어쓰기에 주의
1 | var guardJob : String |
정리
- 옵셔널은
값이 있을수도, 없을수도 있음
을 표현한다. - 옵셔널이 아닌 상수에 nil값을 할당하려고 하면 컴파일 오류가 발생한다.
- 옵셔널은
열거형(enum)과 general의 합작품
이라고 볼 수 있다. !(Implicitly Unwrapped Optional)
은기존 변수처럼 사용이 가능
하다.?(General Optional)
은 옵셔널과 일반 값은 다른 타입이므로기존 변수처럼 사용이 불가
하다.옵셔널 바인딩
은 옵셔널 안에 값이 있는지 확인하고, 값이 있으면 값을 꺼내오며if-let 방식
을 사용한다.- 옵셔널 바인딩 시 선언한 상수는 if-let 구문 내에서만 사용할 수 있으며, 상수의 사용 범위를 벗어나면 컴파일 오류가 발생한다.
쉽표(,)
를 통해한번에 여러 옵셔널을 바인딩
할 수 있는데, 모든 옵셔널에 값이 있어야만 동작한다.- 강제추출은 옵셔널에 값이 들어있는지 아닌지 확인하지 않고,
강제로 값을 꺼내는
방식이다. - 강제추출은 옵셔널로 선언되어 있는 값을 강제로 추출한 후
옵셔널 타입이 아닌 다른 타입으로 값을 넘겨줄 수 있다.
- 옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하며, 최종적으로 원하는 값이 있는지 없는지를 확인한다.
- 옵셔널 체이닝 시, if-let 안에 들어있는 값들을 순서대로 확인하고 그 중 하나라도 값이 없다면, 멈춘 후 else문을 출력한다.
- nil 병합 연산자는
??
이렇게 표현하며,옵셔널 값이 nil 일 경우 우측 값을 반환한다.
참고
Swift) Optional이란 무엇인지 설명하시오.