옵젝시 클래스

개요

객체 지향에 있어 가장 기본인 클래스.

옵젝시에서의 클래스 정의, 상속, 클래스 인스턴스, 객체 소멸, 복사등을 알아보겠다.




클래스 정의


옵젝시에서 클래스를 정의할 때 컴파일러에 두가지 정보를 제공해야한다.

첫번째는 interface로 클래스 이름, 부모클래스, 인스턴스 변수의 정보, 클래스 메소드의 선언을 담고 있다.

두번째는 implementation으로 클래스 메소드를 구현한 코드이다.

#import <Foundation/Foundation.h>

@class Band;
@class Guitar;

@interface Rockstar: NSObject
{
    NSString *name;
    Band *band;
    Guitar *guitar;
}

- (void) sing;
- (void) playGuitar;
- (void) damage:(float) value;

@end

컴파일러는 클래스의 수퍼클래스에 대한 정보를 그냥 얻을 수 없기에 클래스가 들어있는 헤더파일을 import해야한다.

클래스 안에서 다른 클래스를 사용하고 싶다면 @class 지시자를 이용하면 된다.

Rockstar는 Band와 Guitar 타입의 변수를 가지고 있지만 헤더파일을 import하지 않는다.

그 대신 @class 지시자를 이용해 전방선언을 한다. 헤더파일을 import할 수도 있지만 @class를 사용하는게 더 좋다.

@class 지시자를 이용하면 의존성을 줄여 컴파일 시간을 단축시킬 수 있다.

band클래스 안에 Rockstar *guitarist;라는 변수를 가져 서로가 서로의 변수를 가지고 있다면 컴파일될 수가 없다. 이럴 때에도 @class를 사용한다.

구현부는 implementation이라고 부르며 @implementation으로 시작해 @end로 끝난다.

기본적으로 interface와 implementation은 다른 파일로 관리한다.

같은 파일로 관리하는 경우는 도우미 클래스가 다른 클래스의 내부에서만 사용할 때이다.

이 때 도우미 클래스를 같은 파일에 구현하여 그 클래스를 사용하는 파일에 import하면 된다.

모든 옵젝시 클래스의 root 클래스는 NSObject이다.

NSObject는 메모리 관리같은 오브젝트에 필요한 기본적인 메소드를 가지고 있어 runtime과 잘 동작하도록한다.

다른언어에서의 상속이나 추상클래스 같은 개념도 사용할 수 있다.

세미 추상 클래스라는 것도 있다. 처음들어보는 개념인데 검색해도 잘 나오진 않는다. 이런게 있다정도만 알면될듯

세미 추상클래스는 추상클래스인데 일반 클래스처럼 인스턴스를 만들어 사용할 기능을 부여할 수 있는 클래스이다.