달력

10

« 2024/10 »

  • 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
2010. 5. 18. 21:11

[9일차-2]배열 Objective-C2010. 5. 18. 21:11

배열
1. 배열 객체의 종류
    NSArray : 수정이 불가능한 배열 => 확장과 삽입 삭제등이 불가능
    - 자기가 할당받은 공간을 늘이거나 줄이거나 불가능
    - 인스턴스 변수만 생성가능     
    - 타입이 달라도 생성가능
    NSMutableArray : 수정이 가능한 배열 => 확장이 가능

   전부 NSArray.h에 정의되어 있음

2. NSArray의 생성과 요소접근
   1)생성
      NSArray * 배열명 = [NSArray arrayWithObjects:인스턴스 나열,..... nil];
      -(id)initWithArray:(NSArray*)anArray
   2)C 배열에 복사
      -(void)getObjects:(id*)aBuffer;
   3)요소접근
      [배열명 count]:요소개수 리턴
      [배열이름 objectAtIndex:인덱스]
      [배열이름 indexOfObject:(id)anObject]
       -(id)lastObject

ex)배열의 생성과 접근
--------------------------------------------------------
#import <foundation/foundation.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>
#import <foundation/NSValue.h>

int main (int argc, char * argv[])
{
    int i;
    NSNumber * intNumber = [NSNumber numberWithInteger:100];
    NSArray * month = [NSArray arrayWithObjects:@"Janurary",@"Feburary",@"March",@"April",@"May",
                      @"June",@"July",@"August",@"September",@"October",@"November",@"December",intNumber,nil];
                                                                                             // nil은 저장안됨
    NSLog(@"한글         영문");
    NSLog(@"=====        ====");
    for (i = 0;i < [month count]; ++i) // 배열의 요소개수를 리턴
        NSLog(@" %2i월       %@", i+1, [month objectAtIndex:i]);
/*
    for (id T in month)
        NSLog(@"%2i월  %@",i+1,T);
    // 다른 언어의 foreach구문
*/    
    system("pause");
    return 0;
}
/*
for (변수 in 배열)
==> 배열의 모든 요소를 변수에 대입해서 사용
==> dev-C 에서는 인식하지 않음
*/
--------------------------------------------------------
Objective-C에는 기본적으로 다차원 배열이 없음
NSArray를 C스타일의 배열 형태로 변경
--------------------------------------------------------
#import <foundation/NSobject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>

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

    NSArray * month = [NSArray arrayWithObjects:@"Janurary",@"Feburary",@"March",@"April",@"May",
                      @"June",@"July",@"August",@"September",@"October",@"November",@"December",nil];
                      // month : NSString * []
    NSString** cArray = malloc(sizeOf(NSString *) * [month count]); // NSString * cArray[12];
    //                         NSString * 타입의 메모리 * 12
    int i;
    for(i=0; i<[month count]; ++i)
    {
       cArray[i] = [month objectAtIndex:i];
    }
   
    free(cArray);
    system("pause");
    return 0 ;
}
--------------------------------------------------------
3. NSArray의 기타 메서드

-(BOOL)isEqualToArray:(id)anObject
  : 배열의 요소 개수와 모든 멤버가 동일하면 YES 아니면 No를 리턴

-(id)firstObjectCommonWithArray:(NSArray*)otherArray
  : 일치하는것 찾으면 첫번째 인스턴스 리턴

-(NSArray*)arrayByAddingObject:(id)anObject
  : 인스턴스를 추가해서 만들어진 배열을 리턴

-(NSArray*)arrayByAddingObjectsFromArray:(NSArray*)anArray
  : 배열을 추가해서 만들어진 배열을 리턴

-(NSArray*)sortedArrayUsingSelector:(SEL)comparator // => 메서드 이름
  : comparator에 지정된 메서드를 기준으로 오름차순 정렬하여 리턴
--------------------------------------------------------
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>

int main(int argc, char *argv[])
{
    NSArray * ar = [NSArray arrayWithObjects:@"D", @"F", @"E", nil];

    int i;
    for(i=0; i<[ar count]; ++i)
    {
       NSLog(@"%@",[ar objectAtIndex:i]);
    }

    ar = [ar arrayByAddingObject:@"C"];
    for(i=0; i<[ar count]; ++i)
    {
       NSLog(@"%@",[ar objectAtIndex:i]);
    }
   
    NSArray * ar1 = [NSArray arrayWithObjects:@"A", @"X", @"Y", nil];
    ar = [ar arrayByAddingObjectsFromArray:ar1];
    for(i=0; i<[ar count]; ++i)
    {
       NSLog(@"%@",[ar objectAtIndex:i]);
    }

    NSArray *sortedArray = [ar sortedArrayUsingSelector:@selector(compare:)];
    for(i=0; i<[sortedArray count]; ++i)
   
    {
       NSLog(@"%@",[sortedArray objectAtIndex:i]);
    }
    system("pause");
    return 0;
}
--------------------------------------------------------   

