'Objective C'에 해당되는 글 13건

  1. 2009.10.22 Objective C - new Project
  2. 2008.11.06 Objective C 의 카테고리
  3. 2008.11.06 Objective C 용어
  4. 2008.11.06 Objective C !! Self 와 _cmd!!
  5. 2008.11.05 Objective C - Selector
  6. 2008.11.05 Objective C 의 상속
  7. 2008.11.05 Objective C 의 상속
  8. 2008.10.30 Objective C
  9. 2008.10.22 Objective C Method
  10. 2008.10.22 Objective C Method
2009.10.22 10:00
Objectvie C - new Project
요거 요거
application 에서 Core Foundation Tool 으로 프로젝트 생성한 다음에
Console창 띄워서 코드 입력 뒤에 빌드.

너무 오랜만에 한지라 기억도 안났었네..

이제 어서 끝내고 아이폰 개발 착수 하자!
신고
Posted by 우엉 여왕님!! ghostkyow
2008.11.06 20:07
Category란?!
이미 있는 클래스에 Method를 추가 할수 있게 해주는 것! 이것이 개념!
뭐 별 대수롭지 않게 보일수도 있지만, C++과는 다르다. 이유는 무엇 일까? C++에서 class를 정의한 헤더 파일과 오브젝트 파일을 받았을때 추가 하는 방법은 상속을 받은뒤 추가를 하는 것이다. 하지만 Objective C는  C++과는 다르다. 어떻게 다르냐! Objective C는 카테고리라는 것이 존재 한다. 그래서 상속을 받아서 추가 하지 않고 카테고리를 추가 함으로써 클래스를 재생성 하지 않고도 추가할수 있는 효과를 내게 된다.

자 예를 들어보자 ! 예는...
어제 한 Geomatry 오브젝트와 그것을 상속받은 Rectangle! Rectangle에 카테고리로 Variable 과 Method를 추가 할 것이다.

@interface Rectangle  (CategoryRect)

int m_newVariable;

-(void)CategoryRectDisplay;

@end


@implementation Rectangle (CategoryRect)

-(void)CategoryRectDisplay

{

m_newVariable = 100;

printf("This is Category method and New Variable = %d\n", m_newVariable);

}

@end


위와 같이 하게 되면 성공이다. 자 main문에서 메소드에 메시지 전달은 아래와 같이 하면 된다.


Rectangle *rc;

rc = [[Rectangle alloc]init];


[rc SetRectLeft:0 Right:0 Top:10 Bottom:10];

[rc CategoryRectDisplay];


위 처럼 메인문을 작성 하게 되면 결과 값은 아래와 같다.


left = 0 top = 10

right = 0 bottom = 10;

This is Category method and New Variable = 100


와 같이 나올 것이다. 자 이렇게 카테고리 사용법에 대한 예이다.



(-참고-display는 아래와 같이 바뀌어져 있어야된다)

-(void)display

{

printf("%s\n",name);

printf("left = %d top = %d\nright = %d bottom = %d\n", m_left, m_top, m_right, m_bottom);

}

신고
Posted by 우엉 여왕님!! ghostkyow
2008.11.06 19:56
Simular school 과 SmallTalk school은 같은 것에 대해서 명명하는 것이 좀 틀리다.
정리 해보면

   C++(Simular) Objective C(Small Talk) 
class 의 변수  member variable property 
class 의 함수  member function  method 
parent class  parent class  super class 
class 자신  this  self 

위 처럼 명명 한다고 한다.
신고
Posted by 우엉 여왕님!! ghostkyow
2008.11.06 19:50
Objective -C 에서의 class안에 Method에는 숨겨진 인자가 2개 있다!? 이게 무엇 일까?!
그 2개는 바로!! self!!! 그리고 _cmd!! 이 2개는 무엇일까!?

self... 이것은 C++의 this 와 같다!! 자 호출 하는 방법의 예는 앞글의 예제에서 메소드를 하나 더 만들어서 사용해보도록 하겠다!
Rectangle 이라는 오브젝트의 메소드를 수정해보도록 하겠다.


