본문 바로가기
  • 그냥 하자
iOS

Chap6-1. 열거자, enumerator, 고속열거, 다차원배열, set클래스, NSSet, NSCountedSet, Dictionary, NSDictionary, NSMutableDictionary

by Mash 2012. 3. 27.
반응형

<출처 : http://wwwww.kr/objectivec/30984>

5. 열거자(enumerator)
배열 같은 컬렉션에 있는 요소의 객체에 접근하기 위한 개념입니다.
출발점은 BOF,  끝에서는 nil
NSEnumerator 클래스로 제공되며  2개의 메서드가 제공됩니다.

 

-(id)nextObject : 다음 요소를 리턴하며 더 이상 리턴할 요소가 없으면 nil을 리턴합니다.

-(NSArray *)allObjects :모든 요소를 배열로 리턴합니다.
이 열거자를 생성하는 방법은 컬렉션 인스턴스에서 다음의 메서드를 호출해서 리턴받아야 합니다.

-(NSEnumerator *)objectEnumerator : 순서대로 진행하는 열거자를 리턴

-(NSEnumerator *)reverseObjectEnumerator : 역순으로 접근하기 위한 열거자를 리턴

 

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.//트리구조의 파일 접근시 유용함
05.NSAutoreleasePool * pool = [NSAutoreleasePool new];
06.int i;
07.NSArray * ar = [NSArray arrayWithObjects: @"Morning",@"Afternoon",@"Evening", nil];
08.//순방향 Enumerator를 생성
09.NSEnumerator * it = [ar objectEnumerator];
10.NSString * temp;
11.//처음부터 순서대로 마지막까지 데이터를 temp에 대입
12.while((temp = [it nextObject])!= nil) //템프에 넥스트오브젝터를 집어넣어 nil을 만날때까지 반복
13.{
14.NSLog(@"%i 번째: %@",i++, temp); //아이폰개발에선 다른 대체문구가 있기때문에 잘 사용하지 않는다.
15.
16.NSLog(@"역순으로 접근하기");
17.//역방향 Enumerator를 생성
18.it = [ar reverseObjectEnumerator]; //리버스오브젝트이너머레이터만 바꾸면 역순정렬
19.i=1;
20.while((temp = [it nextObject])!= nil)
21.{
22.NSLog(@"%i 번째: %@",i++, temp);
23.}
24. 
25.//배열의 데이터를 순서대로 접근해서 출력하기 - 응용(objectAtIndex)
26.NSLog(@"순서대로 접근하기 - 어제배운 objectAtIndex 이용");
27.for (i = 0; i < [ar count]; i++)
28.{
29.NSLog(@"ar[%d]:%@",i,[ar objectAtIndex: i] );
30.}
31. 
32.//배열의 데이터를 역순으로 접근해서 출력하기
33.NSLog(@"역순으로 접근하기 - 어제배운 objectAtIndex 이용");
34.for (i = [ar count]-1; i >=0; i--)
35.{
36.NSLog(@"ar[%d]:%@",i,[ar objectAtIndex: i] );
37.}
38. 
39.[pool drain];
40.return 0;
41.}

결과
2010-11-11 09:48:26.939 day6[646:a0f] 0 번째: Morning
2010-11-11 09:48:26.944 day6[646:a0f] 1 번째: Afternoon
2010-11-11 09:48:26.944 day6[646:a0f] 2 번째: Evening
2010-11-11 09:48:26.945 day6[646:a0f] 역순으로 접근하기
2010-11-11 09:48:26.945 day6[646:a0f] 1 번째: Evening
2010-11-11 09:48:26.946 day6[646:a0f] 2 번째: Afternoon
2010-11-11 09:48:26.946 day6[646:a0f] 3 번째: Morning
2010-11-11 09:48:26.947 day6[646:a0f] 순서대로 접근하기 - 어제배운 objectAtIndex 이용
2010-11-11 09:48:26.950 day6[646:a0f] ar[0]:Morning
2010-11-11 09:48:26.951 day6[646:a0f] ar[1]:Afternoon
2010-11-11 09:48:26.951 day6[646:a0f] ar[2]:Evening
2010-11-11 09:48:26.951 day6[646:a0f] 역순으로 접근하기 - 어제배운 objectAtIndex 이용
2010-11-11 09:48:26.952 day6[646:a0f] ar[2]:Evening
2010-11-11 09:48:26.952 day6[646:a0f] ar[1]:Afternoon
2010-11-11 09:48:26.953 day6[646:a0f] ar[0]:Morning

 

6. 고속 열거의 사용
for문안에서 임시 변수를 이용하여 배열의 모든 요소를 접근할 수 있도록 하는 개념입니다.
사용 방법

