[3일차]nil 포인터(3-2) Objective-C2010. 5. 10. 22:01
1. 참조되는 대상이 없는 포인터
2. 메모리 할당에 실패했거나 메모리 할당을 아직 하지 않은 경우의 포인터
3. 0 이라고 하는 경우도 있음
4. 다른 언어의 null과 유사
다른 점은 다른 언어는 null이 멤버를 참조하면 컴파일시 에러지만 objective-C는 실행 시 에러 (예외로 처리)
웬만한 참조형 변수를 사용할때에는
if ( obj !=nil)
{
[obj Disp];
} else {
obj = [Test alloc];
[obj Disp];
}
헤더 파일 import 대신 사용할 수 있는 구문
@class 클래스명;
인스턴스의 멤버 변수접근
1. objective-C 에서는 기본적으로 인스턴스의 멤버변수에 접근할 수가 없습니다. - 정보은닉 (infomation Hiding)
2. 예외적으로 클래석 구현부내에서 Self를 이용한 접근은 허용하지만 큰 의미가 없으며 클래스의 인스턴스가 메서드의
매개변수인 경우에도 가능 (-> 연산자 이용)
@interface Test : NSObject
{
int a ;
}
-(void)Disp;
@end
Test * obj = [Test alloc];
NSLog (@"%d\n",obj->a); (X)
[obj Disp]; (O)
------------------------------------------------------------
#import <Foundation/Foundation.h>
@interface Test : NSObject
{@public
int n;
}
-(id)init:(int)a;
------------------------
** public를 사용하지 않을 경우
-(int)n; --> get method
-(void)setN:(int)a; --> set method
------------------------
@end
@implementation Test
-(id)init:(int)a;
{
n = a;
}
------------------------
** public를 사용하지 않을 경우
-(int)n {return n;}
-(void)setN:(int)a
{
n = a;
}
------------------------
@end
@interface TempTest : NSObject
{
int value;
}
-(id)init:(int)a;
-(void)disp:(Test*)obj;
@end
@implementation TempTest
-(id)init:(int)a;
{
value = a;
}
-(void)disp:(Test*)obj;
{
NSLog(@"%d\n",value);
NSLog(@"%d\n",obj->n);
}
@end
int main(void)
{
Test *Ins = [[Test alloc]init:10];
TempTest *var = [[TempTest alloc]init:20];
[var disp :Ins];
system("pause");
return 0;
}
------------------------------------------------------------
접근 지정자
@private : 클래스 내에서만 접근가능
@protected : 클래스 내부에서 접근가능하고 상속한 경우 접근가능 (생략하면 Protected)
@public : 클래스와 인스턴스 모두 접근 가능
클래스는 무조건 public (내포 클래스 지정불가능)
클래스 안에 클래스 지정하는것이 불가능.
Property(속성)
지역 메서드
1. 선언부(Interface)에는 없고 구현부(implementation)에만 있는 메서드
Static(클래스)
1. 클래스가 사용할 수 있는 또는 인스턴스들이 공유할 수 있는 멤버
1) Static 메서드 (클래스 메서드)
가) 인스턴스 생성없이 사용할 수 있는 메서드
나) - 대신에 +를 붙이면 Static 메서드
다) 인스턴스가 호출 할 수 없다.
라) 인스턴스 변수 사용 불가
마) 굉장히 자주사용하거나 Static 변수 선언시에 사용.
바) 코드,전역 영역 / 스텍 / Heap
2. Static 변수
가) 동일한 클래스 타입으로 만들어진 인스턴스들이 공유할 목적으로 사용하는 변수
나) 인스턴스가 호출해야 합니다. (Self 같은 애들이 사용)
다) 일련번호를 만들때 적절히 사용
라) 선언하고자할때 static를 기재하면 되고 구현부에서 생성하자마자 초기화해서 사용
마)
------------------------------------------------------------
#import <Foundation/Foundation.h>
@interface Test : NSObject
-(void)Disp; -> 인스턴스 메서드
+(void)Print; -> 클래스 메서드
@end
@implementation Test
-(void)Disp
{
NSLog(@"Instance 멤버");
}
+(void)Print
{
NSLog(@"Class 멤버");
}
@end
int main(void)
{
[Test Print];
Test *obj = [[Test alloc] init];
[Test Print];
[obj Disp];
system("pause");
return 0;
}
------------------------------------------------------------
// 일련번호 만들기
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
int bunho;
}
- (id) init;
- (void) Disp;
@end
@implementation Test : NSObject
static int n = 1; // test 타입은 전부 공유
-(id) init
{
self -> bunho = n++; return self;
}
-(void)Disp
{
NSLog(@"%d\n",bunho);
}
@end
int main(void)
{
Test *obj1 = [[Test alloc] init];
Test *obj2 = [[Test alloc] init];
[obj1 Disp]; //1
[obj2 Disp]; //2
system("pause");
return 0;
}