필요한것만 살짝 정리
메시징 문법
[객체 메소드];
ex ) [Receiver Message];
이와 같은 방식으로 객체에게 메시지를 보내게 된다.
메시지를 보낸다는 것은 객체의 메소드를 호출하는 것을 의미.
인자 넘겨주기
1개
[Receiver Message:23];
2개 이상
[Receiver Message:23 withOptionA:23 withOptionB:23];
이때 메소드의 이름은 Message:withOptionA:withOptionB: 가 된다.
->
->다른 객체지향 느낌 표현 Receiver.MessageWithOptionAandOptionB(23, 23, 23);
NULL == nil
Rectangle *anObject = nil;
[anObject description];
nil 값을 가지는 anObject 인스턴스 객체의 description메소드 호출.
다른언어에서는 런타임 에러가 발생하나, Objective-C에서는 에러로 처리하지 않고 정상적인 동작으로 인식함.
Objective-C의 기본 데이터 타입은 id = void
BOOL flag = YES or NO
함수포인터 데이터 타입
Objective-C는 C의 함수 포인터와 유사한 개념으로 'SEL'이라는 데이터 타입을 지원한다.
이것은 @selector지시어와 임의의 메소드 이름을 사용하여 값을 설정한다.
-(void)setWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(void)setCallBack:(SEL)callBack;
SEL anObject = @selector(setWidth:height:);
[self setCallBack:anObject];
[self setCallBack:@selector(setWidth:height)];
상속관계 존재함
다른 클래스의 인스턴스 변수들과 메소드들을 그대로 가져와 사용할 수 있음을 의미한다.
NSObject 클래스
Objective-C 객체들의 최상위 클래스. 모든 객체들이 NSObject클래스를 상속함.
클래스의 인스턴스들이 실행될 때 최소한 Objective-C의 객체로서 동작할 수 있어야 하기 때문.
메소드 오버라이딩
자식 클래스에서 부모 클래스의 메소드를 재정의해서 사용하는 것.
이를 통해 메소드의 동작을 완전히 재정의하거나 새로운 기능 추가 가능.
-(void)draw{
// 1. 부모 클래스의 해당 메소드 호출
[super draw];
// 2. 새로운 기능 추가
. . .
}
Objective-C 에선 메소드 오버로딩을 지원하지 않는다.
(메소도의 이름을 같으나 입출력 값은 다르게 선언하는 것)
클래스의 생성
id myRectangle = [[Rectangle alloc] init];
alloc 메소드는 Rectangle 클래스의 인스턴스 변수들에 메모리를 할당하고 이를 리턴한다.
이때 인스턴스 변수들을은 모두 0의 값을 가지게 되므로 init 메소드를 호출하여 초기화를 수행 한다.
Rectangle *myRectangle = [[Rectangle alloc] init];
타입검사
if( [ anObject isMemberOfClass:[Shape class]]){
...
}
if( [ anObject isKindOfClass:[Shape class]]){
...
}
NSObject 클래스를 상속하는 모든 클래스에서 이용할 수 있는 메소드.
isMemberOfClass 특정 클래스의 인스턴스인지 알아냄.
isKindOfClass 특정 클래스또는 그 하위 클래스의 인스턴스인지 알아내는 기능.
동일성 검사
타입검사가 하나의 인스턴스를 검사하는 것이라면, 동일성 검사는 서로 다른 두 인스턴스의 관계를 검사.
if( anObject1 == anObject2){
...
}
// 두 인스턴스가 실제로 같은 메모리 주소를 가르키는 동일 인스턴스 인지 검사,
if( anObject1 isEqual:anObject2){
}
// 메모리 주소가 아닌 실제 두 객체가 가지고 있는 인스턴스 내의 값들이 같은지 검사.
Objective-C 에서는 클래스를 작성할 대 일반적으로 인터페이스 부분(헤더)과 구현 부분(소스)을 별도의
파일로 나누어 작성한다. 헤더와 소스 파일의 이름은 내부에 정의된 클래스의 이름으로 정해지며,
헤더파일은 .h 소스 파일은 .m 확장자를 사용한다.
기본적으로 헤더 파일은 다음과 같은 형태로 구성된다.
#import <Foundation/Foundation.h>
#import “Shape.h” //상속하고자 하는 부모 클래스 지정부분, 일반적으로 #include가 아닌 #import
지시어를 사용하는데 비슷하지만, 다른 점은 중복선언을 자동으로 처리해준다.
@class Circle; //@class는 해당 클래스를 import하지 않고 선언만 해서 사용할 수 있도록 함.
해당 클래스의 타입만 이용할 수 있고 변수,메소드를 이용하려면 import 해야함.
@interface Rectangle : Shape { //클래스를 선언하는 부분. @interface부터 @end까지.
NSStirng *name; 클래스의 이름뒤에 부모 클래스 이름 지정.
NSInteger width; 상속 불필요시 NSObject를 지정한다.
NSInteger height;
}
@end
소스 파일은 기본적으로 다음과 같은 형태를 따른다.
#import “Rectangle.h” // 클래스를 선언하는 헤더 파일을 포함하는 부분
@implementation Rectangle\ // 클래스의 구현이 시작되는 부분. @implementation 부터 시작
해서 @end에서 끝난다
. . .
}
- (void)setName(NSString *)myName{
. . .
}
width = myWidth;
Hbeight = myHeight;
}
[super draw]; // 부모 클래스의 draw 메소드 호출
. . .
}
@end
'Software > iOS & Objective-C' 카테고리의 다른 글
아이폰에서 iOS 앱 테스트 하기 (0) | 2013.04.02 |
---|---|
property의 역사를 통한 고찰 (0) | 2013.02.25 |
멀티스레딩 <NSThread> (0) | 2011.12.30 |
메모리 관리 <Objective-C?> (0) | 2011.12.29 |
Xcode & Objective-C - 기초개념 1. (0) | 2011.09.19 |