Download presentation
Presentation is loading. Please wait.
1
상속
2
1.상속 하위 클래스가 상위 클래스의 모든 멤버를 물려받는 것을 상속이라고 합니다.
상위 클래스를 super class 또는 base class라고 하며 하위 클래스를 sub class 또는 derived class 라고 합니다. 상속 방법 @interface 클래스이름: 상속하는 클래스 Objective-C는 단일 상속만 지원합니다. CocoaTouch에서는 NSObject 클래스가 최상위 클래스이며 모든 클래스는 이 클래스로부터 상속을 받아야만 합니다. 하위 클래스는 상위 클래스의 멤버를 다시 정의하지 않아도 있는 것으로 간주하며 자신의 멤버를 정의하고자 한다면 정의하고자 하는 내용을 기재하면 되고 정의할 내용이 없다면 블록만 연 후 닫아도 됩니다. 상속 시 상위 클래스와 하위 클래스에 동일한 멤버 변수의 정의는 안됩니다. 상위 클래스의 메서드를 하위 클래스에서 다시 정의해서 사용하는 것은 가능한데 이를 메서드 오버라이딩(재정의)이라고 합니다.
3
예제 1.Command Line Tool 프로젝트 생성(InheritanceTest)
2.NSObject로 부터 상속받는 Cocoa Touch Class 생성(Test) 3.Test.h 파일 작성 #import <Foundation/Foundation.h> @interface Test : NSObject @property int val; @end 4.Test.m 파일 작성 #import "Test.h" @implementation Test @synthesize val;
4
5.main.m 파일 작성 #import <Foundation/Foundation.h>
#import "Test.h" int main (int argc, const char * argv[]) { @autoreleasepool Test * obj = [[Test alloc] init]; [obj description]); } return 0;
5
2.self 클래스 내에서 현재 객체를 가리키는 숨겨진 포인터
Objective–C 는 멤버 메서드를 클래스 내부에서 호출하더라도 리시버가 반드시 있어야 합니다. self.프로퍼티 와 self->멤버변수 또는 멤버변수를 혼동하면 안됩니다. self.프로퍼티는 getter나 setter를 호출하는 것이므로 지정된 특성에 따라 동작 클래스 내에서 self는 자신의 클래스 객체와 자신의 주소를 저장하고 있습니다. 메서드로서의 self는 자신의 클래스 타입과 id를 문자열로 리턴합니다.
6
예제 1.앞의 예제 수정 2.Test.h 파일 수정 #import <Foundation/Foundation.h>
@interface Test : NSObject @property int val; @property (nonatomic, retain) NSNumber * num; -(void)disp; @end
7
3.Test.m 파일 수정 4.main.m 파일 수정 #import "Test.h" @implementation Test
@synthesize val; @synthesize num; -(void)disp { int val = 10; val:%d", val); val:%d", self->val); retain:%d",[num retainCount]); num = [[NSNumber alloc]initWithInteger:1000]; self.num = [[NSNumber alloc]initWithInteger:100]; } @end 4.main.m 파일 수정 #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) @autoreleasepool id obj = [[Test alloc] init]; [obj disp]; [obj description]); return 0;
8
3.super super는 상위 클래스 객체를 가리키는 예약어입니다.
상위 클래스에 있는 메서드를 하위 클래스에서 재정의 하는 것을 method overriding(재정의) 이라고 합니다. Overriding 하는 경우 특정한 메서드들은 상위 클래스의 메서드를 호출해야만 하는 경우가 있습니다. 프레임워크(SDK)에서는 상위 클래스의 메서드를 재정의할 때 상위 클래스의 메서드를 호출하고 추가로 코드를 작성하는 경우가 많습니다.
9
예제 1.앞의 예제 수정 2.Test.m 파일에 추가 -(NSString *)description {
오버라이딩"); return [NSString }
10
4.다형성과 동적 바인딩 오버라이딩을 하는 이유는 Framework 클래스를 이용하는 경우에는 기능을 보강하기 위해서 이고 직접 만든 클래스인 경우에는 다형성을 구현하기 위한 것입니다. 다형성은 동일한 메시지에 대하여 서로 다르게 반응하는 성질입니다. 다형성이 구현되기 위해서는 프로그래밍 언어가 동적 바인딩을 지원해야 합니다. 동적바인딩이란 객체가 컴파일 시에 자신의 타입을 결정하지 않고 실행(메모리 할당)시에 자신의 타입을 결정하는 것입니다. 선언이 될 때 사용된 타입은 무시하고 메모리를 할당받을 때 어떤 타입으로 할당받았는냐에 따라 동작하는 것입니다. 객체 지향 언어에서 상위 클래스 타입으로 선언된 변수에는 하위 클래스 타입의 객체를 대입할 수 있습니다.
11
예제
12
1.앞의 예제 수정 2.Test.m 파일에 추가 3.main.m 파일의 main 메서드 수정 -(void)dealloc {
[num release]; [super dealloc]; } 3.main.m 파일의 main 메서드 수정 #import <Foundation/Foundation.h> #import "Test.h" int main (int argc, const char * argv[]) @autoreleasepool id obj = [[Test alloc] init]; [obj disp]; 클래스의 description"); [obj description]); [obj release]; obj = nil; obj = [[NSObject alloc]init]; 클래스의 description"); return 0;
13
5.정적 타이핑과 동적 타이핑 참조형 변수를 선언할 때 클래스 타입을 명시하는 것을 정적 타이핑이라고 합니다.
참조형 변수를 선언할 때 클래스 타입을 명시하는 것을 정적 타이핑이라고 합니다. 동적 타이핑이란 참조형 변수를 선언할 때는 id 타입으로 선언한 후 메모리 할당을 받을 때 변수의 참조 타입을 결정하는 것을 의미합니다. Objective-C에서는 정적 타이핑과 동적 타이핑을 모두 지원합니다. 동적 타이핑을 사용하면 하나의 변수에 모든 클래스 타입의 객체를 대입할 수 있으므로 프로그램을 작성하는데 있어서 매우 편리합니다. 정적 타이핑은 프로그램의 가독성을 높여주고 에러를 효율적으로 찾을 수 있습니다. 정적 타이핑을 사용하는 경우 컴파일 시 선언할 때 사용한 클래스의 멤버가 아닌 멤버를 호출하려는 문장을 만나면 컴파일 시 오류나 경고를 발생 시키기 때문에 오류를 찾는 것이 실행 단계에서 런타임 오류를 찾는 것보다 수월합니다.
14
6.클래스 객체 Objective-C에서는 클래스도 하나의 객체를 생성합니다.
클래스를 정의하는데 필요한 정보를 객체를 생성해서 보관하게 됩니다. 정보로는 클래스 이름이나 상위 클래스의 이름 및 멤버 변수, 메서드의 이름과 리턴 타입 및 매개변수 및 내용 등이 있습니다. 클래스도 독자적인 변수와 메서드를 가지고 있으며 static이라는 예약어를 이용해서 생성합니다. 클래스 객체는 Class라는 데이터 타입으로 정의되어 있으며 NSObject 클래스에는 class 라는 메서드가 정의되어 있어서 클래스 객체를 리턴해줍니다. description을 호출하면 일반 클래스의 객체인 경우는 클래스 이름과 id를 문자열로 리턴하고 NSCoding을 conform 클래스의 객체는 파일에 저장되는 내용을 문자열로 리턴합니다.
15
1)static 메서드 메서드를 선언할 때 –는 멤버 메서드의 선언을 의미하며 이 메서드는 객체가 사용하며 +는 클래스 메서드를 의미하며 클래스 객체가 사용합니다. 특정 객체에 속할 필요가 없는 메서드나 객체 생성없이 호출가능한 메서드를 (생성자 역할을 수행하는 메서드나 연결 및 연결 해제에 관련된 메서드)위해 사용합니다. 클래스 메서드에서는 멤버 변수의 사용은 안되며 static 변수나 지역 변수만 사용이 가능합니다. 2)static 변수 static이라는 키워드를 이용해서 클래스 객체를 통해 접근이 가능한 변수를 만들 수 있습니다. 서로 다른 파일에 구현되어 있는 경우에는 클래스 메서드로 static 변수에 접근하도록 정의하고 이를 호출하는 방법으로 사용해야 합니다.
16
예제
17
1.앞의 예제 수정 2.Test.h 파일 수정 3.Test.m 파일 수정
#import <Foundation/Foundation.h> @interface Test : NSObject @property int val; -(void)disp; +(void)print; @end 3.Test.m 파일 수정 #import "Test.h" @implementation Test @synthesize val; -(void)disp { 메서드"); val); } +(void)print 메서드"); //아래 문장은 경고 - 쓰레기 값이 출력됩니다. val);
18
4.main.m 파일의 main 메서드 수정 #import <Foundation/Foundation.h>
#import "Test.h" int main (int argc, const char * argv[]) { @autoreleasepool Test * obj = [[Test alloc] init]; obj.val = 100; //아래 문장은 경고 - 런타임 에러 //[Test disp]; [obj disp]; [Test print]; //[obj print]; } return 0;
19
예제
20
1.Command Line Tool 프로젝트 생성(SequenceTest)
2.NSObject로 부터 상속받는 Cocoa Touch Class 생성(Test) 3.Test.h 파일 작성 #import <Foundation/Foundation.h> @interface Test: NSObject { int number; } -(id)init; -(void)disp; @end 4.Test.m 파일 작성 #import "Test.h" static int sequence= 0; @implementation Test - (id)init self = [super init]; if(self) number = ++sequence; return self; - (void)disp %d number: %d", sequence, number);
21
5.main.m 파일 작성 #import <Foundation/Foundation.h>
#import "Test.h" int main (int argc, const char * argv[]) { @autoreleasepool Test *obj1, *obj2; obj1 = [[Test alloc]init]; [obj1 disp]; obj2 = [[Test alloc]init]; [obj2 disp]; } return 0;
22
7.nil 포인터 다른 언어의 null과 유사하며 0의 값을 갖는 포인터 이 포인터는 어떠한 메시지 처리도 할 수 없습니다.
23
예제
24
1.앞의 예제에서 main.m 파일 수정 #import <Foundation/Foundation.h>
#import "Test.h" int main (int argc, const char * argv[]) { @autoreleasepool Test *obj1, *obj2; obj1 = [[Test alloc]init]; [obj1 disp]; obj1); [obj1 dealloc]; //obj1 = nil; obj2 = [[Test alloc]init]; [obj2 disp]; obj2); } return 0;
25
8.지역 메서드 선언부에는 없고 구현부에만 존재하는 메서드 선언부에는 없지만 메서드를 외부에서 호출할 수 있습니다.
이 경우에는 메서드의 구현 부분이 호출하는 부분보다 먼저 나와야 합니다. 호출하는 부분이 먼저 오게되면 에러는 아니지만 경고를 출력하게 될 것입니다. Cocoa Touch 프로그래밍에서는 이 메서드는 인터페이스 빌더에서는 보이지 않습니다.
26
예제 #import <Foundation/Foundation.h> @interface Temp: NSObject{
int val; } -(void)Disp; -(id)init:(int) a; @end @implementation Temp -(id)init:(int) a { val = a; return self; -(int)value { return val; -(void)Disp{ [self value]); int main(void){ id obj; obj=[[Temp alloc] init:10]; [obj Disp]; value]); return 0;
Similar presentations