-(void)SetRectLeft: (int)left Right: (int)right Top: (int)top Bottom: (int)bottom;


위와 같이 메소드를 하나 추가 한다음에 메소드의 내용은 아래와 같이 정의 한다


-(void)SetRectLeft: (int)left Right: (int)right Top: (int)top Bottom: (int)bottom

{

m_left = left;

m_right = right;

m_top = top;

m_bottom = bottom;

[self display];

}


자 여기서 self는 C++의 this와 같이 자기 자신이라고 했다.

위 처럼 값을 셋팅 한다음에 메소드를 호출 하면 오브젝트 안에 display를 호출 하게 된다.



그리고 _cmd... _cmd 는 무엇일까? _cmd 는 method 이다! 왜 method일까...?

메소드가 호출 될때! 사용된 selector를 _cmd가 가지고 있다고 보면 간단할 것이다.

앞에 selector 는 method를 선택 하고 있는 것. selector를 _cmd가 가지고 있다고 보면 된다고 위에서 말했듯이 selector = method -> _cmd = method 이렇게 보면 된다.

결론!! _cmd는 method 를 가지고 있다!! 예제는... 딱히 보여줄만한 예제가 없다...

신고
Posted by 우엉 여왕님!! ghostkyow
2008.11.05 18:44
Selector란?
Objective C 는 매우 다이나믹하다(이젠 지겹다...)
그래서 메시지를 받게 될 객체의 type이 여러개일 수도 있다. 그중 그 메시지에 해당 하는 메소드는 각 객체마다 다 다르게 구현되어 있을수도 있다. 그래서 Objective C 는 런 타임중에 구별을 해줘야 적절하게 메시지가 전달이 된다. 그래서 비슷하지만 다른 메소드들을 선택 할수 있게 해주는 개념이 바로 
Selector! 이다. (C/C++ 에서 함수 포인터를 이용해서 상황에 맞는 함수를 호출 하는 것과 비슷)



Selector 사용법
사용법의 대한 예를 대겠다.
앞 글에서 정의한 클래스와 클래스 안의 메소드로 예를 들어 보겠다.

SEL setName;

setName = @selector(setName);


위와 같다. selector 는 특정한 타입인 SEL로 정의되어있고 setName을 @selector로 가르킨다.
그리고 사용 방법은

[myRect performSelector:selName withObject:"IsSeletor"];


위와 같다.

이것이 Objective C에서 selector  이다.
신고
Posted by 우엉 여왕님!! ghostkyow
2008.11.05 18:25


#import <Cocoa/Cocoa.h>


@interface Geometry : NSObject

{

@public

char name[20];

}

-(void)setName : (char*)pName;

-(void)display;

@end


@implementation Geometry

-(void)setName : (char*)pName

{

strcpy(name, pName);

}

-(void)display

{

printf("%s", name);

}

@end


@interface Rectangle : Geometry

{

@public

int left;

int top;

int right;

int bottom;

}

-(void)display;

@end


@implementation Rectangle

-(void)display

{

printf("%s\n",name);

printf("%d %d %d %d\n", left, top, right, bottom);

}


@end



int main(int argc, char *argv[])

{

Geometry *myRect;

myRect = [[Rectangle alloc]init];

[myRect setName:"Test"];

[myRect display];

    return 0;

}


신고
Posted by 우엉 여왕님!! ghostkyow
2008.11.05 18:24


상속

Objective-C에서의 상속은 C++과 거의 비슷 하다.

접근 지정자도 @ 를 빼면 C++과 같다 아래의 2개의 클래스로 간단하게 상속의 대한 예를 들어보겠다. 지금 Rectangle의 슈퍼클래스는 Geometry 이다.

그리고 Geometry에 있는 display 메소드를 Rectangle 에서 재정의 하는 그런 상태이다.

