[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;
}
------------------------------------------------------------------------