- 이 글은 Swift 개발을 시작한지 얼마 안된 초보 개발자 입장에서, Swift개발을 시작한지 얼마 안된 초보 개발자분들이 이해하시기에 적합하도록 최대한 쉽게 풀어 이야기하였습니다.
- 저 또한 해당 개념을 완벽하게 이해하지는 않았기에, 언제든 해당 글은 수정 될 수 있으며, 잘못된 부분에 대한 지적은 대환영입니다!
1. Optional 개념 이해
옵셔널은 기존 C기반 언어에서는 없는, Swift에 등장하는 개념입니다. 개념을 간략히 설명하면, 기존의 자료형에다가 "값이 없는 경우" 를 커버하기 위한 자료형이라고 생각하시면 됩니다. 단순히 기존의 Swift에서 사용하던 자료형에, 선언 시에 뒤에 ?를 붙이면 해당 자료형은 옵셔널 타입으로 지정이됩니다.(ex1)
(ex1)
let a: Int?
let b: String? = "abc"
let c : Int? = nil
-> 위처럼 옵셔널로 선언된 자료형은, nil이라는 새로운 값으로 할당 할 수 있게 됩니다.
그렇다면 nil이 무엇이냐? 이는 간단하게 말하면 "값이 없다" 라는 의미로 이해하시면 쉽습니다.
우리가 만든 앱은 다양한 네트워크 통신 중에, 특정 상수에 통신된 결과값을 저장하게 됩니다. 이러한 과정 중, 네트워크에 접속이 끊겨서 값이 내려오지 않는다면 어떻게 될까요? 해당 상수를 선언만하고 초기화하지 않았다면, 이를 사용할 때 앱은 크래쉬가 발생할 것이입니다. 초기화를 하였더라도(예를들어, 0으로 초기화를 하였다면), 실제로 이 값이 통신으로 내려온 값인지, 내려오지 않아서 0이 셋팅된 것인지 판단하기 어렵겠지요. 결국, 앱단에서 적절한 처리를 하기 어려운 상황일 것입니다.
위에 설명한 예시가, 옵셔널타입을 사용하는, 그리고 nil을 사용하는 가장 중요한 이유입니다!
-> '값이 없는 경우' 에 대한, 적절한 판단 기준이 필요하다.
이렇게 옵셔널 타입으로 선언한 자료형은, 옵셔널이 아닌 자료형과 다른 특별한 규칙을 갖습니다. 옵셔널 타입의 자료형은, 특별한 무언가로 감싼 값을 저장하게 됩니다.(ex2)
(ex2)
-> 옵셔널이 아닌 Int자료형의 상수 a에 저장된 값을 출력해보면, "123"이 출력됩니다. 하지만 옵셔널 타입의 Int 자료형에는 같은 "123"을 저장하였지만, Optional(123)이 출력됩니다. 뿐만아니라 옵셔널타입의 c에는 nil을 저장하였습니다. 반면, 화면에는 표시되지 않았지만, 옵셔널이 아닌 타입에 nil을 저장하면 컴파일 에러가 발생하게 됩니다.
cf) 노란색 경고창은 Nil-Coalescing Operator 개념을 배우면 쉽게 해결하실 수 있습니다. 지금은 신경 안쓰셔도 됩니다!
이처럼, Optional타입의 상수는 nil이라는 값 또는, Optiona("data"). 두 가지 중 하나의 값을 갖고 있습니다. 정확히 말하면 .none, .some(Wrapped) 두 가지중 하나를 갖는데요(ex3)
(ex3)
Optional의 정의부를 보시면(Xcode에서 Optional을 타이핑하고, control + command를 누르면서 클릭하면) , Optional은 none과 some(Wrapped) 두 가지로 이루어진 열거형 형식인걸 확인하실 수 있습니다. 우리가 위에 설명한 방식들은 축약형이구요. 실제로 개발하는 데에는, nil과 Optional()로 감싼 데이터를 갖는다고만 이해하시면 됩니다.
이렇게 Optional 타입은, 위 두 가지중 하나의 방식으로 값을 갖고 코드내에서 사용됩니다. 그렇다면 실제로 Optional()로 감싸져있는 내부에있는 실제 데이터를 프린트로 출력하거나, 아니면 화면의 Label에 보여주기 위해서는 어떻게 해야할까요?
실제 데이터를 사용하기 전에는 Optional type에 대한 Unwrapping 과정이 필요하게 됩니다. Unwrapping에는 여러가지 방법이 있는데요. 이 방법에 따라, nil에 대한 처리 방식이나 실제 사용 방식들이 달라지게 됩니다.
정리하자면 우리 초보개발자들은, 크래쉬 없는 아름다운 앱을 개발하기 위하여 아래 2가지만 기억해주시면 되겠습니다.
1. nil의 가능성이 있는 값의 타입에는 옵셔널로 선언을 해준다.
2. 옵셔널 타입의 실제 값을 사용할 때에는, 적절한 Unwrapping을 해준다.
Unwrapping에 관한 내용은 이 다음에 포스팅 하도록 하겠습니다.
감사합니다.
'iOS 개발 > Swift' 카테고리의 다른 글
Swift Closure(클로져)에 대한 이해 (0) | 2020.08.31 |
---|---|
03. Swift Optional (스위프트 옵셔널) - Optional Bindng(옵셔널 바인딩) (0) | 2020.08.23 |
02. Swift Optional (스위프트 옵셔널) - Unwrapping(강제추출) (1) | 2020.08.23 |