두번째날 공부 정리 시작.
강의 자료로 만들 수도 있으니 정성스럽게 작성 중..
-----------------------------------------------------------------------------------------
클래스 자동 생성 접근자 메서드
@interface HelloClass : NSObject
{
int abc;
int def;
}
@property int abc, def;
-(void) print;
@end
@implemetation HelloClass
@synthesize abc, def;
-(void) print
{
NSLog(@"abc=%i def=%i", abc, def);
}
@end
일 경우에 main함수에서 abc와 def에 대한 권한이 약간 더 폭넓게 작동한다.
예를 들어 main 함수 내에서 abc와 def 변수를 불러올때나 변수에 어떤 값을 대입할 경우
HelloClass * hoho = [[HelloClass alloc] init];
hoho.abc = 30;
hoho.def = 24;
int helloAbc = hoho.abc;
NSLog(@"helloAbc = %i", helloAbc);
[hoho print];
와 같이 . 신텍스로 불러오거나 대입하기가 가능해진다. 2.0 버전부터 가능한 부분이라고 한다.
클래스 메서드에 여러인자 넘겨주기
@interface부분에 한줄 더 넣어준다.
-(void) setNumbers : (int) n andDEF : (int) k;
@implementation 부분에 함수 정의 추가
-(void) setNumbers : (int) n andDEF : (int) k
{
abc = n;
def = k;
}
이렇게 하면 메인 함수에서 사용할 때
[hoho setNumber : 35 andDEF : 93];
이렇게 객체에 숫자 두 개 이상을 인자로 넘겨줄 수 있다.
지역변수
-(float) minusThree : (int) n
{
float testNum = n;
testNum -= 3.0f;
return testNum;
}
이렇게 쓰면 float형 testNum이라는 변수는 지역변수. 중괄호 끝날 때 제거된다..
self & super
[self minusThree];
클래스 내부에서 쓰면 자기자신의 메소드를 호출해서 실행시킨다.
[super dealloc];
클래스가 상속받은 상위 클래스에서 나 자신의 메모리를 해제해주는 코드인데,
이렇게 자기자신에 대한 해제 전에는 필히 자신이 지닌 객체들이나 포인터들을 다 해제하고 행하도록 해야한다.
예를 들어 내가 rect라는 객체를 함께 가지고 있다면,
if (rect) {
[rect release];
}
[super dealloc];
release & dealloc
release 는 소유자가 있는 상태의 객체 메모리 해제를 의미하며
dealloc은 소유자가 유실되는 메모리 해제를 의미한다.
즉 dealloc은 자기자신의 메모리 해제 예를 들어 [super dealloc] 과 같은 형식으로만 쓰인다.
구글링하다 얻은 정보이기에 완전한 정보는 아니라고 생각함.
타(혹은 자신)클래스의 객체 (포인터) 넘겨받기
현재 보고 있는 책에서는 객체는 무조건 포인터로 선언하는데 이유는 모르겠고 원래 그런 듯 함.
-(Fraction * ) add : (Fraction * ) b
{
Fraction * c = [[Fraction alloc] init];
[c setNumber1 : (num1+b.num1) andNumber2 : (num2+b.num2)];
return c;
}
-(void) change : (Fraction * ) b
{
[b setNumber1 : 2 andNumber2 : 15];
}
@try { ... } @catch { ... }
예외처리
@try {
[hello tryError];
} catch (NSException * exeption) {
NSLog(@"error %@ | %@", [exception name], [exception reason]);
}
extern
이건 좀 모호해서 일단 두기로 함. 사용방식이 C나 C++과 좀 많이 다른 것 같아 이상하게 느껴짐..
초기에 extern int a; 다른곳에서 int a = 10; 이렇게 두번의 선언 과정이면 extern 구문을 가진 헤더를 포함한
파일 어디서든 a를 쓸 수 있을 것 같은데, int a; 하고서는 사용부에서 extern int a; a = 35; 뭐 이렇게 지속적으로
extern을 작성해준다. 이거 아주 이상하다.
#define
#define TRUE 1
상수나
#define PI2 3.141592654f/180.0f
산술표현이 들어가는 경우나
#define PLUS(x, y) (x+y)
매크로 정의를 하거나
#define TOUPPER (x)
typedef
typedef int Hihi;
Hihi abc = 30;
데이터형에 다른 이름을 부여하는 방법
-----------------------------------------------------------------------------------------
카테고리
카테고리는 현존하는 클래스에 전혀 영향을 안끼치고도 새로운 함수를 정의하고 싶을 때 사용한다.
예를 들어 붕어빵 만드는 클래스를 만들었고 호두를 넣는 옵션 메쏘드를 추가하고 싶지만
이걸 직접 수정하기 어려운 상황일 때 따로 메쏘드를 모아서 정의하는게 가능하다
#import <Foundation/Foundation.h>
@interface BoongeoPang : NSObject
{
int Angko;
int Milkaru;
int Hodu;
}
@property int Angko, Milkaru, Hodu;
-(void) addAngko: (int) n andAddMilkaru: (int) k;
-(void) print;
@end
라는 클래스가 있고, 사용 범위가 넓어 이걸 직접 건드리기가 어려운 경우
#import "BoongeoPang.h"
@interface BoongeoPang (Options)
-(void) addHodu : (int) hodu;
@end
@implementation BoongeoPang (Options)
-(void) addHodu : (int) hodu
{
Hodu = hodu;
}
@end
이런 식의 구성이 가능하다.
사용할 때는 그냥
[a addHodu : 35];
이렇게만 하면 된다.
-----------------------------------------------------------------------------------------
구조체
struct date
{
int year;
int month;
int day;
};
struct date dayUpdate (struct date hihi)
{
struct date hoho;
hoho.year = hihi.year;
hoho.month = hihi.month;
hoho.day = hihi.day;
}
함수 구현 부분은 조금 다르지만 대체로 C의 문법을 따르고 있음.
배열
int hihi[100];
int hoho[] = {0,1,2,3,4,5,6,7,8,9};
BabyPang * bbpang[100];
포인터
int bcd = 10;
int * abc;
int x;
abc = &bcd;
이러면 abc와 bcd가 같은 주소를 참조하는 것.
x = *abc;
이러면 x가 abc의 값을 참조하는 것. (대입하는 것)
포인터는 주소값을 참조하기 때문에 배열과 혼용되어 쓰이기도 한다.
예를 들어
int sumArray(int h[], int counts)
{
int * k, sum;
int * arrEnd = h + counts;
for (k=h; k<arrEnd; k++) {
sum += (*k);
}
NSLog(@"sum = %i", sum);
}
int main(int argc, char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int sumArray(int array[], int n);
int values[10] = {1,2,3,4,5,6,7,8,9,10};
sumArray(values, 10);
[pool drain];
return 0;
}
함수를 선언해 사용할 때는 사용하는 메인부에서 함수를 재 선언해준다는 점 잊지말도록 하자.
오브젝티브씨만의 특징인 듯 하다.
-----------------------------------------------------------------------------------------