맨 좌측에서 java.lang.Object와 NSObject를 보실 수 있습니다.
이 들을 사용하여 새로운 Class들을 만들 수 있습니다.
Objective-C에서는 일반적으로 Class들을 만들 때 NSObject를 상속받아서 만듭니다. java.lang.Object처럼 기본적인 객체로서의 갖추어야할 속성이나 메소드들을 가지고 있는 클래스이구요.
java와의 차이점은 java에서는 모든 클래스들이 Object 클래스를 상속받아서 만들어져야 하는데요. Objectie-C에서는 NSObject와 동급의 클래스를 만들 수가 있습니다. 이러한 동급의 클래스를 Root Class라고 하구요.

Root class가 위치한 tab에서 NSObject를 상속받는 클래스 Foo를 만듭니다.
Foo 클래스 내부의 속성과 메소드를 정의할 차례인데요.
먼저, Cocoa(Objective-C의 tutorial에서는 instance variable로 표기되어있더군요.)에서의 용어를 살펴보면 다음과 같습니다.
Instance variables that are pointers to other objects are called outlets
Methods that can be triggered by user interface objects are called actions
Methods that can be triggered by user interface objects are called actions
outlet이 java의 attribute에 해당하고 action이 method에 해당한다고 보시면 될 것 같네요. 약간의 차이는 있어도요.

클래스 Foo의 속성 및 메소드 설정이 가능한 Inspector 창
선택된 Outlet tab에서 새로운 outlet을 추가하면 Outlet Name이 나옵니다. 여기에서 Type을 선택할 수 있습니다.
Objective-C에서는 오브젝트는 기본적으로 id로 나타내집니다. 이 때 오브젝트의 의미는 통상적인 객체 자체 뿐만 아니라 메소드도 포함하게 됩니다. 표기는 다음과 같습니다.
id Object;
id는 int 타입으로 Object의 포인터입니다. 컴파일 시에는 어떤 것인지 알 수 없으므로 Runtime시 Dynamic하게 처리가 됩니다. id값이 0인 놈이 하나 있는데 이놈은 nil이라 불립니다. nil은 java의 null객체에 해당합니다.
여기에서 id가 아닌 실제 클래스이름으로 선언할 수도 있습니다. 이는 static typing이라 불리며 표기는 다음의 형태가 됩니다.
NSTextField *textField;
객체 이름에 포인터표기에 주의하시구요. (제일 싫어하는 Pointer내요 ㅠㅠ) 객체들은 항상 포인터로 표기되어야 합니다. Type을 선언함으로서 컴파일 시간에 type checking을 통해서 더욱 robust한 프로그램을 만들 수 있구요. 이 때 id는 감추어질 뿐입니다. id는 존재하구요.

Foo클래스에 action을 추가한 모습입니다.
Objective-C (1)에서 언급한 것처럼, method에서 +는 class methods, - 는 instance methods를 예기합니다.
return type으로는 class나 instance 지시자 다음에 () 형태로 오게 됩니다.
- (float)radius;
return type을 정의하지 않는 경우에는 id가 리턴이 된다고 가정합니다. argument들은 method 이름 뒤에 :을 사용하여 구분이 됩니다. 이 때 argument의 type은 ()로 정의됩니다.
- (void)setRadius:(float)aRadius;
argument가 여럿인 경우는 :로 구분되며 각각의 argument에 이름을 붙일 수 있습니다. 만약 width와 height를 설정하는 메소드를 만든다면 다음과 같이 만들 수 있습니다.
-(void)setWidth:(float)width :(float)height;
-(void)setWidth:(float)width height:(float)height;
-(void)setWidth:(float)width height:(float)height;
이름을 argument에서 따로 설정해주는 이유는 메소드를 호출하는 클래스에서 어떠한 값을 넣어주는 지에 대해서 명확하게 정의할 수 있기 때문입니다.

Foo에 속성을 넣고 다음과 같이 Foo클래스 파일을 생성하면
댓글 없음:
댓글 쓰기