Objective-C ¶
이 항목은 작성 중입니다.
이 항목은 작성 중인 항목입니다. 내용이 불완전할 수 있습니다. 충돌의 위험이 있으니 history를 확인한 후 작성하는 것을 권장합니다. 이 문서가 오랫동안 편집되지 않았다면 이 틀을 제거해 주세요.
오브젝티브 씨라고 읽으면 된다. 애칭은 옵씨. 브래드 콕스(Brad Cox)와 톰 러브(Tom Love)가 만든, 20세기의 걸작 언어 Jr.라고 생각하면 당신은 멋쟁이.
안시(ANSI) C에 객체지향 층을 얹어 만들었다. 따라서 실행 시 반드시 런타임(libobjc.dylib 또는 objc.dll)의 도움을 받아야 작동 가능하다. 물론 런타임은 애플 오픈 소스 사이트에 공개돼있으므로 능력이 있다면 얼마든지 정적 라이브러리로 만들어 붙여버려도 된다.
역사 ¶
초창기(넥스트가 먹기 전?) 옵씨는 C에서 객체 지향을 지원하도록 문법을 확장한, 일종의 신택틱 슈거(syntactic sugar)로 구현됐다. 옵씨 컴파일러는 옵씨 코드를 읽어 C 코드를 뱉었고, C 컴파일러가 그걸 바이너리로 어셈블했다. 넥스트(NeXT Inc.)가 옵씨를 집어삼킨 이후부터는 옵씨 코드에서 바로 바이너리로 직행하는 컴파일러가 지원된다. 예전에는 GCC를 이용했지만, 요즘은 애플 주도의 LLVM/Clang을 이용해 컴파일한다. 물론 오픈 소스 LLVM/Clang 3와 Apple LLVM/Clang 4 모두 옵씨 코드를 컴파일할 수 있지만, 클로즈드 브랜치인 Apple LLVM/Clang 4가 훨씬 월등한 어셈블 능력을 보여준다는 게 참.......
여담으로 FreeBSD 재단에서 오픈 소스 LLVM/Clang 3를 다루던 사람이 말하길, 참고삼아 GCC 4.2의 옵씨 담당 부분 소스 코드를 봤다가 기절할 뻔했다고. 무려 일만 줄이 넘어가는 단일 C 파일 하나로 옵씨의 모든 걸 처리했단다.
구조 ¶
C 소스 코드는 곧 옵씨 소스 코드이다. 앞서 말했듯, 옵씨는 C에 확장을 얇게 바른 언어에 가깝다. 하지만 그렇다고 옵씨 소스 코드가 곧 C 소스 코드인 건 아니다.
옵씨의 모든 클래스, 인스턴스, 셀렉터는 C의
struct
로 만들어진 것과 같다. 즉, 내가 클래스 하나를 소스 코드로 선언했다면 그건 C의 struct
로 묶인 것처럼 바이너리 상에 들어간다는 소리. 실제로, 옵씨로만 작성된 Foundation 프레임워크와 C로만 작성된 CoreFoundation 프레임워크의 구성 클래스 및 원시 클래스(struct
로 만들어진 것)는 서로 실행 시간에 캐스팅하여 사용이 가능하다. 물론 규칙에 맞도록 struct
를 짰을 경우에 한해서.임의의 클래스(AFArdieFoxTestClass)의 인스턴스(theFox)는 대충 이렇게 보면 된다:
struct _AFArdieFoxTestClass { Class *isa; // 클래스 객체 AFArdieFoxTestClass를 가리킨다 // 기타 잡다한 인스턴스 변수들 } *theFox;
잠깐, 지금 클래스 객체라고 했나? 오케이 정확히 들었다. 옵씨는 흔히들 생각하는 것처럼 설계도인 클래스와 제품인 객체(인스턴스)로 이뤄진 관계가 아니다. 옵씨에는 적어도 세 종류의 객체만 있다: 객체, 클래스 객체, 메타 객체.
어떤 클래스의 인스턴스를 만들었다면 그건 그냥 객체다. 그런데, 클래스 그 자체도 객체이다! 이 클래스 객체가 무슨 메서드를 들고 있을까? 바로 클래스 메서드이다. 자바로 치면 static 메서드라고 할 수 있겠다.
어떤 클래스의 인스턴스를 만들었다면 그건 그냥 객체다. 그런데, 클래스 그 자체도 객체이다! 이 클래스 객체가 무슨 메서드를 들고 있을까? 바로 클래스 메서드이다. 자바로 치면 static 메서드라고 할 수 있겠다.