4. NSArray에 메시지 전송

  • 배열의 모든 요소가 특정한 메서드를 수행하게 하고자 하는 경우 사용

-(void)makeObjectsPerform:(SEL)aSelector
  ==> 리시버(메서드를 호출하는 인스턴스)의 모든 요소들에게 aSelector를 수행

-(void)makeObjectsPerform:(SEL)aSelector withObject:(id)anObj
                                                                    매개변수가 있음
--------------------------------------------------------   
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>

@interface Test:NSObject
{int val;}
-(id)init:(int) v;
-(void)disp;
@end

@implementation Test
-(id)init:(int) v
{
   self = [super init];
   if(self != nil)
      val = v;
   return self;
}
-(void)disp
{
   NSLog(@"val:%d",val);
}
@end

int main(int argc, char *argv[])
{
   Test * Obj[3]; // 반드시 포인터 배열이어야 함
   // Test ** obj = malloc(sizeOf(Test*)*3); ==> 변수 사용가능, 동적할당 시 활용
   Obj[0] = [[Test alloc]init : 10];
   Obj[1] = [[Test alloc]init : 20];
   Obj[2] = [[Test alloc]init : 30];
  
   NSArray * ar = [NSArray arrayWithObjects:Obj count:3]; //C타입에서는 포인터배열명이거나 이중포인터명이어야함.
   [ar makeObjectsPerform:@selector(disp)];

   Test *temp[3]; // Test ** Temp; temp=malloc(sizeOf(Test*)*[ar count]);
   // sorting을 하고 싶으면 어떻게하지? 여기에는 compare이 없다.
   // compare를 재정의해서 사용
   /* -(int)compare:(Test *)obj
   {
      if(self->val < obj->val)
         return NSOrderedAscending;
   }
   */
   [ar getObjects:temp];
   int i;
   for(i=0; i<3; i++)
   [temp[i] disp];
   system("pause");
   return 0;
}
--------------------------------------------------------    
5. NSMutableArray

  • 배열의 요소인 객체를 제거하거나 삽입할 수 있는 메서드가 제공되는 NSArray의 하위 클래스

메서드
-(id)initWithCapacity:(NSUinteger)numItems // 매개변수 개수만큼 생성
-(void)addObject:(id)anObject
  // numItems의 개수를 가진 배열을 생성
-(void)addObjectFromArray:(NSArray*)otherArray
  // anObject를 마지막에 추가
  // 이 인수의 값이 nil이면 안됨
-(void)insertObject:(id)anObject atIndex:(NSUinteger)index
  // index 번째에 anObject추가
-(void)replace ObjectAtIndex:(NSUinteger)index withObject:(id)anObject
  // index 번째에 object를 anObject로 변경
-(void)setArray:(NSArray*)otherArray
  // 기존내용을 삭제하고 otherArray로 변경
-(void)removeAllObjects
  // 모든요소 제거
-(void)removeLastObjects
  // 마지막 요소 제거
-(void)removeObjectAtIndex:(NSUinteger)index
  // index번째 제거
-(void)removeObject:(id)anObject
  // anObject와 동일한 오브젝트 찾아서 제거 (메모리 주소가 같은)

6. 열거자(Enumerator)

  • C언어의 포인터 변수나 C++의 STL의 iterator처럼 컬렉션(데이터의모임)의 멤버들을 순서대로 접근할 수 있도록 제공해주는 개념

C 언어의 iterator
int ar[4];
int * it = ar;  // 배열 타입과 동일한 Data타입을 써야함.
 it++; // 자신의 데이터 타입 만큼 진행

  • C언어의 포인터와 다른점은 데이터타입에 상관없이 사용할 수 있다는 것입니다.
  • 모든 컬렉션의 데이터타입이 id타입이므로 실제 데이터타입을 지정하지 않아도 됩니다.
  • C++에서는 템플릿을 지정하는 경우가 일반적이지만 이 역시 필요없습니다.

사용방법
NSEnumerator * 인스턴스명 = [컬렉션명 objectEnumerator] // 앞에서부터 리턴
                                                         reverseObjectEnumerator //뒤에서부터 리턴
