개요
객체 지향에 있어 가장 기본인 클래스.
옵젝시에서의 클래스 정의, 상속, 클래스 인스턴스, 객체 소멸, 복사등을 알아보겠다.
클래스 정의
옵젝시에서 클래스를 정의할 때 컴파일러에 두가지 정보를 제공해야한다.
첫번째는 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과 잘 동작하도록한다.
다른언어에서의 상속이나 추상클래스 같은 개념도 사용할 수 있다.
세미 추상 클래스라는 것도 있다. 처음들어보는 개념인데 검색해도 잘 나오진 않는다. 이런게 있다정도만 알면될듯
세미 추상클래스는 추상클래스인데 일반 클래스처럼 인스턴스를 만들어 사용할 기능을 부여할 수 있는 클래스이다.