Objective C 2.0 Study Day #2

Posted at 2010/09/20 16:08// Posted in 공부방
두번째날 공부 정리 시작.
강의 자료로 만들 수도 있으니 정성스럽게 작성 중..

-----------------------------------------------------------------------------------------

클래스 자동 생성 접근자 메서드
@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;
}
함수를 선언해 사용할 때는 사용하는 메인부에서 함수를 재 선언해준다는 점 잊지말도록 하자.
오브젝티브씨만의 특징인 듯 하다.


-----------------------------------------------------------------------------------------
2010/09/20 16:08 2010/09/20 16:08

이 글에는 트랙백을 보낼 수 없습니다

1 ... 9 10 11 12 13 14 15 16 17 ... 28