[인스턴스명 nextObject] => 다음 오브젝트로 진행. 다음이 없으면 nil 리턴

ex)Enumerator를 이용한 Mutable Array의 멤버접근 //insert, remove가 가능한 클래스
------------------------------------------------------------------------
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSValue.h>
#import <foundation/NSEnumerator.h>
// 위의 클래스 호출은 #import <foundation/foundation.h> 로 대체가능

int main(int argc, char * argv[])
{
    NSMutableArray * mAr = [NSMutableArray arrayWithCapacity:10];
    //arrayWithCapacity 는 NSMutableArray에서만 받을 수 있음
    [mAr addObject : [NSNumber numberWithInteger:1]];
    [mAr addObject : [NSNumber numberWithInteger:3]];
    [mAr addObject : [NSNumber numberWithInteger:5]];
   
    NSEnumerator * it;
    NSNumber * obj;
    it = [mAr objectEnumerator];
    // mAr의 시작 바로위를 가리킴 (BOF)
    int i = 1;
    while((obj = [it nextObject])!=nil)
    {
       NSLog(@"%i 번째:%i",i++,[obj intValue]);
       //  NSLog(@"%i 번째:%@",i++,obj);
    }
    NSLog(@"역순으로 접근하기");
    it = [mAr reverseObjectEnumerator];
    i=1;
    while((obj=[it nextObject])!=nil)
    {
       NSLog(@"%i번째:%i",i++,[obj intValue]);
    }
    system("pause");
    return 0;
}
------------------------------------------------------------------------

:
Posted by 에너지발전소
2010. 5. 18. 19:38

[9일차-1]8일차 이어서.. NSData 클래스 Objective-C2010. 5. 18. 19:38


NSData 클래스
  • 파일처리 등에 이용하는 바이트 배열 클래스
                                       1byte 기준

메서드
-(id)dataWithBytes : (const void *)bytes length:(NSVinteger)length
          생성자                배열           주소                     개수
-(id)initWithBytes : (const void *)bytes length:(NSUinteger)length
       초기화             어떤 타입의 포인터도 상관없음, integer를 넣으면 깨질 수 있음.
-(id)dataWithData:(NSData*)aData
          생성자
-(id)initWithData:(NSData*)aData
-(NSUinteger)length  //
-(void)getBytes:(const void*)bytes
                         bytes에게 주소를 리턴
-(NSString *)description

ex) NSString 과 NSData 와 char * 사이의 변환
---------------------------------------------------------------
#import <foundation/foundation.h>
/* 안써도 됨
#import <foundation/NSString.h>
#import <foundation/NSData.h>
*/
int main(int argc, char * argv[])
{
    unsigned char buf[20]; // 저장하기 위해 생성
    NSString * message = @"Test Conversion";
    const char * str = [message UTF8String]; // 일반 char type 으로 변환
    NSData * myData = [NSData dataWithBytes:str length:strlen(str)]; // 생성자이므로 메모리할당이 필요없음
    // NSString => NSData                           // 문자의 개수 리턴
    [myData getBytes:buf]; // char 배열로 변경
    int i;
    for (i=0; i<[myData length];i++)
    {
        NSLog(@"%c",buf[i]);
    }
    system("pause");
    return 0;
}
---------------------------------------------------------------
7. NSMutableData 클래스

  • 변경가능한 Data 클래스
  • 삽입, 삭제(remove로 시작), 갱신에 관련된 메서드가 존재
                                             인덱스 위치에 있는 인스턴스를 삭제하고 새로운 인스턴스를 삽입
  • NSData 로부터 상속됨

 add : 뒤에 삽입
insert : 위치에 삽입

:
Posted by 에너지발전소
2010. 5. 18. 11:15

[8일차]String Objective-C2010. 5. 18. 11:15

String
1. C언어의 문자열은 ASCII Code기반
2. Objective-C 언어의 문자열 클래스는 unicode 기반
                                                  멀티바이트 기반 (메서드들은 바이트 단위로 동작함)

3. String 클래스의 종류
   - NSString : 내용을 변경할 수 없는 문자열 클래스 (Char *)
   - NSConstantString : 문자열 상수로 주소를 변경할 수 없는 문자열 클래스 (Const char *)
   - NSMutableString : 내용을 변경할 수 있는 문자열 클래스 
     (NSString을 상속 + 메모리영역 추가(insert),삭제(delete)를 포함)

@"문자열" 이 NSConstantString
출력시에는 %s를 사용하기가 애매함
%@를 이용해서 인스턴스에게 Description 메서드를 수행한 리턴값을 출력하는 형태를 취함.
-----------------------------------------------------------------------------------
#import <foundation/NSObject.h>
// foundation.h
//  #import NSObject.h
#import <foundation/NSString.h>

