[Obj-C] NSObject 없이 새로운 객체를 만들기

Objective-C는 C의 수퍼셋(상위집합)이다. 따라서 Objective-C의 ‘이상하게 보이는 문법’을 제외하면 온전히 C코드만으로도 프로그램을 작성하는 것은 가능하며, 컴파일도 된다. 물론 이게 C 프로그램하고 다르냐면 그건 또 아니라고 하겠다만.

어쨌거나 현재 Objective-C가 널리 사용되고 있는 플랫폼은 애플의 OSX와 iOS 밖에 없다고 해도 과언은 아니다. 이 말은 곳 Cocoa(코코아는 Foundation과 Webkit 프레임워크의 합집합이다)가 곧 Objective-C의 기본 라이브러리와 거의 같다는 말이다. 특히 Foundation이 그렇다. Foundation에는 그 유명한 NSObject가 정의되어 있고, 실질적으로 프로그래머가 만들거나 혹은 이용하는 모든 클래스는 NSObject로부터 상속받은 객체들이다. (여기에는 예외가 하나 있는데, NSProxy 클래스는 NSObject로부터 상속받지 않는다.) 결국 NSObject 없는 Objective-C는 있을 수 없는 것인가?

다시 언어 자체에 대해 살펴보자면, Objective-C 자체가 개발된 것은 C언어를 기반으로 객체지향을 지원하는 언어를 만들기 위한 일종의 실험이었다. 따라서 Objective-C는 C언어위에서 객체끼리 메시지를 주고 받는 형태의 구조를 더한 것일 뿐이다. 실제로 Objective-C는 C이외의 부분은 상당히 작으며, 언어 자체는 상당히 콤팩트하다. 따라서 ‘표준 라이브러리’ 혹은 ‘기본 라이브러리’라고 볼 수 있는 부분이 언어와 함께 제공되지는 않으며 (물론, C 표준 라이브러리는 있다) Objective-C를 통해서 뭔가를 만들기 위해서는 Foundation과 같은 프레임워크가 필수적으로 필요하다. 바로 루트 클래스가 여기서 정의되고 있기 때문이다.

정리하자면, Objective-C를 통해 기본적인 객체를 만드는 것은 Foundation과 같은 프레임워크를 적용해야 한다는 것을 의미한다. 엄밀히 말해 이 Foundation은 (OPENSTEP, GNUSTEP, 애플의 Foundation 등이 있고) 언어 자체의 기본 라이브러리라기보다는 언어에 대한 플러그인이라고 볼 수 있다.

실험적으로 NSObject로부터 상속받지 않는 객체를 만드는 것은 가능하다. (바로 NSObject가 그러할테니까 말이다.) NSObject의 소스코드는 PureFoundataion 프로젝트에서 찾아볼 수 있으며 (여기) 이 중에서 객체의 생성과 초기화 및 해제, 그리고 객체와 클래스를 가리키는 포인터 등을 이와 비슷한 방식으로 구현해주면 된다. 그럼에도 불구하고 그러한 작업은 너무 어렵고, NSObject는 이미 충분히 잘 만들어져 있으므로 그냥 있는 걸 쓰는게 정답이다.