본문 바로가기
Mac/Objevtie-C

(작성중)Objective-C 용어 정리

by 나르시스 2013. 4. 1.


[ 발췌 : 아이폰과 맥 OS X 개발을 위한 오브젝티브-C 2.0 ]


책에 나온 내용중에 잊지 않기 위한 특정 용어나 정의 등에 대한 부분에 대하여 자바(제대로 아는건 이것뿐!!)와 비교하여 정리하였고 그대로 발췌한 부분도 있고 관련된 부분에 대해 추가한 부분, 그리고 간략하게 요약만 하여 정의를 한 부분도 있다. 내용들은 간략하며 선행되어야 하는 지식들에서 설명하지 않으므로 Objective-C의 기본 문법을 습득하고 보기를 권장한다.


  • 키워드OPEN-CLOSE 이론, ivars, 인스턴스 변수, 리팩토링, 깨지기 쉬운 베이스 클래스 문제


  • @ : C언어의 Objective-C 확장을 의미한다.
  • #import <Foundation/Foundation.h> : 여러부분(헤더파일, 라이브러리, 이미지, 사운드 등)이 모여서 하나의 단위로 묶여 있는 컬렉션이다. 애플은 코코아(cocoa), 카본(Cabon), 퀵타임(Quick Time), OpenGL 등의 기술을 프레임워크로 배포한다. 코코아는 Foundation과 Application Kit (AppKit)의 두 프레임워크로 구성되어 있으며, 코코아를 더 멋지게 만들어주는 코어 애니메이션(Core Animation)과 코어 이미지(Core Image)를 포함하는 프레임워크도 들어있다.
  • NS 접두어 : Cocoa 함수라는 의미, 이 툴킷이 NextSTEP이라고 불리며 NeXT Software(공식적으로는 NeXT, Inc.로서 1996년에 애플에 합병됨)의 제품이였던 때로 거슬러 올라간다. NextSTEP을 위해 이미 작성된 코드와의 호환을 유지 하기 위해, 애플은 NS 접두사를 계속 사용하고 있다. 한마디로 NS 접두어 쓰지 말란 소리.
  • BOOL : 실제로 8비트의 저장 공간을 갖는 부호 있는 문자(signed char) 타입을 단지 형 정의(typedef)한 것이다. YES는 1로 정의되어 있고 NO는 0으로 정의되어 있다(#define 사용). 오브젝티브-C는 BOOL을 YES나 NO의 값만을 담을 수 있는 진정한 블리언 타입으로 여기지 않는다. 컴파일러는 BOOL을 8비트 숫자로 인식하고 YES나 NO의 값은 단지 관습이다. 이는 미묘한 결과를 낳는다. 만일 무심코 1바이트보다 큰값의 정수(예를 들어 short나 int 값 등)를 BOOL 변수에 넣는다면, BOOL 변수의 값에서 하위 바이트만 사용한다. 하위 바이트가 0인 경우(예를 들어 8960, 16진수로 0x2300 등) BOOL의 값은 0, 즉 NO값이 된다. 
    • 자바에서의 boolean보다는 아무생각 없이 썼다가는 낭패를 볼 듯하다. 그냥 8bit짜리 signed char(int) 형이기 때문에 BOOL타입으로 정의된 변수에 int값을 때려 넣어도 cast error 없이 들어간다는 말이다. 말이  진위 판단이지 실수하면 BOOL 변수안에 '16' 이런 int값도 들어갈 수 있어 낭패를 볼 수 있다.
  • OOP : 객체 지향 프로그래밍(Object-Oriented Programing) 의 약어. 원래는 시물레이션 프로그램을 만들기 위하여 개발된 프로그래밍 테크닉이다. 1960년대의 Simula, 1970년대의 Smalltalk, 1980년대의 Clascal 그리고 기타 언어에서 진화했다. C++, JAVA, Python, Objective-C 같은 현대의 언어들은 이런 오랜 언어에서 영감을 받았다. 
  • Indirection(간접접근) : '코드에 있는 값을 바로 사용하지 말고 그 값을 가리키는 포인터를 사용하라' 라는 의미
  • \0 : 문자열의 끝을 나타내며 아스키코드 0을 의미한다.
  • Class : 클래스는 객체의 타입을 나타내는 구조체이다. 객체는 클래스 자체의 다양한 정보, 특히 각 액션을 처리하기 위한 코드를 참조한다. 단순한 프로그램은 클래스가 몇 개 안 되지만 보통의 프로그램은 수십 개의 클래스를 갖는다. Objective-C 스타일은 개발자들에게 클래스의 이름을 대문자로 사용하기를 권장하고 있다. 
  • Object(Instance) : 객체는 값과 클래스를 가리키는 숨어 있는 포인터를 갖는다. 실행되는 프로그램은 보통 수백에서 수천개의 객체를 갖는다. 객체를 참조하는 Objective-C 변수는 보통 대문자를 사용하지 않는다.
  • Message : 메세지는 객체가 수행하는 액션이다. 객체가 메시지를 받으면 그 클래스는 실행할 적절한 코드를 찾도록 도와준다.
  • Method : 메소드는 메시지에 반응하는 코드이다. 
  • Method Dispatcher : 메소드 디스패처는 특정 메시지에 어떤 메소드가 반응하게 되는지를 알기 위해 Objective-C가 사용하는 방법이다.
  • Interface : 인터페이스는 객체의 클래스에 의해 제공되는 내용의 설명이다. 인터페이스의 개념은 OOP에 국한된 것은 아니다. C의 헤더 파일은 #include <studio.h>를 했을 때 사용할 수 있는 표준 I/O 라이브러리와 #include <math.h>와 같은 수학 라이브러리를 쓰는 사람이 자세한 구현 방법에 대한 지식이 없이 간단히 불러 쓸 수 있도록 제공되는 것이다.
  • Implementation : 구현은 인터페이스가 동작하도록 하는 코드이다. 
  • Infix notation 중위 표기법은 Objective-C가 사용하는 문법 테크닉이다. 메소드의 이름과 그 인수는 하나로 묶여 있기 때문에 각각의 인수들이 의미하는 바를 한눈에 알아볼 수 있다.
  • private method : @interface에 존재하지 않고 @implementation에서만 정의된 메소드를 의미하며 구현된 클래스에서만 사용한다. 하지만 @implementation 지시자에서만 정의된 메소드는 구현 밖에서는 읽지 못하는 것으로 생각할 수도 있지만 그렇지는 않다. Objective-C는 실제로 private method를 갖지 않는다. @interface에 없다고 해도 @implementation에 정의된 private method를 호출한다면 이를 막을 방법은 없다. 이는 Objective-C가 갖는 동적인 속성의 부작용이다.
  • isa : NSObject 인스턴스 변수를 의미한다. 상속이 서브클래스와 수퍼클래스 같의 '~은 ~이다(is a)' 라는 관계를 설정하기 때문이다. 일반적인 타입대신 더 객체에 특화된 종류를 사용하는 기능을 다형성이라고 부르는데, 이는 그리스어로 '다양한 모양'이라는 의미이다.
  • self : 모든 메소드는 메시지를 받는 객체를 가리키는 포인터인 self 가 숨겨진채로 호출된다. 메소드는 사용할 수 있는 인스턴수 변수를 찾기 위해 self 파라미터를 사용한다.
  • inheritance : 상속은 '~은 ~의 일종이다(is a)' 라는 관계를 설정한다. '삼각형은 도형의 일종이다' 와 같이 'X는 Y의 일종이다' 라고 말할 수 있다면 상속을 사용할 수 있다.
  • composition : 컴포지션은 '~은 ~을 가진다(has a)'라는 관계를 설정한다. '자동차는 엔진과 타이어를 가진다' 에서 자동차는 엔진의 일종도 아니고 타이어의 일종도 아니다. 'X는 Y를 가진다' 라고 할 수 있으면 컴포지션을 사용할 수 있다.
  • get 접두어 : get이라는 단어는 코코아에서 특별한 의미를 갖는다. 코코아 메소드 이름에서는 메소드가 파라미터로 전달한 포인터를 통해서 값을 반환한다. 예를 들어, NSData(임의의 연속된 바이트를 저장하는 객체를 위한 코코아 클래스)에는 바이트를 담고 있는 메모리 버퍼의 주소인 파라미터를 받아들이는 getBytes: 라는 메소드가 있다. NSBezierPath(그리기에 사용되는 클래스)에는 getLineDash: count: phase: 라는 메소드가 있는데, 이 메소드는 점선의 패턴을 위한 배열을 가리키는 포인터, 선의 패턴의 요소의 개수를 나타내는 정수를 가리키는 포인터, 그리기를 시작하기 위한 위치를 가리키는 포인터이다. 따라서 메소드의 이름을 정할때 get접두어는 피하여 사용하는 것이 좋다라는 말이다.
  • #import : 헤더파일을 포함하는 데는 큰따옴표("")를 사용하는 방법과 꺽쇠괄호(<>)를 사용하는 방법 두 가지가 있다. 예를 들면 #import <Cocoa/Cocoa.h> 와 #import "Test.h"와 같이 헤더 파일의 양 끝이 ""와 <>로 다른 것을 볼 수 있다. 꺽쇠괄호를 사용한 버전은 시스템 헤더 파일을 가져온다. 따옴표는 헤더 파일이 이 프로젝트에서만 사용하는 헤더 파일이라는 것을 나타낸다. 꺽쇠괄호에 들어있는 헤더 파일은 시스템이 주인이기 때문에 여러분의 프로젝트에서 그 파일은 읽기 전용이다. 유닉스 파일시스템에서는 각 파일마다 소유건이 존재한다. 따옴표 안의 헤더 파일의 경우는 프로젝트를 진행하는 사람이 주인이므로 그 파일을 변경할 수 있다고 생각하면 된다. 
  • @class : 전방 참조(forword reference)를 설정한다. 아울러 @class는 상호 참조(circular dependency)가 있는 경우에도 아주 유용하다. 


댓글