1.for(임시변수 in 컬렉션명) // 자주쓰는 컬렉션명 : NSArray, NSSet, NSDictionary
2.{
3.임시 변수를 이용한 배열의 요소 접근;
4.}

이 때 컬렉션은 객체의 배열만 가능하며 일반 자료형의 배열은 해당되지 않습니다.
 

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05. 
06.// 자주쓰는 컬렉션명 : NSArray, NSSet, NSDictionary
07.NSArray * ar = [NSArray arrayWithObjects: @"Morning",@"Afternoon",@"Evening", nil]; //ar이 컬렉션이 됨.
08.for(NSString * temp in ar) //NSString(문자열이므로) * 임시명 in 컬렉션, NSString대신에 id(주로 var)를 사용해도 됨.
09.{
10.//for를 이용하여 처음과 끝을 지정해주지 않아도 되기 때문에 편리하다.
11.NSLog(@"%@", temp); //temp를 출력
12.}
13.[pool drain];
14.return 0;
15.}

결과
2010-11-11 09:55:51.271 day6[784:a0f] Morning
2010-11-11 09:55:51.273 day6[784:a0f] Afternoon
2010-11-11 09:55:51.274 day6[784:a0f] Evening

 

 

7. 5. 열거자와 6.고속열거의 합성

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.//트리구조의 파일 접근시 유용함
05.NSAutoreleasePool * pool = [NSAutoreleasePool new];
06.int i;
07.NSArray * ar = [NSArray arrayWithObjects: @"Morning",@"Afternoon",@"Evening", nil];
08.//순방향 Enumerator를 생성
09.NSEnumerator * it = [ar objectEnumerator];
10.NSString * temp;
11.//처음부터 순서대로 마지막까지 데이터를 temp에 대입
12.while((temp = [it nextObject])!= nil) //템프에 넥스트오브젝터를 집어넣어 nil을 만날때까지 반복
13.{
14.NSLog(@"%i 번째: %@",i++, temp); //아이폰개발에선 다른 대체문구가 있기때문에 잘 사용하지 않는다.
15.
16.NSLog(@"역순으로 접근하기");
17.//역방향 Enumerator를 생성
18.it = [ar reverseObjectEnumerator]; //리버스오브젝트이너머레이터만 바꾸면 역순정렬
19.i=1;
20.while((temp = [it nextObject])!= nil)
21.{
22.NSLog(@"%i 번째: %@",i++, temp);
23.}
24. 
25.//배열의 데이터를 순서대로 접근해서 출력하기 - 응용(objectAtIndex)
26.NSLog(@"순서대로 접근하기 - 어제배운 objectAtIndex 이용");
27.for (i = 0; i < [ar count]; i++)
28.{
29.NSLog(@"ar[%d]:%@",i,[ar objectAtIndex: i] );
30.}
31. 
32.//배열의 데이터를 역순으로 접근해서 출력하기
33.NSLog(@"역순으로 접근하기 - 어제배운 objectAtIndex 이용");
34.for (i = [ar count]-1; i >=0; i--)
35.{
36.NSLog(@"ar[%d]:%@",i,[ar objectAtIndex: i] );
37.}
38. 
39.//6. 고속열거의 사용
40.NSLog(@"고속열거를 이용하여 접근하기");
41.for(NSString * temp in ar) //NSString(문자열이므로) * 임시명 in 컬렉션, NSString대신에 id(주로 var)를 사용해도 됨.
42.{
43.//for를 이용하여 처음과 끝을 지정해주지 않아도 되기 때문에 편리하다.
44.NSLog(@"%@", temp); //temp를 출력
45.}
46. 
47.[pool drain];
48.return 0;
49.}

결과
2010-11-11 09:58:45.198 day6[895:a0f] 0 번째: Morning
2010-11-11 09:58:45.200 day6[895:a0f] 1 번째: Afternoon
2010-11-11 09:58:45.201 day6[895:a0f] 2 번째: Evening
2010-11-11 09:58:45.201 day6[895:a0f] 역순으로 접근하기
2010-11-11 09:58:45.201 day6[895:a0f] 1 번째: Evening
2010-11-11 09:58:45.202 day6[895:a0f] 2 번째: Afternoon
2010-11-11 09:58:45.202 day6[895:a0f] 3 번째: Morning
2010-11-11 09:58:45.203 day6[895:a0f] 순서대로 접근하기 - 어제배운 objectAtIndex 이용
2010-11-11 09:58:45.203 day6[895:a0f] ar[0]:Morning
2010-11-11 09:58:45.203 day6[895:a0f] ar[1]:Afternoon
2010-11-11 09:58:45.204 day6[895:a0f] ar[2]:Evening
2010-11-11 09:58:45.204 day6[895:a0f] 역순으로 접근하기 - 어제배운 objectAtIndex 이용
2010-11-11 09:58:45.204 day6[895:a0f] ar[2]:Evening
2010-11-11 09:58:45.205 day6[895:a0f] ar[1]:Afternoon
2010-11-11 09:58:45.205 day6[895:a0f] ar[0]:Morning
2010-11-11 09:58:45.205 day6[895:a0f] 고속열거를 이용하여 접근하기
2010-11-11 09:58:45.206 day6[895:a0f] Morning
2010-11-11 09:58:45.206 day6[895:a0f] Afternoon
2010-11-11 09:58:45.206 day6[895:a0f] Evening


