티스토리 툴바

 

 

Recent Comment»

Recent Trackback»

Archive»

« 2012/05 »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Objective-C start5

프로그래밍/Objective-C | 2010/06/07 12:58 | Posted by MaengGeum

/*

숫자 객체

기본 데이터형 ( int, long...) 이것들은 객체가 아니다 

그러므로  메시지 같은 것을 보내는 일은 불가능하다. 이러한 형의 값을 NSArray 저장 

위해서는 객체여야 한다..

그러기 위해 기본 숫자 데이터 형을 저장하려면 NSNumber 클레스를 사용하여 데이터 

형들에게서 객체를 생성 있다.

 

<NSArray> 

1. 객체만을 추가할 있다.

2. nil 넣을 없다. nil 배열의 끝을 알린다.

3. 변경이 불가능 하다.

 

자주 사용되는 NSArray 메서드

+(id) arrayWithObjects: obj1, obj2, .. nil
=> obj1, obj2 가지고 있는 배열을 생성한다.


-(BOOL) containsObject: obj
=> 배열에 obj 있는지 확인한다(isEqual:메서드를 사용한다.)

-(NSUInteger) count
=> 배열에 담긴 객체의 개수를 반환한다.

-(NSUInteger) indexOfObject : obj
=> obj 담은첫번째 객체의 인덱스 번호를 반환한다.

-(id) objectAtIndex : i
=> i번째 객체를 반환한다

-(void) makeObjectsPerform Selector: (SEL) selector

=> selector 가리키는 메시지를 배열에 있는 모든 객체에게 보낸다.

-(NSArray*) sortedArrayUsing Selector:(SEL) selector

=> selector 지정한 비교 메서드를 이용해 배열을 정렬한다.

 

-(BOOL) writeToFile: path atomically:(BOOL) flag

=> 지정한 파일로 배열을 쓴다. flag YES 임시 파일을 먼저 생성한다.


-(id) initWithArray:(NSArray*) array

=> array 배열로 초기화 한다.


-(id) initWithObjects : (id)firstObj, ...

=> firstObj,.. 받아 초기화 한다.


-(id) lastObject

=> 마지막 객체를 반환 한다.


-(BOOL) isEqualToArray: (NSArray *)otherArray

=> (NSArray *)otherArray 비교하여 일치여부를 반환.


-(NSSting*) componentsJoinedByString:(NSString *)separator 

=> NSSting 경우 요소 사이에 separator 붙여서 NSString 형으로 리턴한다.

 */

#import <Foundation/Foundation.h>

#import <Foundation/NSAutoreleasePool.h>

#import <Foundation/NSValue.h>


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

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSNumber *myNumber, *myfloatNumber, *myIntNumber;

NSInteger myInt;

myIntNumber = [NSNumber numberWithInteger : 100];

myInt = [myIntNumber integerValue];

NSLog(@"%li", (long) myInt);

myNumber = [NSNumber numberWithLong: 0xabcdef];

NSLog(@"%lx", [myNumber longValue]);

myNumber = [NSNumber numberWithChar:'X'];

NSLog(@"%c", [myNumber charValue]);

myfloatNumber = [NSNumber numberWithFloat:100.02];

NSLog(@"%g", [myfloatNumber floatValue]);


myNumber = [NSNumber numberWithDouble:12345e+15];

NSLog(@"%lg", [myNumber doubleValue]);

//잘못된 접근.

// NSLog("@%i", [myNumber integerValue]);

if ([myIntNumber isEqualToNumber: myfloatNumber] == YES) {

NSLog(@"Number are equal");

}

else {

NSLog(@"Numbers are not equal");

}

if ([myIntNumber compare: myNumber] == NSOrderedAscending) {

NSLog(@"First number is less than second");

}


int a = 5;

int b = 6;

int c = 7;

//NSArray에 담기 위한 객체 생성.

NSNumber *nNum1, *nNum2, *nNum3;

nNum1 = [NSNumber numberWithInteger: a];

nNum2 = [NSNumber numberWithInteger: b];

nNum3 = [NSNumber numberWithInteger: c];

NSArray * arr = [NSArray arrayWithObjects: nNum1, nNum2, nNum3, nil];

int i = 0;

for (; i < [arr count]; i++)

{

NSLog(@"%li", [[arr objectAtIndex: i] integerValue]);

}

    [pool drain];

    return 0;

}









저작자 표시 비영리 변경 금지

'프로그래밍 > Objective-C' 카테고리의 다른 글

Objective-C start5  (0) 2010/06/07
Objective-C start4  (0) 2010/05/25
Objective-C start3  (0) 2010/05/23
Objective-C start2  (0) 2010/05/18
Objective-C start1  (0) 2010/05/16

Objective-C start4

프로그래밍/Objective-C | 2010/05/25 23:54 | Posted by MaengGeum
 프로토콜 - 클래스 사이에서 공유되는 메서드 목록이다.
                 특정이름과 관련된 메서드 모음을 정의하는 방법을 제공한다.

C# 의 인터페이스와 비슷한 개념같다..

프로토콜 정의

@protocol 프로토콜명

@required

@optional

 ..메서드선언

@end


메서드 선언부에 @required, @optional 섹션이 있다

@required 반드시 구현해야한다.

@optional 반드시 구현할 필요는 없다.


선언을 안할경우 기본으로 @required로 선언이 된다.


클레스에서 프로토콜을 받아들일려면.

@interface 클래스명 : NSObject <프로토콜명>

이라고 선언해준다.


간단한 예로..


#import <Foundation/Foundation.h>


