Swift에 따른 Objective-C의 새로운 기능들

Objective-C의 기능 추가

  • Nullability annotations
  • Generics

안녕하세요 야곰입니다 🙂

Swift 2.0이 오픈소스화 되면서 관심이 많이 쏠리고 있습니다.
그러나 기존 Objective-C 프로그래머들 사이에서는 Swift에 따라 변화되는 다양한 모습들이 부담으로 다가오기도 합니다.

Swift 언어 문법과 기능들에 더 잘 맞춰주기 위하여 기존의 API들이 변경되기도 하고, Objective-C의 문법적 기능들과 키워드들이 몇몇가지 추가되기도 했습니다. 그에대해 간략히 살펴보는 시간을 가져보도록 할게요.

해당내용은 2015년 6월 말에 작성된 내용으로, 애플에 의해 추후 변동의 여지가 충분히 있음을 미리 알립니다.

Nullability

Swift는 지난 포스팅에 말씀드렸듯 자료형에 굉장히 민감합니다. 더불어 nil에 대해서 Objective-C와 완전히 다른 대응체계를 가졌죠. Swift 에서는 nil이란 녀석에도 굉장히 민감합니다. 그래서 그런 Swift의 특성에 맞도록 Objective-C의 기능이 추가되었습니다.
바로 nullability라는 기능인데요, 한 번 살펴보죠.

Nullability 기능은 Xcode 6.3 / Swift 1.2 버전부터 정식 지원합니다.
weakstrong, __weak__strong 이라는 키워드 기억하시나요?

ARC 때문에 생겨난 새로운 키워드였죠. 이와 쓰이는 위치가 비슷합니다. (예를 든 것일뿐 weakstrong 키워드와는 전혀 상관이 없습니다)

Nullability 기능으로 새로 생겨난 키워드는 nullable, nonnull, null_unspecified, null_resettable 등입니다.

nullable

해당 항목이 null일 수 있다. 즉, Swift의 옵셔널 [?] 항목입니다.

nonnull

해당 항목이 null일 수 없다. 즉, Swift의 논옵셔널 항목입니다.

null_unspecified

해당 항목의 null 여부가 지정되어있지 않다. 즉, Swift의 암시적 추출 옵셔널 형식 [!] 항목입니다.

null_resettable

해당 프로퍼티가 기본값을 가지고 있어 nil일 수 없을 경우에 사용합니다.

즉, nil을 할당하면 즉기 기본값으로 초기화되는 프로퍼티에 사용할 수 있습니다.

Swift에서는 암시적 추출 옵셔널 형식 [!] 으로 표현됩니다.

  • nullability 키워드를 별도로 지정하지 않는 경우 null_unspecified가 기본입니다.
  • nullable, nonnull, null_unspecified는 Objective-C 프로퍼티와 메서드, C와 블럭 포인터 등 전반적으로 모두 사용가능하지만, null_resettable은 Objective-C 프로퍼티에만 사용 가능합니다.

일단 메서드에 쓰이는 예를 살펴보죠. UIViewController의 한 메서드입니다. Swift 코드와 Objective-C 코드를 살펴보면 기존의 API와 다르게 nullability 관련 키워드가 Swift의 옵셔널 형식에 맞게 반환자료형 또는 전달자료형 뒤에 삽입되어 있음을 확인할 수 있습니다.

[ nonnullnullable의 API 적용 예 ]

[ null_unspecifed의 프로퍼티 적용 예 ]

위에서 nullability 관련 키워드를 설정해 주지 않는 경우 기본적으로 null_unspecified가 기본값으로 적용된다고 말씀드렸는데, 기본값을 변경할 수 있는 메크로가 존재합니다. NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END. 이렇게 한 쌍으로 존재합니다. 저 한 쌍의 매크로 안쪽에 해당하는 항목들은 기본적으로 nonnull 옵션이 적용됩니다.

스크린샷을 보시면 실제로 Swift에서 어떻게 적용이 되는지도 확인하실 수 있을겁니다.

[ Objective-C 코드에서 NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END의 적용 예 ]

[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]

null_resttable에 관련된 프로퍼티를 찾아보았으나 찾지 못했습니다. 애플이 제공한 null_resettable에 관한 문서설명에는 아래 스크린샷과 같이 나와있지만 실제 tintColornull_resttable이 아니었습니다 🙂 참고로 알아두시면 될 것 같습니다.

[ null_resttable에 대한 설명 ]

Generics

Objective-C에서 제네릭이 추가되었다고하여 찾아보았는데, 아마도 Swift의 콜렉션 타입(배열, 딕셔너리, 세트)를 위해 반영이 된 것 같습니다. Objective-C 에서는 배열(NSArray), 딕셔너리(NSDictionary), 세트(NSSet)에 자료형에 상관없이 한 콜렉션에 여러가지 객체형태를 넣어줄 수 있었죠. 즉, myArray라는 NSArray에 문자열도, 숫자도, 뷰 객체도 한 번에 들어갈 수 있었다는 이야기입니다. 그러나 Swift에서는 하나의 콜렉션에는 하나의 자료형밖에 담지 못합니다. Array도, Dictionary도, Set도 전부 담게되는 자료형을 명시해 주고, 그 자료형과 맞지 않으면 넣을 수 없었습니다. 이런 차이를 극복하기 위해 Objective-C에 기능을 추가했군요. 저는 Objective-C의 콜렉션이 자료형과 상관없이 넣을 수 있어서 참 강력하다고 생각했는데, 개인적으로는 아쉽습니다. Objective-C의 generics은 Xcode 7 / Swift 2.0 부터 지원합니다.

스크린샷을 보시면 어떻게 상호 호환되는지 확인해 보실 수 있습니다. __kindof 키워드는 그 클래스와 하위 클래스까지 호환됨을 의미합니다. 실질적으로 Swift의 코드에 미치는 영향은 없습니다.

[ Objective-C 코드에서 Generics의 적용 예 ]

[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]

애플이 단지 Swift를 밀어주기 위해 Objective-C를 변경 하는 것인지, 아니면 두 언어의 상생을 위하여 Objective-C를 조금 희생시키는 것인지는 두고봐야 할 것 같습니다.

P.S. 오늘은 6.25 한국전쟁 발발일입니다. 오늘만이라도 뼈아픈 민족상잔의 비극을 잊지않고 되돌아 보는 시간이 되면 좋겠습니다.[역사를 잊은 민족에게 미래는 없습니다]

by yagom


facebook : https://facebook.com/yagompage
facebook group : https://www.facebook.com/groups/yagom/

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기

댓글 남기기

Close