[receiver message]receiver는 메시지를 받을 객체이고, message는 메시지를 받은 receiver 객체가 실행해야 할 메소드이다. 예를들어 프로그램에 dataTable이라는 객체가 있다고 가정하자. 그리고 이 객체의 데이터를 업데이트 하려고 한다. 그러기 위해서는 다음과 같이 메시지를 보내면 된다.
[dataTable reloadData];Objective-C에서 인자(argument)는 콜론(:)을 쓰고 그 다음에 쓰면 된다.
[textField setEditable:YES];인자는 콜론만 붙이면 얼마든지 많이 쓸 수 있다. 메시지는 반환(return) 형식(type)과 메시지가 받는 인자의 형식(type)만 맞으면 다른 메시지 안에 포함될 수도 있다. 예를 들면 슬라이더로부터 값을 읽어서 텍스트 필드에 표시되게 할 수 있다.
[textField setDoubleValue:[slider doubleValue]];여기에서 볼 수 있듯이 [slider doubleValue]는 [textField setDoubleValue: ]의 인자로 사용되었다. doubleValue 명령은 double 형식의 값을 반환하고, setDoubleValue는 double형식의 값을 인자로 받는다.
id anObject;Objective-C에서는 기본 반환 값은 id 형식의 값이다. 그래서 메소드 반환 값의 데이터 형식이 지정되어 있지 않을 경우에는 자동적으로 id 형식으로 지정된다.
NSString *aString;변수이름 앞에 *표시는 변수 이름에 포함되지 않고, 단지 이것은 aString변수가 NSString형식에 대한 포인터라는 것을 나타낸다. 사실 객체 식별자 변수가 실제로 포인터라는 사실을 알 수 있는 부분은 선언할 때 뿐이다. 선언한 이후 aString 변수를 사용할 때에는 다른 변수와 똑같이 사용한다.
double number; number = [[anArray lastObject] doubleValue];물론, 여기서는 [anArray lastObject]에서 반환되는 객체가 doubleValue 메시지를 받을 수 있다고 가정한 것이다. 위 코드는 배열이 있다고 했을 때 [anArray lastObject] 메시지는 배열 내에서 마지막 객체를 반환한다. 그리고 그 객체에 doubleValue 메시지를 보낸다. 또다른 방법으로 아래와 같이 길게 코드를 작성할 수도 있다.
id tempObject; double number; tempObject = [anArray lastObject]; number = [tempObject doubleValue];Objective-C에서 새로운 클래스 선언하기
@interface ClassName : ItsSuperclass { instance variable declerations } method declerations @end인터페이스 선언은 항상 @interface 컴파일러 지시자로 시작하고, @end 컴파일러 지시자로 끝난다. @interface 지시자 다음에는 클래스 이름이 따라온다. 클래스 이름 다음에는 콜론을 쓰고 그 다음에는 새로운 클래스가 상속하는 상위 클래스의 이름을 쓴다. 만일 상위 클래스를 지정하지 않으면 코코아의 NSObject 와 같은 완전히 새로운 상위 클래스를 만든다는 뜻이다. († 역자 주: 실제로 이런 경우는 거의 없다.)
double radius; double xLocation; double yLocation; NSColor *color;인스턴스 변수 선언은 항상 데이터 형식을 쓰고 변수 이름을 쓰는 방식으로 한다. 나중에 자세히 언급할 NSColor는 Appkit에 선언되어 있는 컬러를 표현하는 클래스이다.
+ alloc그리고 -표시가 메소드 선언 앞에 있으면 이것은 인스턴스 메소드라는 뜻이다.
- (void)setXLocation:(double)x Ylocation:(double)y;메소드의 반환 형식은 실제 메소드 이름 앞에 괄호로 붙여 쓴다. 인자는 콜론 뒤에 쓰고, 만일 인자가 여러 개일 경우에는 공백으로 한 칸을 띄우고 인자의 이름을 쓰고 콜론을 뒤에 붙여 준다. 메소드 반환 형식과 같이 인자 데이터 형식은 인자의 이름 앞에 괄호를 붙여 써준다.
#import "ItsSuperclass.h"#import는 C 언어에서의 #include와 똑같은 역할을 하지만 조금더 똑똑하다. 파일이 한 번 읽어 들여졌다면 #include처럼 두 번 중복해서 불러들이지 않기 때문에 #import가 조금 더 똑똑하다고 할 수 있다.
참고 도서 |
#import "ClassName.h" @implementation ClassName : ItsSuperclass { instance variable declarations } method definitions @end모든 클래스 구현 파일은 자신의 인터페이스 파일을 불러들여야(import) 한다. 클래스에 대한 선언과 그 슈퍼 클래스에 대한 선언은 인터페이스 파일을 불러들이기 때문에 별도로 필요하지 않다. 이러한 구조는 구현 파일은 단지 메소드의 내용만 채워넣는다는 개념을 확실하게 해준다. 따라서 실제적으로 구현파일은 아래와 같은 코드만이 필요하다.
#import "ClassName.h" @implementation ClassName method definitions @end메소드는 C 함수와 같은 방식으로 정의된다. 함수의 이름은 마지막 세미콜론만 빼고 인터페이스 파일에서와 똑같이 사용한다. 그리고 메소드의 구현 코드는 함수 이름 다음 중괄호 안에 쓰면 된다. 예를 들어 Circle 클래스는 다음과 같은 메소드를 가진다.
+ alloc { your code } - (void)setXLocation:(double)x yLocation:(double)y { your code }위 코드에서 왜 + alloc는 반환 형식이 없는지 궁금할 것이다. Objective-C에서 반환 데이터 형식이 없을 때에는 기본적으로 id 형식이라 가정한다. 즉, 객체가 반환된다고 생각한다. + alloc 메소드는 클래스가 생성한 객체를 반환하는 것으로 되어 있어 특별히 반환 형식을 쓰지 않은 것이다. 덧붙여 실질적으로는 + alloc 메소드는 직접 구현할 필요가 없다는 사실을 알아둘 필요가 있다. NSObject 클래스에 이미 다 구현되어 있기 때문이다. + alloc 메소드의 목적은 새롭게 만들어지는 객체를 위해서 메모리 내에 공간을 할당하는 역할을 한다. 이것에 대해서는 이후에 객체를 생성하는 것에 대해 좀더 자세히 다룰 것이다.
- (void)setXLocation:(double)x yLocation:(double)y { xLocation = x; yLocation = y; }각 메소드 내에서만 사용 가능한 지역 변수도 선언할 수 있다. 예를 들면, 위 두 번째 메소드에서 별로 쓸모없는 변수를 넣어서 쓸 수도 있다.
- (void)setXLocation:(double)x yLocation:(double)y { double tempX; double tempY; tempX = x; tempY = y; xLocation = tempX; yLocation = tempY; }조금은 위험한 표현이지만, C 함수를 정의할 때 사용할 수 있는 모든 방법을 여기에서도 사용할 수 있다고 말 할 수도 있겠다.
id aCircle; aCircle = [Circle alloc];기억해야 할 것은 alloc은 객체를 반환한다는 것, 따라서 따라서 새로 만들어지는 인스턴스를 지칭하는 변수는 id 형식이어야 한다는 것이다. 일단 인스턴스를 만들고 난 다음에는 이 객체의 인스턴스 변수들을 초기화 시켜야 한다. 이것은 새로 만든 객체에 init 메시지를 보내면 된다.
[aCircle init];초기화는 객체의 메모리 할당을 한 후에 해야 한다. 일반적으로는 다음과 같은 형태로 새로운 객체를 생성하는 경우가 많다.
aCircle = [[Circle alloc] init];기본적으로 init는 모든 인스턴스 변수를 0으로 만든다. 초기화 메소드를 직접 정의할 수도 있다. 이것을 생성자(constructor)라고 하고, 각 클래스에 맞게 만들면 된다. 기본적으로 생성자는 "init" 라는 이름으로 시작한다. 생성자는 인스턴스의 변수를 직접 사용해야 하기 때문에, 생성자는 반드시 인스턴스 메소드여야 한다. alloc가 클래스 메소드인 것과는 다르다는 점에 유의하자. 예를 들어 Circle 클래스에서 기본적으로 원주의 값을 10으로 설정하는 생성자를 정의할 수 있다. 메소드는 다음과 같이 만들면 된다.
- (void)initWithRadius:(double)r; { radius = r; }생성자 메소드에서 지정하지 않은 모든 인스턴스 변수는 0으로 초기화 된다.
최신 콘텐츠