-
안녕하세요. 그린입니다!
이번 포스팅에서는 스위프트의 특징 중 하나인 안정성을 문법으로 담보하는 기능인 옵셔널에 대해 알아보겠습니다.
기존 C언어나 Objective-C에서는 없었던 콘셉트로 스위프트에서 배워보실 수 있습니다~!
옵셔널 : '선택적인' , '값이 있을수도, 없을수도'를 나타내며 변수나 상수에 꼭 값이 있다고 보장할 수 없음을 의미합니다.
즉 값이 nil(NULL)일 수도 있는걸 의미합니다.
1. 옵셔널 사용
옵셔널 변수 또는 상수가 아니면 nil을 할당할 수 없습니다. 값이 없는 옵셔널 변수 또는 상수에 강제로 접근하려면 런타임 오류가 발생됨.
nil은 옵셔널로 선언된 곳에서만 사용할 수 있습니다.
-. 선언방법 : 데이터 타입 뒤 물음표(?) 표시
-. 옵셔널 사용 상황 : 매개변수에 값이 없어도 된다는걸 주고 싶을때 암묵적인 커뮤니케이션을 완성 시킬 수 있습니다.
(런타임 오류가 나지않고 nil을 반환하여 표현하고 싶을때 사용합니다.)
-. 옵셔널 자체가 열거형 -> switch 구문을 통해 값이 있고 없음을 확인 할 수 있습니다.
-. where절과 병합하여 사용되기도 합니다.
-. switch를 통해 구분할때 case에서 .some과 .none으로 꼭 모든 조건을 주어야 합니다.
2. 옵셔널 추출(Optional Unwrapping)
옵셔널의 값을 옵셔널이 아닌 값으로 추출하는 옵셔널 추출(Optional Unwrapping)에 대해 살펴보겠습니다.
2-1) 강제 추출(Forced Unwrapping)
옵셔널 강제추출은 옵셔널의 값을 추출하는 가장 간단하지만 가장 위험한 방법입니다.
런타임 오류가 일어날 가능성이 가장 높습니다.
-. 강제 추출 방법 : 옵셔널 값의 뒤에 느낌표(!)
강제 추출 시 옵셔널에 값이 없다면 (nil) 런타임 오류가 발생합니다.
if 구문 등 조건문을 이용해 안전하게 처리해야 합니다. 또한 사용을 지양합니다.
2-2) 옵셔널 바인딩(Optional Binding)
옵셔널 바인딩은 옵셔널에 값이 있는지 확인할 때 사용합니다. 옵셔널에 값이 있다면 옵셔널에서 추출한 값을 일정 블록 안에서 사용하게
상수나 변수로 할당해서 옵셔널이 아닌 형태로 사용할 수 있도록 합니다. 옵셔널 바인딩은 if 또는 while 구문 등과 결합하여 사용합니다.
-. 옵셔널 바인딩을 통해 임시 상수와 임시 변수를 사용함으로 if 블록 밖에서는 사용할 수 없고 else 블록에서도 사용할 수 없습니다.
그리하여, let 상수가 있음에도 var 변수를 동일한 이름으로 사용할 수 있습니다.
-. 옵셔널 바인딩을 통해 한 번에 여러 옵셔널 값을 추출할 수도 있습니다. (쉼표(,)를 사용하여 나열)
if let name = myName, let you = yourName {}
2-3) 암시적 추출 옵셔널(Implicity Unwrapped Optionals)
옵셔널 바인딩으로 매번 값을 추출하기 힘들거나 로직상 nil때문에 런타임 오류가 발생하지 않을 것 같은 확신이 들때 nil을 할당해줄 수 있는 옵셔널이 아닌 변수/상수를 위해 사용하는것이 암시적 추출 옵셔널입니다.
-. 사용방법 : 타입 뒤에 느낌표(!)
일반 값 처럼 사용되며 nil도 할당할 수 있습니다. 그러나 nil이 할당된 경우 접근 시도 시 런타임 오류 발생합니다.
[추가사항]
-. 암시적 추출 옵셔널은 object-c에서 넘어올때 호환하여 맞추려 임의적으로 만든 기능..
-. 옵셔널 값 끼리도 연산이 되지 않는다.
-. 강제추출 보다는 오류를 확인하고 싶을때는 assert() 함수를 활용하는것이 좋다.
이렇게 이번 포스팅에서는 nil값이 들어올 경우를 대비하여 옵셔널에 대해 알아봤습니다.
옵셔널의 쓰임은 swift에서 아주 무궁무진합니다. 다만 헷갈리는 부분이 많아 옵셔널 처리를 아주 잘 선언해주고 신중하게 써야
런타임 오류 등 꼬이지 않게 됩니다. 지금까지의 포스팅에서는 스위프트의 기초에 대해 알아보았습니다.
이제는 이 기초를 토대로 스위프트의 객체지향성에 대해 알아보도록 하겠습니다.
그 첫걸음으로 다음 포스팅에서는 구조체와 클래스에 대해 알아보도록 하죠!
점점 심화되어가는 학습에 대해 모두 힘내며 전진하길 바랍니다^^
감사합니다 :D
p.s 참고자료
https://zeddios.tistory.com/16