달력

1

« 2025/1 »

  • 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 에너지발전소