8. 다차원 배열
objective-c에 없는 것
1) 다차원 배열
2) 더블 포인터 - 사용자가 만들 일이 없다.
 ex)아이폰 개발중 이런게 나오면 NSError **  
 이렇게 사용
 NSError * error;
 &error

다차원배열을 이렇게도 사용할수 있지만 비추.

NSArray * ar[3]; // 배열이 3개
아래와같이 사용하는 경우가 더 많다.

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05.NSArray * ar1 = [NSArray arrayWithObjects: @"1",@"2", nil]; //ar1배열
06.NSArray * ar2 = [NSArray arrayWithObjects: @"10",@"20", nil]; //ar2배열
07. 
08.//objective-c는 배열을 배열의 요소로 설정하면 자동적으로 다차원 배열이 된다.
09.NSArray * ar = [NSArray arrayWithObjects: ar1,ar2, nil]; //멤버 자체를 배열로 잡으면 2차원 배열
10.for(NSArray * temp in ar) //ar에가서 temp에다 잡아줘라
11.{
12.NSLog(@"=======================");
13.for(NSString * imsi in temp)
14.NSLog(@"%@", imsi);
15.}
16. 
17.//위 방법이 어렵다면 C에서 처럼 배열을 사용할 수 있다.
18.//하지만 배열 확장시 복잡하므로 비추한다.
19.NSLog(@"=============C배열 이용==========");
20.NSArray * cAr[2];
21.cAr[0] = [NSArray arrayWithObjects: @"1",@"2", nil];
22.cAr[1] = [NSArray arrayWithObjects: @"10",@"20", nil];
23.for(int i=0;i<2;i++)
24.{
25.NSLog(@"=======================");
26.for(NSString * imsi in cAr[i])
27.NSLog(@"%@", imsi);
28.}
29. 
30.[pool drain];
31.return 0;
32. 
33.}

결과
2010-11-11 10:16:09.721 d6test[1213:a0f] =======================
2010-11-11 10:16:09.723 d6test[1213:a0f] 1
2010-11-11 10:16:09.724 d6test[1213:a0f] 2
2010-11-11 10:16:09.724 d6test[1213:a0f] =======================
2010-11-11 10:16:09.725 d6test[1213:a0f] 10
2010-11-11 10:16:09.725 d6test[1213:a0f] 20
2010-11-11 10:16:09.726 d6test[1213:a0f] =============C배열 이용==========
2010-11-11 10:16:09.726 d6test[1213:a0f] =======================
2010-11-11 10:16:09.727 d6test[1213:a0f] 1
2010-11-11 10:16:09.727 d6test[1213:a0f] 2
2010-11-11 10:16:09.727 d6test[1213:a0f] =======================
2010-11-11 10:16:09.728 d6test[1213:a0f] 10
2010-11-11 10:16:09.728 d6test[1213:a0f] 20

 

 

Set 클래스
- 저장되는 순서를 알 수 없음. 해싱 되어 차곡차곡 어딘가에 저장 됨. 중복데이터는 안됨.
- 아이폰개발중에는 터치할때 사용
- 멤버 요소 간에 순서가 없고 동일한 멤버 요소가 반복적으로 포함되지 않는 컬렉션
- 내용이 변하지 않는 NSSet 클래스와 서브 클래스로 내용이 변할 수 있는 NSMutableSet 과 중복된 데이터의 개수를 저장하고 있는 NSCountedSet 등이 있다.
- 모두 NSSet.h 파일에 정의되어 있음
- 이 클래스에 포함된 요소들은 요소가 된 시점에 retain 이 전송되며 집합 자체가 해제될 때 release가 전송
- 중요한것은 3개, 나머지는 사용할 일 없음
 Count : 갯수 - 손가락 몇 개로 터치 했는지 확인
 allObjects : 모든 멤버를 배열로 리턴 - 저장되는 순서를 알 수 없기때문에 배열로 변환하여 index로 사용. 멀티터치시 사용
 anyObject : 아무 멤버나 하나 리턴, 랜덤의 의미가 아니다 - 싱글터치시 사용


