Optional – ?와 !를 이해 하자.

Objective-C와 Swift의 차이 중 하나는 다이나믹 형변환이 없어지며 자료형이 매우 빡빡해 졌다는 것이다.

빡빡한 자료형에, 개발자들이 품자 마자 풀려 버렸던 의문과 답은 바로

“그럼 null(nil)은 어떻게 넣는데?” 와
“?(Optional)를 써.” 였다.

그렇다고 단순히 Optional을 ‘nil을 넣을 수 있게 자료형을 선언 하는 녀석’으로 이해하면 곤란한데.
보통 이렇게 이해한 개발자들이 !를 남용하기 때문이다.

!를 남용하게 되는 가장 큰 이유는 ?로 선언된 객체는 사용 전에 항상 확인을 해주어야 한다.
이게 귀찮기 때문에 !를 사용하게 되는데.

왜 컴파일러가 Syntax Check를 할때 ?는 사용 전 확인을 강요하고, !는 그냥 넘기는 지 이해 한다면
자연히 ?와 !의 진짜 차이점을 이해할 수 있다.

 

간단하다.

?는 nil 일 수도 있는 녀석.
!는 nil 일 가능성이 없는 녀석.

Swift로 작성된 iOS 개발 예제를 보면 @IBOutlet은 항상 !으로 선언한다.

@IBOutlet var shareButton: UIButton!

뷰콘트롤러가 선언될 당시엔 해당 변수엔 nil이 담기겠지만 Storyboard에 작성된 View가 로드 되면서 해당 변수엔 뷰객체가 담기게 된다. 그래서 해당 변수는 Optional로 선언되어야 하기에 !가 사용되었다.

그러나 ?가 아니다. !는 남용하지 말라고 했는데 그럼 대부분의 개발자가 사용하고 공식 예제에도 사용하는 위의 경우는 남용인가?

아니다.

정상적으로 개발했다면 해당 변수엔 정상적으로 UIButton 객체가 담겨야 한다. nil 일 가능성이 없는 녀석이기 때문에 !를 사용하는 것이 맞다.

Storyboard에서 제대로 작업하지 않아 shareButton과 UIButton을 제대로 연결 시키지 않았다면 앱은 fatal error를 내뱉고 튕겨 버릴 것이다.

이건 수정해야 할 버그지 ?나 !를 따질 문제가 아니다.

그렇다. 사실 ?와 !를 적절히 구분해서 사용해야 되는 이유는 바로 fatal error때문이다.
?를 사용하여 선언한 변수에 대해 컴파일러가 매번 사용 전 확인을 하라고 강제 하는 것은 fatal error를 막기 위해서이다.

그래서 ?는 서버와의 통신이나 사용자 데이타 등 nil 일 가능성이 충분히 있는 변수에 사용하는 것이다.

그러나 그렇다고 너무 ?만 사용해도 fatal error를 내뱉어 즉시적으로 개발상 문제를 파악할 수 있는 부분도 그냥 넘어 가거나 사용전 확인 코드 때문에 코드가 너무 복잡해 지는 등의 문제가 있기 때문에.

개발상 최선의 판단으로 ?와 !를 적절히 사용하는 것이 중요하다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s