물론 Rectangle에서 display 메소드를 재정의 하지 않아도 된다. 하지 않을때는 C++과 마찬가지로 Geometry의 display 메소드를 호출 하겠지만 말이다.


@interface Geometry : NSObject

{

@public

char name[20];

}

-(void)setName : (char*)pName;

-(void)display;

@end


@implementation Geometry

-(void)setName : (char*)pName

{

strcpy(name, pName);

}

-(void)display

{

printf("%s", name);

}

@end


@interface Rectangle : Geometry

{

@public

int left;

int top;

int right;

int bottom;

}

-(void)display;

@end


@implementation Rectangle

-(void)display

{

printf("%s\n",name);

printf("%d %d %d %d\n", left, top, right, bottom);

}


@end


위 2개의 클래스로 상속의 예를 들어보겠다.


Geometry *myRect;

myRect = [[Rectangle alloc]init];

[myRect setName:"Test"];

[myRect display];


위 와 같다. C++과 같은 개념이다.

모든 메소드와 변수는 상속을 받을수 있다는 것이다.

myRect 의 타입은 Geometry 타입이다. 근데 동적 메모리 할당은 Rectangle로 했다.

(alloc는 Rectangle 인스턴스의 변수들을 위해 동적 메모리 할당 하는것)

그리고 여기서 만들어진 객체는 쓰기위해서는 완전히 초기화를 해야되는데, 초기화 하려면 init 메소드를 호출 해야된다.(alloc init 는 기본적으로 있는거 같다.)


신고
Posted by 우엉 여왕님!! ghostkyow
2008.10.30 22:20
Objective C 의 간단한 용어!!

C++ 에서 부모 클래스를 Objective C 에서는 Superclass 라고 한다!! 신기하지 않나
그리고 C++에서 자식 클래스는 SubClass라고 한다. 난 처음에 Super Class에서 상속을 받는다길래
모든 클래스의 최 상위 부모 클래스인줄 알았는데 그냥 Object의 상위 클래스를 SuperClass라 칭한다.

NJObject 클래스 ! 이것은 root클래스라고도 한다.
즉, superclass를 갖지 않는 클래스라고 보면되고, 이 클래스로부터 상속을 하면 runtime 시스템에서 지원을 받는 Object즉 자식 클래스를 만들수 있다.

그리고 상속에 관해서는, C++과 다를것이 없는거 같다.
SubClass가 SuperClass에서 상속을 받게 된다면 variable , method 둘다 상속을 받게 되고,
overriding 도 C++과 마찬가지로 할 수 있다. 그리고 superclass로 부터 상속 받은 method를 다른식으로 바꾸고 싶다면, 같은 이름을 가지게 해서 method를 만들어서  invoke가 가능하게 할수 있다. 
뭐 그렇다고 물론 self와 super를 이용해서 오버라이딩된 method를 그때그때 상황의 맞게 super클래스에 있는 것과 self클래스에 있는 메소드를 상황에 맞게 할수 있다. 참 신기하다 ㅋㅋ

단! subclass는 superclass의 인스턴스 변수를 오버라이딩 할수가 없다고 한다. Objective C에서의 오버라이딩은 method에 한한다고 한다.


Static Typing !!!!!!!!!!!!
내가 앞에 글에서 예제 소스라던가 그런 소스들을 올려놓아서 보았을지 모르겠지만,
id 로 선언을 하고 할당을 받지만 그게 아닌
className *myObjec;  처럼 C++에서 처럼 선언이 가능하다.
또 superclass 타입으로도 정의가 가능 하다고 한다.
C++로 따지면 부모 클래스 타입으로 선언 하고 메모리 할당은 자식 클래스 형으로 할당 하는것을 말한다.
신고
Posted by 우엉 여왕님!! ghostkyow
2008.10.22 21:38

간단하게 Method에 메시지를 전달 하는것과, 인자를 가진 Method를 선언하고 정의한것을 예 로든 소스이다.


#import <Cocoa/Cocoa.h>