int main(int argc, char * argv[])
{
    NSString * str = @"Programing is Fun";  // 자기에게 메모리를 할당하지 않았음. 포인터 변수
    // 상위클래스의 인스턴스는 하위클래서의 인스턴스에 대입가능.
    // alloc, 생성자, malloc 를 호출하지 않으면 자신의 메모리 공간은 없다.
    NSLog(@"%s",str); // %s는 C언어의 문자배열 출력용
    // 뒤에있는 주소부터 null을 만날때까지 1byte 단위로 읽어서 출력을 해라
    // NSString 는 MultiByte 임으로 1byte씩 끊어 읽을 경우 문자가 깨지는 현상발생

    NSLog(@"%@",str); // 문자열을 출력하는게 아니고
    // %@는 인스턴스에게 decription 메서드를 호출해서 문자열로 출력
    // str 을 출력하는게 아니라 str 의 decription 메서드 호출
    // NSObject
    // +(NSString *) description : 클래스 이름 리턴
    // -(NSString *) description : 클래스 이름과 id 리턴
    // NSString, NSNumber는 decription 을 재정의 해놓았음.

    // 값을 문자열로 리턴하도록 재정의됨.
    // ToString() 메서드를 재정의 하는것과 같이 Description 을 재정의하여 활용할 수 있음.
   
    system("pause");
    return 0 ;
}
-----------------------------------------------------------------------------------

%@을 이용해서 인스턴스 이름만으로 원하는 데이터를 출력하고자 하는 경우에는
description 메서드를 재정의(Overiding)해야 함

-----------------------------------------------------------------------------------
ex)
#import <foundation/NSObject.h>
#import <foundation/NSString.h>
#import <foundation/NSValue.h>

@interface Test : NSObject
// decription 메서드가 이미 존재
// decription : class 이름, id 를 리턴
@end

@implementation Test
@end

@interface Temp : NSObject
{
   NSNumber *number;
   // 숫자에 관련된 wrapper 클래스
}
-(id)init : (int)n; // 이건 over roading - 매개변수가 동일
-(NSString *) description; //이건  overriding
// -(id)init  <= 이렇게 사용하면 재정의
@end

@implementation Temp
-(id)init : (int)n
{
   self = [super init];  // 상위클래스 멤버 초기화
   if(self !=nil)
      number = [NSNumber numberWithInteger : n]; // 자신의 멤버 초기화
                // NSNumber가 할당받은 영역에 n을 대입
                // 정수로 저장해도 실수로 읽을 수 있음.
                // 부호 | 가수부 | 지수
   return self;
}

-(NSString *)description
{
   return [number stringValue]; // NSNumber 클래스가 소유한 값을 문자열로 리턴
}
@end

int main(int argc,char *argv[])
{
   NSNumber *intNumber = [NSNumber numberWithInteger : 100];
      NSLog(@"%@",intNumber); // 엄밀히 이야기하면 @"100" 이 출력
      // NSLog(@"%d",intNumber); // id
      // NSLog(@"%i",intNumber);
  
   Test *obj = [Test new];
      NSLog(@"%@",obj); // Test (클래스명) + 어떤숫자 (id)
     
      Temp *Ins = [[Temp alloc]init :100]; // Ins -> isa : Temp 주소
      NSLog(@"%@",Ins); // 100 <- 재정의된 문자열 
     
      system("pause");
   return 0;
}
-----------------------------------------------------------------------------------        

NSString의 인스턴스 생성과 문자 코드 변환
+(id)stringWithString:(NSString*)nsstring
-(id)initWithString:(NSString*)nsstring
-(NSUinteger)length // 문자수 리턴
-(id)initWhitUTF8String:(const char *)bytes
                                // C언어의 문자열 상수 data type
                                // 을 UTF8 문자열로 변환
-(const char *)UTF8String
  // 현재의 문자열을 C언어의 문자열 상수 data type(const char *) 으로 변경하기 위해 사용
  // ASCII Code 로 리턴, 파일처리, 메모장에서는 byte 단위 처리하고 있기 때문에 활용됨.

주의)
char *  // ? char 배열
const char * // ? 내용을 변경하지 못하는 char 배열
* char * 에서 const char * 로는 data를 줄 수 없음.
ex) cpy(char *, const char *) // 상수를 일반 변수에 대입하겠다는 의미
   heap에할당    전역에 할당(변경 불가능)


:
Posted by 에너지발전소