클래스 메소드, 인스턴스 메소드 선언 비교

Objective-C 에서는 클래스 메소드와 인스턴스 메소드 두 가지로 메소드를 호출할 수 있다.
클래스 메소드는 리시버가 클래스인 메소드이고 인스턴스 메소드는 리시버가 객체인 메소드이다.
메소드 정의 시 +로 시작하는지 - 로 시작하는지로 구분할 수 있는데 코드로 살펴보자.

※ convertInchToCm 는  Inch값을 Cm 값으로 변환하는 클래스 메소드
※ convertCmToInch 는  Cm값을 Inch 값으로 변환하는 인스턴스 메소드

# ToolBox.h + (CGFloat)convertInchToCm:(CGFloat)inch; # 클래스 메소드 - (CGFloat)convertCmToInch:(CGFloat)cm; # 인스턴스 메소드 # ToolBox.m + (CGFloat)convertInchToCm:(CGFloat)inch{ # 클래스 메소드 return inch * 2.54; } - (CGFloat)convertCmToInch:(CGFloat)cm{ # 인스턴스 메소드 return cm / 2.54; }

여기까지는 + 와 - 차이 말고 별 차이가 없어 보인다.
그럼 이제 각각의 메소드를 호출해보자.

메소드 호출
# main.m NSLog(@"%.2lf", [ToolBox convertInchToCm:5]); # 클래스 메소드 실행 -> 12.70 NSLog(@"%.2lf", [ToolBox convertInchToCm:5]); # 인스턴스 메소드 실행 -> ERROR 발생 ToolBox *tool = [[ToolBox alloc] init]; # tool 객체 생성 NSLog(@"%.2lf", [tool convertInchToCm:5]); # 클래스 메소드 실행 -> ERROR 발생 NSLog(@"%.2lf", [tool convertCmToInch:5]); # 인스턴스 메소드 실행 -> 1.97

보다시피 직접 메소드를 호출해보면 클래스 메소드와 인스턴스 메소드의 차이가 확연히 드러난다.

클래스 메소드는 인스턴스 생성을 하지 않고 클래스명을 그대로 사용해서 메소드를 호출하고
인스턴스 메소드는 반드시 인스턴스 생성을 해서 그 주소값(메모리의 Heap 영역)을 가지고 있는 변수를 통해 메소드에 접근해야 한다.

그리고 우리는 이미 클래스 메소드와 인스턴스 메소드를 알고 썼든 모르고 썼든 항상 사용하고 있다.

ToolBox *tool = [[ToolBox alloc] init]; # 여기서 [ToolBox alloc] 만 보자. [ToolBox convertInchToCm:5] 와 뭔가 비슷하지 않나? 그렇다. alloc 은 NSObject에 선언되어 있는 클래스 메소드이고 init는 [ToolBox alloc] 에 의해 할당된 인스턴스가 가지는 인스턴스 메소드이다.
접근 가능한 데이터 영역의 차이점

클래스 메소드는 인스턴스를 생성하지 않고 사용하는 메소드라고 했다.
따라서 인스턴스가 생성된 후 런타임 시점에 메모리의 heap 영역에 할당되는 @property 데이터는 클래스 메소드에서 사용할 수 없고, 컴파일 시점에 존재 여부나 값을 확인할 수 있는 전역변수, 클래스 메소드에 사용되는 매개변수 등만을 사용할 수 있다.

코드로 다시 보자

# @property propertyNumber; 는 ToolBox.h 에 선언되어 있다. # ToolBox.m const NSInteger globalNumber = 5; + (CGFloat)convertInchToCm:(CGFloat)inch{ return inch * 2.54 * globalNumber; } - (CGFloat)convertCmToInch:(CGFloat)cm{ return cm / 2.54 * self.propertyNumber * globalNumber; }

이처럼 클래스 메소드는 전역변수 값은 활용 가능하지만 self.propertyNumber 와 같이
인스턴스가 만들어지고 값이 할당되어 접근해야 하는 @property 값은 사용할 수 없다.


다만, 아래 코드와 같이 self, super 등을 통한 클래스 메소드 접근은 가능하고
상속받은 클래스 메소드에 대한 오버라이딩도 가능하다.

+ (NSInteger)callSelf:(NSInteger)count{ if (count >= 3){ return [self callSelf:count-1]; } else{ return 0; } }


https://m.blog.naver.com/PostView.nhn?blogId=itperson&logNo=220822532771&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

'IT' 카테고리의 다른 글

IE11 에서 DOM7009 에러  (0) 2019.05.22
지금 배울 만한 9가지 최첨단 프로그래밍  (0) 2019.05.16
모든 콘텐츠 표시 (보안 콘텐츠만 표시됩니다.)  (0) 2019.05.14
Object c Pdf  (0) 2018.01.04
jquery 새로고침(reload)  (0) 2018.01.03
Objective C pdf  (0) 2017.12.28
윈도우10 설치시 필요한 프로그램  (0) 2017.06.19

+ Recent posts