= Objective-C = [[include(틀:작성중)]] ''오브젝티브 씨''라고 읽으면 된다. 애칭은 ''옵씨''. 브래드 콕스(Brad Cox)와 톰 러브(Tom Love)가 만든, '''20세기의 걸작 언어 Jr.'''라고 생각하면 당신은 멋쟁이. 안시(ANSI) [[C]]에 객체지향 층을 얹어 만들었다. 따라서 실행 시 반드시 런타임(libobjc.dylib 또는 objc.dll)의 도움을 받아야 작동 가능하다. 물론 런타임은 [http://opensource.apple.com/source/objc4/ 애플 오픈 소스 사이트]에 공개돼있으므로 '''능력이 있다면''' 얼마든지 정적 라이브러리로 만들어 붙여버려도 된다. == 역사 == 초창기(넥스트가 먹기 전?) 옵씨는 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 메서드라고 할 수 있겠다. [[include(틀:ProgrammingLanguage)]]