Categories
Objective-C

2019년에 Objective-C 정리하기 #1

현 시점에서 뜬금없이 Objective-C 이야기를 왜 하는가 싶겠지만 아무리 Swift 만 사용하여 앱을 만들었다 하더라도 우리의 앱은 Objective-C 런타임에서 실행되게 된다.(아직까지는…), 때문에 Objective-C 에 대하여 알고있다면 Swift를 사용하여 앱을 작성할 때 조금이나마 도움이 될 것이다.

나는 2009년에 Objective-C 2.0 부터 이후 Modern Objective-C 기능이 추가되고 Swift가 출시되면서 Swift 1.0부터 최근 5.1 까지 사용하며 애플 플랫폼에서 개발을 해왔다.(현재는 Swift를 주력으로 사용하지만, 개인적으로는 Objective-C를 더 좋아한다.)

Objective-C 간단 소개

Objective-C(Object-C 아님, Objective-C 임!)는 애플 플랫폼 소프트웨어를 개발할 때 사용하는 기본 프로그래밍 언어이다. C 언어의 상위 집합이고 객체 지향 프로그래밍과 동적 런타임을 제공한다. Objective-C는 C 언어의 문법, 기본 타입, 흐름 제어 구문을 모두 상속하고 클래스 및 메소드 정의를 위한 문법이 추가되어 있다고 생각하면 된다. 또한 언어 수준에서 객체 그래프 관리 및 객체 리터럴을 지원하고 동적 타이핑 및 바인딩을 제공한다.

환경

  • Xcode 11 GM
  • macOS Catalina 10.15 beta 8
  • MRR(Manual Retain-Release)(애플은 ARC의 반대를 MRC라고 부르지 않는다.)

프로젝트 생성

시작하기에 앞서 Xcode 11을 사용하여 Objective-C 프로젝트를 생성하고 MRR을 사용하여 진행할 것이므로 ARC를 끄는 방법을 설명하겠다.

Xcode에서 File > New > Project...(⇧⌘N) 을 눌러 새로운 프로젝트를 생성한다. 템플릿은 macOS > Command Line Tool을 선택한다.

다음 Product Name을 적당히 넣어주고, LanguageObjective-C를 선택한다.

Language가 Objective-C로 설정했는지 확인한다.

이제 Modern Objective-C와 ARC를 사용하는 프로젝트가 생성되었다. 우리는 아직 ARC를 사용하지 않을 것이므로 Build Settings에서 ARC를 꺼준다.

이제 Project navigator에서 main.m 파일을 선택하여 소스코드를 살펴본다. 자동으로 생성된 코드는 아래와 같을 것이다.

C 언어의 상위집합 언어이므로 Objective-C 도 프로그램의 진입점 역할을 하는 main 함수가 있고 Autorelease를 위한 Autorelease pool block이 하나 있고 내부에 로직이 들어가게 된다.

ARC 환경 이전의 코드에서는 Autorelease pool block 대신 NSAutoreleasePool을 사용했지만 NSAutoreleasePool은 내부적으로 객체가 아니어서 ARC가 도입되면서 Autorelease pool block으로 대체되었다. 하지만 MRR모드에서도 Autorelease pool block은 사용할 수 있으며 속도 또한 더 빠르므로 NSAutoreleasePool 대신 Autorelease pool block을 사용하도록 하자.

Autorelease pool block 개념은 ARC를 사용하는 Swift에서도 유효하다.

NSAutoreleasePool을 사용하는 코드는 아래와 같다.

NSAutoreleasePool의 drain 메소드는 일반적으로 release 메소드와 같다. GC 환경에서의 동작이 달라지는데 어차피 Objective-C의 GC 환경은 사라진지 오래됬다.

그냥 속도도 빠르고 읽기에도 편한 Autorelease pool block을 사용하자.

다음으로 내부 로직을 보면 NSLog(@"Hello, World!"); 구문이 있다. NSLog는 애플 시스템 로그에 메시지를 기록하는 Foundation 프레임워크의 함수이다. 디버그 용도로 콘솔에 출력할 때에는 NSLog 를 사용하자.(printf 같은 C 함수를 사용할 수도 있긴하다.)

여기서는 NSLog 함수의 첫번째 인자로 @”Hello, World!” 를 넘겨주고 있는데 Objective-C 에서 @ 심볼로 시작하는 경우는 객체 리터럴이다. @”” 형식은 문자열을 의미하는 NSString 리터럴이다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다