본문 바로가기
보안 및 개발/MOBILE

[iOS] Objective-C

by CH@3M 2019. 10. 7.

objective-c

스몰톡 언어의 객체지향적인 부분 + C언어

월등한 유연성

 

클래스 객체, 인스턴스 객체 (스몰톡에서는 클래스도 객체이기 때문에 클래스도 객체로 볼수 있음)

 

@마크를 붙인 예약어를 사용하여 언어를 확장시킴

C++과는 다르게 단일 상속만 허용함, 클래스 이름은 유일해야하며, 내포클래스를 만들 수 없음

 

@interface : 클래스를 선언한 부분

@implementation : 미리 선언된 클래스를 정의한 부분

@end : 선언과 정의가 끝났음을 의미

 

@interface Sample : Object

 

@interface 바로 뒤에는 선언할 클래스의 이름이 오게 되고 ":" 다음에 수퍼클래스가 명시됨

{ ... } 사이에 있는 변수들이 인스턴스 변수가 됨 (C++의 멤버변수와 같음)

 

멤버변수들을 선언하고 그 아래에 메소드들을 정의함

메소드 정의에, +, - 기호는 클래스 메소드(+)인지 인스턴스 메소드(-)인지를 명시하는 부분

 

클래스와 인스턴스를 엄격하게 구분해야함!

클래스 메소드는 클래스에서만 호출이 가능, 인스턴스 메소드는 인스턴스에서만 호출 가능

 

인스턴스를 얻어내려면 

id obj = [Sample alloc];

이런 식으로 사용

 

클래스 메소드 alloc을 호출하고 돌려주는 값이 obj가 됨

여기서 obj가 클래스의 인스턴스가 됨

 

인스턴스가 클래스 정의에서 명시한 데이터에 해당하는 부분을 가지게 되고, 인스턴스 메소드를 이용하여 이것들을 다루게 됨

 

obj의 데이터 타입인 id는 인스턴스를 의미하는 데이터 타입, 클래스에 대한 포인터 값을 가진다

 

[, ] 는 클래스와 인스턴스의 메소드를 호출할 때 사용됨

 

[obj method: arg1 : arg2] 와 같이 : 를 구분자로 사용

 

super는 자신의 수퍼클래스를 의미, self는 자기 자신을 의미

즉, 메소드 호출 시 [self init]; 이런식으로 쓰면 되고, 수퍼 클래스의 경우 [super init]; 라고 사용

 

단순한 추상 클래스를 사용할 땐, 메소드 정의에 단순히 { return; } 라고 사용하면 됨

 

클래스 선언 시 인스턴스 변수가 반드시 있을 필요 없음, 단순히 메소드 선언만 있어도 됨

 


 

Dynamic binding

객체의 메소드를 호출할 때, 그 메소드가 뭔지 정적으로 컴파일 시에 결정할 수 없음을 의미함

성능 < 유연성이 커짐

 

Dynamic typing 

데이터 타입이 어떤 클래스인지 컴파일 시에 알 수 없음

인스턴스가 어떤 클래스의 인스턴스인지 실행하고 확인하기 전에는 알 수 없음

 

Dynamic loading

클래스를 실행시간 중에 새로 넣을 수 있음 (일종의 플러그인)

 


 

objective-c에서는 아예 메소드 콜이 동적으로 이루어짐

실행시간 중에 호출할 함수의 주소가 결정되는 것에다가

함수 이름 자체를 실행시간 중에 결정할 수 있음

셀렉터를 이용한 기술임

 

구조 자체가 메소드를 동적으로 할당하는 구조이므로 더 강력한 기능을 가질 수 있는데, 이것이 category라는 기능

 

반응형

'보안 및 개발 > MOBILE' 카테고리의 다른 글

[iOS] 파일시스템 구조  (0) 2019.10.07
[iOS] Frida 사용자함수 hooking  (0) 2019.10.07
[iOS] Frida server 설치 에러  (0) 2019.10.07
[iOS] frida hooking  (0) 2019.10.07
[iOS] frida 환경 구성  (0) 2019.10.07