#import는 여러 소스로 선언되고 구현된 클래스를 사용할 때 어떤 클래스가 다른 클래스를 참조해야할 때 사용한다. 그런데 #import로 다른 클래스를 참조할 때 간혹 문제가 발생한다. 예를 들어 A클래스가 B클래스를 참조하고, B클래스가 A클래스를 참조해야 한다면 각각 #import로 참조해야 하는 경우가 있다. 이 때 사용할 수 있는 지시자가 바로 @class이다.

@class를 사용하면 #import로 다른 클래스의 헤더 파일을 참조하지 않아도 컴파일러가 묵시적으로 해당 클래스의 존재를 인식하고 컴파일 해준다. 또 한 파일에 클래스를 여러 개 구현할 때 아래에 선언한 클래스를 위에서 참조할 필요가 있을 때도 사용할 수 있다.

그러므로 어떤 클래스를 사용하는데 있어서 그 클래스의 메소드나 기타 상세한 정보가 필요치 않은 경우 @class 지시자로 충분하다.

[Example @class]

#import <Foundation/Foundation.h>

@class XYPoint;
@interface Rectangle: NSObject
{
     int width;
     int height;
     XYPoint *origin;
}

@property int width, height;

-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(void) area;
-(void) perimeter;

@end

@class XYPoint;
@class 지시어를 사용하면, Rectangle에서 XYPoint 형식의 인스턴스 변수를 만나게 될 때, 컴파일러에게 그 클래스가 무엇인지 알려준다. setOrigin과 origin 메서드에서도 클래스 이름을 인수와 반환 값을 선언하는 데 사용한다. @class를 쓰는 대신 다음과 같이 헤더파일을 임포트하는 방법도 있다.

#import "XYPoint.h"

@class 지시어를 달면 컴파일러가 XYPoint.h파일 전체를 처리할 필요가 없어지기 때문에 좀더 효율적이다.  컴파일러는 그저 XYPoint가 클래스 이름이라는 것만 알고 있으면 된다. 만일 XYPoint 클래스의 메서드를 사용해야 한다면, 컴파일러에게 더 많은 정보가 필요하기 때문에 @class지시어로는 충분치 않다. 이때 컴파일러는 메서드가 인수를 얼마나 많이 받는지, 인수가 어떤 형인지, 어떤 값을 반환하는지에 대한 정보를 알아야 한다.


저작자 표시
신고

'Study > Objective-C' 카테고리의 다른 글

[Objective C: 예외처리]  (0) 2010.07.17
[Objective C: 동적바인딩과 id형]  (0) 2010.07.17
[Objective C: @class 지시어]  (0) 2010.07.16
[Objective C: 상속]  (0) 2010.07.16
[Objective C: self 키워드]  (0) 2010.07.16
[Objective C: static 키워드]  (0) 2010.07.16
Trackback 0 | Comment 0

강군v's Blog is powered by Daum & tistory

 

티스토리 툴바