CLOSE SEARCH

Objective-C is on the MOVE

Objective-C는 어느새 C와 Java의 자리를 위협할 정도로 인기있는 언어가 되었습니다. Apple은 개발자의 생산성과 소프트웨어 품질을 염두에 두고 Objective-C를 발전시키고 있다고 합니다. 이번 WWDC 2013에서도 Apple은 다양한 개선점과 새로운 기능을 소개했고, LLVM 5와 함께 짝을 이루어 더 강력한 언어로 발전하였습니다.

  • Modules
  • NEW Keyword – instancetype
  • Explicitly-typed enums
  • ARC Improvement

이번에 발표된 내용 중에서 가장 주목해야할 기능은 단연 Modules라고 생각됩니다. 다양한 자동화와 성능향상을 통해 개발자의 생산성을 증가시켜주는 Modules는 어떤 기능인지 간략하게 살펴보겠습니다. 아마 이 글을 읽으신 대부분의 개발자들은 저처럼 이 기능에 감탄하게 될 것입니다^^

 

Modules

.m 소스파일의 가장 첫 부분에는 항상 헤더파일을 import 하는 구문이 있습니다.

이 방식을 Textual Inclusion이라고 합니다. #import는 전처리과정에서 자신이 위치한 곳에 지정한 헤더 파일의 소스를 복사합니다. 그래서 import 하는 헤더 파일의 수가 증가할수록 파일의 크기가 증가하고 그에따라 컴파일 시간도 증가하게 됩니다. Precompiled Header를 통해 이러한 문제를 어느정도 해결할 수 있는 있지만, Apple은 Module이라는 기술을 통해 더 나은 해결책을 제시하였습니다.

Module은 프레임워크를 캡슐화하고 소스 파일과 별도로 컴파일됩니다. 내부적으로 이루어지는 모든 작업은 LLVM 5가 알아서 처리해주기 때문에 어떤 장점이 있는지만 기억하면 됩니다.

 

Build & Indexing Time Improved!

Apple은 다양한 앱을 Module을 사용해서 개발하였다고 합니다. 특히, iOS용 Mail 앱 개발에 Module을 적용한 자료를 보면 빌드 속도는 40% 빨라졌고, 인덱싱 속도는 230% 빨라졌다는 것을 확인할 수 있습니다. 비록 Xcode나  Preview 앱의 자료에서는 Mail 앱 만큼의 성능향상은 없지만, 앞으로 이 기술이 점차 개선된다면 모든 앱 개발에서 속도가 향상되리라고 보여집니다.

[one_half]module_buildtime_improved_preview[/one_half]

[one_half_last]module_indextime_improved_preview[/one_half_last]

 

Semantic Import & Selective Import

Objective-C에 헤더 파일을 import하는 새로운 방식이 추가되었습니다. Semantic Import라는 이 방식은 다음과 같이 #대신 @을 사용합니다. LLVM 5 컴파일러는 Semantic Import 지정한 프레임워크에 대한 Semantic Description을 임포트 해주기 때문에 더 이상 헤더파일을 파싱할 필요가 없어졌습니다. 그리고 소스에 포함된 매크로들이 전처리과정에서 프레임워크 API에 영향을 주었던 문제도 더 이상 발생하지 않습니다.

새로운 Semantic Import 코드는 오른쪽의 코드와 동일한 역할을 합니다.

[one_half]

Semantic Import

[/one_half]

[one_half_last]

Textual Inclusion

[/one_half_last]

위에서 볼 수 있듯이 Semantic Import는 프레임워크에 있는 모든 헤더를 Import 합니다. 만약, 프레임워크의 일부만을 import하고자 한다면 Selective Import를 사용해야 합니다. @import로 지정한 프레임워크 이름 뒤에 .을 추가하고 원하는 클래스의 이름을 입력해주면 됩니다.

[one_half]

Selective Import

[/one_half]

[one_half_last]

Textual Inclusion

[/one_half_last]

 

Autolinking

Semantic Import와 Selective Import를 사용해서 프레임워크를 import하면 LLVM 5가 프레임워크를 자동으로 인식하고 링크해 줍니다. 지금까지 소스코드에서 원하는 프레임워크를 사용하려면 빌드 설정에서 프레임워크를 직접 추가해줘야 했지만, 이제 이 작업을 LLVM 5가 자동적으로 처리하기 때문에 앞으로 매번 프레임워크를 링크하는 수고를 할 필요도 없고, 프레임워크를 링크하지 않아 Undefined symbols 오류를 만나게 되는 일도 거의 없을 것입니다.

 

Opt-In

Module은 Opt-In 방식의 기능이므로 기본적으로 활성화 되어 있습니다. 관련된 설정은 빌드 셋팅에서 변경할 수 있습니다.

xcode5_modules_setting

 

Compatibility

그러면 이전에 작성된 코드에 Module을 적용하려면 코드를 수정해야 하는 것일까요? 다행스럽게도 이전 코드를 그대로 사용할 수 있습니다. LLVM 5는 전처리과정에서 #import와 #include를  @import로 자동적으로 맵핑시켜 줍니다. 그래서 이전 프로젝트를 사용할 때는 Module 기능이 활성화되어 있는지만 확인해보면 됩니다.

 

Limitation

Module은 새로운 기술이기 때문에 iOS 7 SDK와 OS X 10.9 SDK로 개발하는 경우에만 사용할 수 있습니다. 그럼 Module을 사용해서 iOS 6에서 사용할 앱을 개발할 수는 없는 걸까요? 아닙니다. 단지 사용하는 SDK 버전에 대한 제한일 뿐, 배포 타겟 설정을 통해 하위 버전의 앱도 얼마든지 개발할 수 있습니다.

마지막으로 이 기능은 Apple에서 제공하는 프레임워크에서만 동작하기 때문에 C++ 코드나 사용자가 직접 만든 프레임워크에서는 동작하지 않습니다.

 

 

Filed under: Apple WWDC 2013, iOS

  1. 흥미롭내요 감사히 잘봤습니다.
  2. 히파루스
    AUTOLINKING 이 기능은 참 좋네요 감사합니다.