u Enabling Static Behavior
n Objective-C 동적 특징
- 오브젝트용 메모리는 새인스턴스를 작성하는 클래스메소드에 의해 실행시 할당받음
- 오브젝트는 동적으로 형정의 됨. 컴파일시 자동으로 정의된 id형에서 프로그램이 실핼될때까지
정해지지않음
- 오브젝트 지향 프로그래밍에 높은 유난성을 제공
- 컴파일러가 id형의 변수의 형체크가 불가능
- 클래스명을 정적으로 형정의하거나 형정의 시점을 실행시에서 컴파일시로 되돌릴수있게 필요없는
기능을 오프시킬수 있음
n 오버해드 검출 툴
Shark, Instruments
n 정적 형정의
Rectangle *thisObject; |
- 정적으로 형정의된 오브젝트는 id로 정의된 오브젝트와 동일한 내부구조를 가지게 됨
- 실행시의 오브젝트 처리방법에도 영향없음 id로 동적정의된 오브젝트와 같이 동적 바인딩 됨
Rectangle *thisObject = [[Square alloc] init]; |
- 위의 경우 thisObject는 Rectangle의 인스턴스변부뿐아니라 Square의 인스턴스변수도 가지게 됨
(Square는 Rectangle의 서브클래스)
[thisObject display]; |
- 메세지 역시 실행시 동적 바인드 됨.
- 위의 메세지의 경우 Rectangle슈퍼클래스의 메소드가 아니라 Square 클래스에 정의 된 메소드를 실행함
n 정적 형정의의 특징
- 정적형정의는 조건에 따라 컴파일시 형체크를 할수있음
- 정적 형정의에 의해 같은 이름의 메소드는 같은 반환형과 인수를 가질 필요가 있다는 규칙을 무시할수있음
- 구조체 포인터연산자를 사해서 오브젝트안의 인스턴스변수에 직접 엑세스가 가능함
n 형체크
- 정적으로 형정의된 리시버에 메세지를 보내면 컴파일러는 리시버가 응답가능한지를 체크
응답 불가능한 경우에는 경고발생
- 정적으로 형정의한 오브젝트를 변수에 할당하면 컴파일러가 호환가능한지를 체크
호환불가능한 경우에는 경고 발생
Shape *aShape; Rectangle *aRect; aRect = [[Rectangle alloc] init]; aShape = aRect; |
Rectangle이 Shape를 계승하고 있다는 가정하에 위의 경우 호환성 통과
반대의 경우 호환성 경고
- 대입 연산자의 한쪽이 id형인 경우 호환성 체크 안함
n Return and Argument Types
- 반환형과 인자형의 경우 동적 바인딩때문에 같은 이름의 메소드의 경우 일치시킬 필요가 있음
- 메세지를 정적으로 형정의한 오브젝트에 송신하는 경우 컴파일러가 오브젝트를 인식하기 때문에
반환형과 인자형을 일치시킬 필요가 없음
n Inherited Class에의 형정의
- 인스턴스는 자신의 클래스나 계승받은 클래스를 정적으로 재정의 할수 있음
Shape *myRectangle = [[Rectangle alloc] init]; |
- 위의 경우 컴파일러는 Rectangle을 Shape로 처리함
BOOL solid = [myRectangle isFilled]; |
- isFilled메소드가 Rectangle의 메소드라고 가정 위의 메세지는 에러발생
[myRectangle display]; |
- display메소드가 Shape에서 인식가능한 경우 Rectangle에서의 오버라이드 여부에 관계없이
정상 컴파일
'아이폰개발' 카테고리의 다른 글
[아이폰개발] hpple 사용예 (0) | 2011.01.28 |
---|---|
[아이폰개발] 오브젝트별 참고사이트 (0) | 2011.01.21 |
[아이폰개발] Objective-C 7.Fast Enumeration (0) | 2011.01.12 |
[아이폰개발] Objective-C JSON 통신 모듈 (0) | 2010.12.29 |
[아이폰개발] Objective-C 6.Associative References (0) | 2010.12.20 |