#import <stdio.h>


@interface ClassName : NSObject

{

@public

int iInstanceVariable;

float fInstanceVariable;

}

-(void)display;

-(void)setVariable: (int)iIVariable;

-(void)setVariable: (int)iIVariable fVariable: (float)fIVariable;

@end


@implementation ClassName

-(void)display

{

printf("%d %f\n", iInstanceVariable, fInstanceVariable);

}

-(void)setVariable: (int)iIvariable

{

iInstanceVariable = iIvariable;

}

-(void)setVariable: (int)iIVariable fVariable: (float)fIVariable;

{

iInstanceVariable = iIVariable;

fInstanceVariable = fIVariable;

}

@end


int main(int argc, char *argv[])

{

id clsN;

clsN = [ClassName new];

[clsN setVariable:10 fVariable:10.5];

[clsN display];

[clsN setVariable:20];

[clsN display];

return 0;

}


신고
Posted by 우엉 여왕님!! ghostkyow
2008.10.22 21:33
Objective C 의 Method 호출방법(메시지 전달방법)
Objective C는 함수를 호출 하는 개념이 아니라.
메시지를 전달 하는 개념이다.
 Objective C에서 메시지를 전달하는 방법의 예를 들어 보겠다.
ex)

id clsN;

clsN = [ClassName new];

[clsN display];

(display라는 Method 는 ClassName이 가진 void 형 Method이다.)


위와 같이 Object를 만든뒤에

[object method]와 같다 이것은, C++스타일로 보자면 object.method 나 object->method와 같다.


Objective C 의 인자가 있는 Method 생성 방법.

ex)

@interface ClassName : NSObject

{

@public

int iInstanceVariable;

float fInstanceVariable;

}

-(void)display;

-(void)setVariable: (int)iIVariable;

-(void)setVariable: (int)iIVariable fVariable: (float)fIVariable;

@end


위와 같이 Object를 선언 한 뒤 아래 처럼 Object의 Method를 정의한다.


@implementation ClassName

-(void)display

{

printf("%d %f\n", iInstanceVariable, fInstanceVariable);

}

-(void)setVariable: (int)iIvariable

{

iInstanceVariable = iIvariable;

}

-(void)setVariable: (int)iIVariable fVariable: (float)fIVariable;

{

iInstanceVariable = iIVariable;

fInstanceVariable = fIVariable;

}

@end


Objective C의 인자가 있는 Method에 메시지를 전달 하는 방법

ex)

위 만든 Object의 있는 Method에 메시지를 전달 하는 예


id clsN;

clsN = [ClassName new];

[clsN setVariable:10 fVariable:10.5];

[clsN display];

[clsN setVariable:20];

[clsN display];



Objective C 의 다형성

Objective C의 다형성은 C++ 의 다형성과는 다르다.

하지만 C++과 마찬가지로 Variable을 상속 받고 Method도 상속 받을수 있고, Overriding도 할수 있다. 하지만 Objective C는 operator overloading은 지원을 하지 않는다.

Objective C의 다형성에 관해 아직 자세하게 이해하고 있는 것이 아니어서 이정도로 쓰고,

나중에 좀 더 보완해야겠다.


Dynamic Binding

Objective C 에서는 Object간의 메시지를 보낼수 있다. 이때 Object와 해당 메시지는 언제 연결이 되는 때는 runtime 때 연결이 된다. 이유는 보통  Objective C 프로그래밍을 하게 되면 Object는 id 의 형태로 받고 그것에 대해 메시지를 보내기 때문이다. 그래서 컴파일 시에는 그 Object가 어떤 형태인지 자세히 알수가 없어서 runtime 시에 연결이 되는 것이다. 동적 바인딩은 여러가지 좋지만 컴파일시 에러 메시지가 뜨지 않기 떄문에 runtime때 해결하기 어려운 오류가 발생 할수도 있다는 단점이 있다.


신고
Posted by 우엉 여왕님!! ghostkyow

티스토리 툴바