1.메시지 문법
C++ : Reveiver.MessageWithOptionAandOptionB(23,23,23);
Objective-C : [Reveiver Message:23 withOptionA:23 WithOptionB:23]; //이름을 중간에 띄어서 처처리한다 생각하면될 듯
2. nil값을 가지는 클래스 인스턴스의 메소드 호출하지
Rectangle *anObject = nil;
[anObject description];
nil는 다른 언어의 'NULL' 과 동일한 개념
위 예제는 nil 값을 가지는 anObject 인스턴스의 description 메소드를 호출한다. 다른 언어에서는 당연히 런타임 에러가 발생하지만 Objective-C는 에러로 처리하지 않고 정상적 동작으로 인식하고 처리한다. 이값은 경우 메소드 호출 결과로 nil을 돌려준다
3. Objective-C의 데이터 타입
3-1. id 타입
id anObject;
id 는 Objective-C의 기본 데이터 타입이다. 이건 모든 종류의 객체들을 다룰수 있다.
참고로 일반적으로 id의 형태로 사용되고 id* 와 같은 형태로는 잘 사용되지 않는다.
3-2. BOOL 데이터타입
BOOL flag = YES;
if(flag ==YES){
flag = NO;
}
3-3. 함수 포인터 데이터 타입
Objective-C 는 C의 함수 포인터와 유사한 개념으로 'SEL' 이라는 데이터 타입을 지원한다. 이것은 @selector 지시어와 임의의 메소드 이름을 사용하여 값을 설정한다.
이때 메소드 이름에 콜론도 포함되는 것을 일지 말아야한다.
//함수 선언
-(void)setWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(void)setCallback:(SEL)callback;
//함수 호출
SEL anObject = @selector(seWidth:height:);
[self setCallback:anObject];
[self setCallback:@selector(setWidth:height:)];
3-4 Objective-C의 클래스
3-4-1 클래스의 상속
-단일 클래스로부터의 상속 기능만 지원,
3-4-2 NSObject 클래스
-부모 클래스가 없는 루트 클래스인 NSObject는 Objective-C의 객체들을 위한 기본 프레임워크로, 객체 사이의 상호 작용을 정의한다.
그래서 이를 상속하는 클래스가 객체로 동작하게 하고, 런타임 시스템과 상호동작할수 있도록 해준다.
다른 클래스와 특별한 연관관계가 없는 클래스도 그것을 생성할 때는 반드시 NSObject를 상속해야한다.
클래스의 인스턴스들이 실행될 때 최소한 Objective-C의 객체로서 동작할 수 있어야 하기 때문에 클래스를 새로 설계할 떄 NSObject를 기본적으로 상속해야 함을 절대로 잊지말자. 만일 아무런 클래스도 상속하지 않는 독자적인 클래스를 만들게 되면 이 클래스는 Objective-C의 객체가 가져야 하는 기본적인 성질들을 가질 수 없게 된다.
3-4-3. 인스턴스 변수의 상속
한 클래스로부터 인스턴스를 만들면 , 그 인스턴스에는 해당 클래스에 정의되어 있는 인스턴스 변수는 물론 그 부모 클래스의 인스턴스 변수 그리고 또 부모의 부모 클래스의 인스턴스 변수까지, 최종적으로 루트 클래스의 인스턴스 변수까지 모두 포함된다.
3-4-4. 메소드의 상속
부모 클래스를 상속하는 자식 클래스는 부모 클래스뿐 아니라 최종적으로 루트 클래스에 이르기까지 상위에 있는 모든 클래스의 메소드들을 상속받아 사용할 수 있다. 즉 파운데이션 프레임워크 내의 한 클래스를 상속하면 해당 클래스 및 그 상위 클래스들이 가지고 있는 메소드들을 모두 사용할 수 있으며, 추가로 필요한 메소드만 선언하면된다.
3-4-5. 메소드 오버라이딩
메소드 오버라이딩(Overriding)이란 자식 클래스에서 부모 클래스의 메소드를 재정의해서 사용하는 것이다. (다른언어와 동일) 이를 통해 메소드의 동작을 완전히 재정의하거나 새로운 기능을 추가할수 있다.
아래의 코드는 자식 클래스에서 부모 클래스의 메소드(draw)를 오버라이딩하는 전형적인 예를 보여준다. 우선 부모 클래스의 메소드를 호출하여 원래 이메소드에 구현되어 있던 동작을 수행하고 이어서 새로운 기능을 수행하는 방식이다. 부모 클래스의 메소드를 호출할 때 super 지시어를 사용해야 한다는 점을 유의하자,.
-(void)draw{ //1.부모 클래스의 해당 메소드를 호출한다.
[super draw]; //2.새로운 기능을 추가한다.
}
단, Objective-C에서는 메소드 오버로딩(Overloading)은 지원하지 않음을 기억해두자
(오버로딩은 메소드의 이름은 같지만 입출력 값의 타입은 다르게 선언하는 것을 말한다.
3-4-6. 클래스의 생성
id myRectangle = [[Rectangle alloc] init];
alloc 메소드는 Rectangle 클래스의 인스턴스 변수들에 메모리를 할당하고 이를 리턴하게 된다.
그런데 이때 인스턴수들의 변수들을 모두 0의 값을 가지게 되므로 init 메소드를 호출하여 초기화를 수행해야함
실제로 모든 클래스는 메모리를 할당하고 초기화 하는 메소드를 적어도 하나 이상 가지고 있다. 파운데이션 프레임워크의 클래스들을 살펴보면 주로 사용하는 초기화 메소드의 이름 및 인자의 개수 등은 조금씩 다르지만 일반적으로 init으로 시작하는 이름의 초기화 메소드가 있음을 알수 있다.
3-4-7 클래스 타입
Rectangle *myRectangle = [[Rectangle alloc] init];
id idRectangle = myRectangle; // id 타입 변수에 저장가능
id는 Objective-C의 기본 데이터 타입이며, 어떠한 클래스도 이와 같은 방식으로 사용할 수 있다. 실제 프로그래밍에서 여러 클래스의 인스턴스를 사용하는 경우 이처럼 id 타입의 변수를 이용하는 것이 유용한 경우가 많다.
만약 Rectangle 의 부모가 Shape 라면 아래처럼도 가능한다.
Shape *myGraphic = myRectangle;
3-4-8. 타입 검사
-isKindOfclass & isMemberOfClass 는 NSObject 클래스를 상속하는 모든 클래스에서 이용할수 있다.
//딱 그 특정클래스의 인스턴스인지 알아내는 기능
if([anObject isMemberOfClass:[Shape class]]{ …}
//특정클래스 또는 그 하위에 속한 클래스인지 알아내는 기능
if([anObject isKindOfclass:[Shape class]]){…}
3-4-9. 동일성 검사
//두 인스턴스가 실제로 같은 메모리 주소를 가리키는 동일 인스턴스인지를 검사 같은 경우 참
if(anobject1 ==anObject2){ ..}
//메모리주소가 아닌 실제 두 객체가 가지고 있는 인스턴스 내의 값들이 같은지 검사하고 같은 경우 참
if([anObject1 isEaual:anObject2]){..}
3-4-10.메소드 검사
respondsToSelector : 메소드는 (NSObject에서 사용 가능) 인자로 받는 메소드가 자신을 호출하고 있는 객체내에서 정의되어 있는지 여부를 검사하는 역할을 수행
id anObject =nil;
…
if([anObject respondsToSelector:@selector(draw)])
{..}
anObject 인스턴스 안에 draw 메소드를 가지고 있는지 파악
4.클래스 선언 및 정의하기
4-1.헤더 파일과 소스파일 분리
.h 파일: 헤더파일
.m 파일: 소스파일
.mm 파일: C++소스를 포함하거나 참조하고 있는 파일
4-2.헤더 파일
#import<Foundation/Foundation.h>
#import "Shape.h" //(1)
@class Circle; //(2)
@interface Rectangle : Shape { //(3)
NSString *name; //(4)
NSInteger width;
NSInteger height;
}
-(NSString *)description; //(5)
-(void)setName:(NSString*)myName;
-(void)setWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(void)draw;
'Objective_C' 카테고리의 다른 글
[Objective-C] 기초배우기 (4) (0) | 2020.04.14 |
---|---|
[Objective-C] 기초배우기 (3) (0) | 2020.04.14 |
[Objective-C] 기초배우기 (2) (0) | 2020.04.14 |