1. NSSet 클래스

+(id)set : 요소가 포함되지 않는 임시 인스턴스 생성
+(id) setWithObjects: obj1…. nil : 오브젝트 들을 이용해서(배열을 가지고) set을 생성 - 미친짓.
-(id) setWithObjects: obj1…. nil : 오브젝트 들을 이용해서 set을 초기화
-(id)initWithArray:(NSArray *)array : 배열에 포함된 인스턴스를 이용해서 생성한 후 리턴하며 배열에 동일한 인스턴스가 여러 번 포함된 경우 하나만 추가됩니다.
-(NSArray *)allObjects : 모든 요소를 배열의 요소로 리턴
-(NSUInteger)count : 요소 개수 리턴
-(NSEnumerator *)objectEnumerator : 열거자를 반환
-(id)anyObject : Set 객체 중 하나를 리턴
멤버의 접근은 NSEnumerator를 이용하거나 NSArray로 리턴해서 접근을 해도 됩니다.

 

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[]) 
03.
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSString * element;
06.NSSet *setString  = [NSSet setWithObjects: @"One",@"Two",@"Three", @"One", nil];  
07.NSLog(@"NSSet"); 
08.NSLog(@"=============");
09.for(element in setString)
10.NSLog(@"%@", element);
11.NSString * str = [setString anyObject];
12.NSLog(@"any:%@", str);
13.NSArray * ar = [NSArray arrayWithObjects: @"One",@"Two",@"Three", @"One", nil];
14.NSLog(@"NSArray"); 
15.NSLog(@"=============");
16.for(element in ar)
17.NSLog(@"%@", element);          
18.[pool drain]; 
19.return 0; 
20.}

결과
2010-11-11 10:33:41.113 d6test[1356:a0f] NSSet
2010-11-11 10:33:41.119 d6test[1356:a0f] =============
2010-11-11 10:33:41.121 d6test[1356:a0f] One
2010-11-11 10:33:41.124 d6test[1356:a0f] Three
2010-11-11 10:33:41.124 d6test[1356:a0f] Two
2010-11-11 10:33:41.126 d6test[1356:a0f] any:One
2010-11-11 10:33:41.127 d6test[1356:a0f] NSArray
2010-11-11 10:33:41.127 d6test[1356:a0f] =============
2010-11-11 10:33:41.128 d6test[1356:a0f] One
2010-11-11 10:33:41.128 d6test[1356:a0f] Two
2010-11-11 10:33:41.128 d6test[1356:a0f] Three
2010-11-11 10:33:41.129 d6test[1356:a0f] One

 

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[]) 
03.
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSString * element;
06.NSNumber *num = [NSNumber numberWithInt:1000];
07.NSSet *setString  = [NSSet setWithObjects: @"One",@"Two",@"Three", @"One",num,@"Four",nil];  
08.NSLog(@"NSSet"); 
09.NSLog(@"=============");
10.for(element in setString)
11.NSLog(@"%@", element);
12.NSString * str = [setString anyObject];
13.NSLog(@"any:%@", str);
14.NSArray * ar = [NSArray arrayWithObjects: @"One",@"Two",@"Three", @"One", nil];
15.NSLog(@"NSArray"); 
16.NSLog(@"=============");
17.for(element in ar)
18.NSLog(@"%@", element);          
19.[pool drain]; 
20.return 0; 
21.}

결과
2010-11-11 10:36:24.229 d6test[1396:a0f] NSSet
2010-11-11 10:36:24.231 d6test[1396:a0f] =============
2010-11-11 10:36:24.231 d6test[1396:a0f] 1000
2010-11-11 10:36:24.232 d6test[1396:a0f] One
2010-11-11 10:36:24.232 d6test[1396:a0f] Three
2010-11-11 10:36:24.232 d6test[1396:a0f] Four
2010-11-11 10:36:24.233 d6test[1396:a0f] Two
2010-11-11 10:36:24.233 d6test[1396:a0f] any:1000
2010-11-11 10:36:24.233 d6test[1396:a0f] NSArray
2010-11-11 10:36:24.234 d6test[1396:a0f] =============
2010-11-11 10:36:24.234 d6test[1396:a0f] One
2010-11-11 10:36:24.234 d6test[1396:a0f] Two
2010-11-11 10:36:24.235 d6test[1396:a0f] Three
2010-11-11 10:36:24.235 d6test[1396:a0f] One

반응형