//protoco Math 선언.


@protocol Math

//기본 @required 선언.

//반드시 구현해야 한다.

-(void) Add : (int) nNum;

-(void) Mul : (int) nNum;

@end


//////////////////////////////////////////////////////////////////////


@interface Fraction : NSObject <Math> //Math Protocol 추가한다.

{

int nNumber;

}

@property int nNumber;

+(Fraction*) Create: (int) nNum;

-(void) print;

//protocol 메서드를 선언한다.

-(void) Add : (int) nNum;

-(void) Mul : (int) nNum;

@end



//////////////    Fraction.m  //////////////////

@implementation Fraction

@synthesize nNumber;

+(Fraction*)Create :(int) nNum;

{

Fraction* tmp = [[Fraction alloc] init];  //생성

tmp.nNumber = nNum;                       //초기화

return tmp;

}


-(void)print

{

NSLog(@"nNumber => %i", nNumber);

}


//protocol 메서드 구현.

-(void) Add : (int) nNum

{

nNumber += nNum;

}


-(void) Mul : (int) nNum

{

nNumber -= nNum; 

}

@end




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

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    

    Fraction * pFrac = [Fraction Create : 4];

   

    //protocol 메서드     

    [pFrac Add:5];

    NSLog(@"Add 4 + 5\n");

    [pFrac print];


    [pFrac Mul:2];

    NSLog(@"Mul 9 - 2\n");

    [pFrac print];

    [pFrac release];

    [pool drain];

    return 0;

}


이런 식으로 사용한다.

저작자 표시 비영리 변경 금지

'프로그래밍 > Objective-C' 카테고리의 다른 글

Objective-C start5  (0) 2010/06/07
Objective-C start4  (0) 2010/05/25
Objective-C start3  (0) 2010/05/23
Objective-C start2  (0) 2010/05/18
Objective-C start1  (0) 2010/05/16

Objective-C start3

프로그래밍/Objective-C | 2010/05/23 01:19 | Posted by MaengGeum

기존의 클래스의 구조를 변경하지 않고 새로운 메서드를 추가하여 확장하려 할 때 
원본 소스의 접근하거나 서브클래스를 생성하지 않고
Objective-c 에서는 카테고리를 사용하여 기존 클래스의 기능을 확장 할 수 있다.

카테고리 선언은
@interface 클래스명 (카테고리명)

간단한 예제로 기존 Fraction 클레스에 Math 카테고리를 이용하여 덧셈, 뺄셈, 곱셈의 기능을 추가하였다.

///////////////   Fraction.h  /////////////////

#import <Foundation/Foundation.h>

@interface Fraction : NSObject {

int nNumber;

}

@property int nNumber;

+(Fraction*) Create: (int) nNum;

-(void) print;

@end


//////////////    Fraction.m  //////////////////

#import "Fraction.h"

@implementation Fraction

@synthesize nNumber;

+(Fraction*)Create :(int) nNum;

{

Fraction* tmp = [[Fraction alloc] init];  //생성

tmp.nNumber = nNum;                       //초기화

return tmp;

}

-(void)print

{

NSLog(@"nNumber => %i", nNumber);

}

@end


////////////   Math.h 카테고리 선언  ////////////////////

#import "Fraction.h

@interface Fraction  (Math)

                               //기능 추가

-(int) Add : (int) nNum;

-(Fraction*) mul : (int) nNum;

-(Fraction*) div : (Fraction*) pFrac;

@end


///////////     Math.m     /////////////////////

#import "Math.h"

@implementation Fraction (Math)

-(int) Add : (int) nNum

{

return nNumber + nNum; 

}

-(Fraction*) mul : (int) nNum

{

return [Fraction Create : (nNumber - nNum)]; 

}

-(Fraction*) div : (Fraction*) pFrac

{

pFrac.nNumber = (nNumber * pFrac.nNumber);

}

@end


//////////////   Main.m   //////////////////

#import <Foundation/Foundation.h>

#import "Fraction.h"

#import "Math.h"

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

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Fraction * pFrac = [Fraction Create : 4];

    int nAdd = [pFrac Add:5];       // 4 + 5

    NSLog(@"Add 4 + 5\n");

    NSLog(@"nNumber => %i", nAdd);

    Fraction *pMul = [pFrac mul: 2]; // 4 - 2

    NSLog(@"Mul 4 - 2\n");

    [pMul print];

    Fraction *pDiv = [pFrac div: [Fraction Create: 3]]; // 4*3

    NSLog(@"Div 4 * 3\n");

    [pDiv print];

     

    [pFrac release];

    [pMul release];

    [pDiv release];


    [pool drain];

    return 0;

}


주의 할점

1. 새 인스턴스 변수를 추가할 수는 없다.

  <추가를 해야한다면 서브클래스를 만들어야 한다.>


2. 메서드를 재정의 할 수는 있지만 메서드를 재정의 하면 원래 메서드에 접근 방법이 없어진다.

   꼭! 재정의를 해야한다면 원래 메서드의 기능을 추가하던지 서브클래스를 만들어서 사용하자.

   <NSObject에 새 메서드를 추가했다면 모든 클래스가 새 메서드를 상속 받게 된다.>


저작자 표시 비영리 변경 금지

'프로그래밍 > Objective-C' 카테고리의 다른 글

Objective-C start5  (0) 2010/06/07
Objective-C start4  (0) 2010/05/25
Objective-C start3  (0) 2010/05/23
Objective-C start2  (0) 2010/05/18
Objective-C start1  (0) 2010/05/16