본문 바로가기

iOS/Swift

Swift) Optional은 어떻게 구현되어 있을까? (+ Optional Pattern)

 

 

안녕하세요 :) 소들입니당

실로... 오랜만에 글을 쓰네요... 한 1~2주간 바빴어서 하하..

음....... 스스로의 무지를 깨닫는 시간이었다고나 할까요??ㅎ;;

(꽤 오랫동안 블로그를 방치했는데 그 사이 방문자수는 더 늘었군요.. :D)

 

뭐쨌든 그래서 오늘은 기본이지만 나만..(혹은 그 누군가는) 잘 몰랐..던..

Optional이 실제로 Swift에서 어떻게 구현되어 있는지

또, 이를 이해하고 Optional Pattern이란 것에 대해 공부해보려고 해요!!

 

뭐 그동안 옵셔널 어케 생겨먹었는지 모르고 썼잖아여?

이번에 알아보자구요!!!

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. Optional은 어떻게 구현되어 있을까?

 

음.. 보통 쓰임새나 정의가 궁금한 함수나 자료형이 생기면

 

 

 

 

이렇게 클릭하고 Jump to Definition을 누르면 해당 정의로 이동하잖음!?!?

근데 우리가 쓰는 옵셔널은 ?를 아무리 눌러도 이동하지가 않음 ㅠ..ㅠ

 

사실 Optional에서 우리가 ?를 이용해서 선언하는 것은 축약형이고,

실제로 Optional의 정식 문법은 다음과 같이 선언 함!!

 

 

let nameOptional<String> nil

 

 

요롷게 👀

따라서 이제 Optional이란 타입의 정의로 이동을 해보면

 

 

@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)

    ... 
}
 

 

 

이렇게 선언되어 있음 ㅎㅎ

오홍!! Swift에서 Optional은 enum(열거형)으로 구현이 되어 있구나!!

그리고 또한 제네릭으로 선언되어 있어서, 어떤 타입이든 받을 수 있음 ㅎㅎ

 

none : 값이 없음

some(Wrapped) : 값이 있음

 

을 나타내는 상태임!! 흐헿 따라서 우리가 

 

 

if name == nil { }

 

 

이렇게 nil을 통해 값을 확인할 수 있는 것도,

사실 enum이기 때문에 다음과 같이

 

 

if name == .none { }              // name에 값이 없는 경우(nil)
if name == .some("Sodeul") { }    // name의 값이 "Sodeul"인 경우

 

 

이렇게도 사용할 수 있는 것임!!

왜냐?? 열거형이니까 정의된 case의 연관값으로도 비교가 가능함!! :)

 

자, 이제 Swift에서 Optional이 어떻게 정의 되어 있고, 

또 기존에 접근하던 방식과 달리 접근하는 방법에 대해서도 알았움!!

이제 Optional Pattern이란 것에 대해서도 알아보잣

 

 

 

 

2. Optional Pattern

 

Optional Pattern은 식별자 바로 뒤에 물음표(?)로 구성되며,

열거형 패턴과 동일한 위치에 나타낸다

 

킁.. 뭐라눈겨

Optional이 열거형이니까 열거형 패턴과 동일한 위치에 나타나는 건 맞겠지만...

먼저 Optional의 타입인 열거형의 Enumeration Case Pattern은 다음과 같이 쓸 수 있음

 

 

if case .some(let n) = name {
    print(n)
}
 

 

 

 

이건 어느 열거형에서도 가능한 것이고,

우리가 사용하는 Optional이란 자료형 또한 열거형이기에 가능한 것임!

 

근데 Optional Pattern은 무엇이나면,

위처럼 쓰는 것이 아니라

 

 

if case let n? = name { print(n) }

 

 

이렇게 식별자 n 뒤에 ?를 붙여서 나타내는 것을 말함!!

이럴 경우, name의 값이 nil이 아닐 때만 해당 if문을 실행함!!

당연히 이때 n은 Non-Optional Type!! 따라서

 

 

 

 

name은 Optional Type이지만 n은 옵셔널 바인딩 된 값과 똑같이 나옴

그럼 이렇게만 보면 Optional Binding과 똑같은데,,, 왜 Optional Pattern이 있는 걸까?

 

 

 

2-1. Optional Pattern을 사용할 경우 좋은 점

 

자, 만약 다음과 같이

 

 

let arrayOfOptionalInts: [Int?] = [nil23nil5]

 

 

Optional Type의 array가 있음

이때 for-in문을 돌면서 nil이 아닌 값을 출력하고 싶을 때

Optional Binding을 이용한 방법과 Optional Pattern을 이용한 방법의 차이점을 보겠움

 

 

 

 Optional Binding을 이용한 순회 

 

 

var count0
for number in arrayOfOptionalInts {
    count += 1
    guard let number = number else { continue }
    print(number)
}
 
print("반복문 실행 횟수 : \(count)")

 

 

흔히 우리가 짜는 코드임!!!

실제로 실행해서 출력을 해보면

 

 

 

 

Optional Binding된 값이 출력되고, 총 반복문의 실행 횟수는 5번임

자, 이것을 Optional Pattern을 이용해서 해보잣!!

 

 

 

 Optional Pattern을 이용한 순회 

 

 

var count0
for case let number? in arrayOfOptionalInts {
    count += 1
    print(number)
}
 
print("반복문 실행 횟수 : \(count)")

 

 

자, 이렇게 Optional Patter을 이용해서 코드를 실행 해보면,

 

 

 

 

결과값은 Optional Binding 값과 똑같지만, 총 반복문의 실행 횟수는 3번임

 

왜냐면 Optional Pattern에선, 해당 값을 꺼냈는데

만약 값이 nil이면 반복문을 실행하지 않고 바로 다음 값을 꺼내오기 때문임!!

 

따라서, 이런 경우엔 Optional Binding 보다 Optional Pattern을 이용하면,

반복문의 실행 횟수도 줄이고, guard문도 없어서 훨씬 깔끔해짐 :)

이제 Optional Pattern이 왜 있는지 이해가 됐기를!!! 

 

 

 

 

 

 

 

.

.

.

for case, if case는 잘 쓴 적이 없어서 꽤나 신기했네용 :)

피드백이나 궁금증은 언제든 댓글로 남겨주세요!!!

언제나 나에게 화이팅~



Calendar
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
최근 댓글
Visits
Today
Yesterday