Objective-C

2023년 3월 7일 수정

Objective-C Programming Language

Objective-C는 프로그래밍 언어의 한 종류로 C 언어 혹은 C++ 언어의 슈퍼셋(superset)이다. 쉽게 말해서 C나 C++과 호환되면서도 특유의 다른 문법 또한 추가로 지원한다는 말이다.

이름에서 유추 가능하듯이 클래스 개념을 제공하는 OOP(Objective Oriented Programming) 패러다임의 언어다.

주로 사용되던 곳은 과거 스티브 잡스로 유명했던 NeXTSTEP의 주력 언어였고 이후 macOS에서도 주류로 사용된다. 이 과정에서 iOS에서도 당연하게 사용되다 최근 몇 년 사이에 현대적으로 새롭게 만들어진 Swift 언어로 주도권이 넘어가는 과도기로 인식된다.

Objective-C 문법 대충 정리

Objective-C는 C/C++의 슈퍼셋인 만큼 헤더 파일로 인터페이스를 전달하는 등의 동일한 구조를 가지고 있다. 클래스 정의는 헤더에 @interface 를 통해 정의를 하고 구현 파일에 @implementation 을 통해 실제 구현이 되는 방식이다.

대괄호가 클래스 인스턴스 생성과 메서드 호출 등에 중요하게 사용된다.

SomeClass *sc = [[SomeClass alloc] init];

위의 코드는 SomeClass 라는 클래스의 메모리를 할당(alloc) 받은 후 초기화 메서드(init)를 호출하는 두 가지 일을 하나의 코드로 표현한 것이다. 예를 들어 이를 Swift 방식으로 표현한다면

let sc = SomeClass()

이런 의미로 볼 수 있다. init 호출이 생략된 이유는 사실상 alloc과 init을 합쳐서 하나의 생성자 역할을 하기 때문에 그렇다. 대괄호의 사용은 Lisp의 괄호 악몽이 살짝 떠오르지만, 다행히도 대괄호로 모든 것을 하지는 않는 언어라 문법적 난이도는 덜한 편이다.

이 외에 좀 더 특수한 특징은 매개변수 필드 이름 표기를 강제한다는 점이다.

[worker doProcess:@"name" type:WORKER_TYPE_NORMAL options:0];

이런 식으로 메서드 이름을 포함해서 모든 매개변수는 이름을 표기해야 한다. 그래서 자동 완성이 지원되는 Xcode 같은 에디터가 아니면 코딩 하기는 귀찮지만 매개변수 이름 만으로 어느 정도 역할 유추가 가능해서 코드의 가독성은 제법 괜찮은 편이다.

프로퍼티 개념과 setter, getter 개념 또한 제공된다. 궁금하면 @property 키워드에 대해 찾아보자.

추상화 개념도 지원된다. 궁금하면 @protocol 키워드에 대해 조사해보자.

Reference Count를 통해 메모리를 관리하는 스타일을 채용하고 있어서 alloc/free 개념은 잘 안 쓴다. 이 카운트를 증가시키는 의미로 retain, 감소시키는 의미로 release 개념이 사용되고 이 카운트가 0이 되면 자동으로 메모리가 해제되는 방식이다.

물론 C 코드로 쓸 수 있고 alloc/free 함수도 쓸 수 있지만 retain이 걸리지 않도록 코딩에 주의는 필요하다.

요즘은 retain과 release를 컴파일 타임에 자동으로 부여하는 ARC를 사용하기 때문에 이 두 키워드를 보는 일도 별로 없어진 시대이다.

애초에 Objective-C 자체가 인기도 면에선 점점 잊혀서 가고 있는 언어라는 점은 인식하자.