Objective C에서 Method 앞 +,- 뭘까?
IDA 또는 실제 Obejctive C 코딩을 하다보면 메소드 앞에 + 또는 - 를 쓸 때가 있다.
그게 뭔지 알아보자....
@interface Kitty : NSOject
@property NSString *name;
@property NSString *color;
- (void)setName:(NSString*)name;
+ (int)getAge:(int)currentYear age(int):age
검색해보면 바로 나오겠지만 -는 인스턴스 메소드를 정의할 때, +는 클래스 메소드를 정의할 때 사용한다.
그러면 인스턴스 메소드와 클래스 메소드가 뭘까.... 물론 프로그래밍 수업을 열심히 들은 사람은 알겠지만...
나는 몰랐기 때문에 내용을 찾아서 작성했다.
Instance Method란 ?
말 그대로 인스턴스를 만들어서 사용해야 하는 Method를 뜻한다. 만약에 멍멍이라는 클래스를 만들고 짖는 함수를 만든다고 했을 때, 짖는다 라는 함수에 접근하는 인스턴스에 따라서 다른 짖기를 가져온다. 각 멍멍이들의 특징이 인스턴스 프로퍼티(개 종류, 크기, 짖는 소리 등등 만들기에 따라 다름)에 적용되어 있고 이것들을 사용할 때 인스턴스 메소드를 사용한다고 보면 된다.
Class Method란 ?
Instance Method란 ?
클래스 메소드란 인스턴스 메소드와 다르게 객체를 초기화 하거나 만들지 않고 클래스 자체로 사용이 가능한 함수의 형태를 뜻한다.
위에 예시를 보면 이름이나 색깔 이런것들은 인스턴스 프로퍼티로 객체를 생성하고 사용자가 Get, Set 등을 하기 위한 용도로 볼 수 있다.
그런데 나이같은 경우는 해당 년도에서 고정이다. 현재년도 - 태어난년도로 계산하면 끝이 때문이다. 변하지 않는다고 생각하면 편한다. 뭐 (물론 고양이마다 나이를 다르게 설정해서 넣어준다면 Instance Method로 만들어주겠지만;;)
흠.. 이렇게 말하면 너무 어려운가...?
그러니까 말그대로 클래스 메소드는 보통 변하지 않는 값을 가져올 때 사용한다. Color 클래스를 만든다고 할때 색깔이라던가 그런거 사용할 때 쓰나보다. 뭐 실제로 나도 코딩을 해본건 아니라서 나중에 테스트 해봐야겠다.
아래는 다른 예시를 추가한다.
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end