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

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

by Mash 2012. 3. 27.
반응형

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

NSCountedSet 클래스
중복 데이터가 오면 count 값을 1개 올려서 저장하는 set 클래스입니다.
위의 클래스 들이 가지고 있는 메서드에 아래와 같은 메서드를 더 가지고 있습니다.

-(NSUInteger) countForObject:obj : obj의 개수

 

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSCountedSet *set = [NSCountedSet set]; //CountedSet은 몇번 들어왔는지 세고 있음
06.NSNumber * element;
07.[set addObject:[NSNumber numberWithInt:1]];
08.[set addObject:[NSNumber numberWithInt:3]];
09.[set addObject:[NSNumber numberWithInt:2]];
10.[set addObject:[NSNumber numberWithInt:1]];
11.[set addObject:[NSNumber numberWithInt:2]];
12.[set addObject:[NSNumber numberWithInt:4]];
13.NSLog(@"전체 개수 = %u개", [set count]);
14.for(element in set)
15.NSLog(@"%@의 개수:%u 개", element,[set countForObject:element]); //각 element가 몇 번씩 들어왔는지 알 수 있다.
16.[pool drain];
17.return 0;
18.}

결과
2010-11-11 10:37:15.149 d6test[1423:a0f] 전체 개수 = 4개
2010-11-11 10:37:15.154 d6test[1423:a0f] 3의 개수:1 개
2010-11-11 10:37:15.155 d6test[1423:a0f] 2의 개수:2 개
2010-11-11 10:37:15.155 d6test[1423:a0f] 1의 개수:2 개
2010-11-11 10:37:15.156 d6test[1423:a0f] 4의 개수:1 개


Dictionary
- 키와 인스턴스로 이루어진 데이터의 모임입니다.
- 키로 인스턴스를 찾을 수 있습니다.
- 키(NSString)는 유일해야 하며 일반적으로 NSString 입니다.
- 키와 연결된 인스턴스는 데이터 유형에 관계가 없지만 nil(데이터가 비어있음)은 안됩니다.

 

1. NSDictionary
NSDictionary는 수정이 불가능한 Dictionary입니다.


중요한것 : 
      count : 요소의 갯수
      ObjectForKey : 키값에 해당하는 Object를 리턴
      allKeys : 모든 키 값을 배열로 리턴
      allValues : 모든 데이터를 찾아 줌

 

멤버 메서드

+(id)dictionary : 비어있는 dictionary 생성
+(id)dictionaryWithObject:(id)anObject forKey:(id)aKey : aKey를 key로 해서 anObject를 내용으로 갖는 한 쌍의 인스턴스를 갖는 dictionary 생성
-(id)initWithObjects:(NSArray *)Objects forKeys:(NSArray *)Keys : Keys를 키 값으로 해서 Objects를 내용으로 여러 쌍을 초기화
-(id)initWithObjects:(id *)Objects forKeys:(id *)Keys count:(NSUInteger)count : Keys를 키 값으로 해서 Objects를 내용으로 count 개수 만큼 초기화
-(id)initWithObjectsAndKeys:(id)Object,(id)Key,… nil : Object와 Key로 초기화
-(NSUInteger)count : 개수 리턴
-(id)objectForKey:(id)aKey : aKey에 해당하는 인스턴스 리턴
-(NSArray *)allKeys : 모든 키값을 배열로 리턴
-(NSArray *)allValues : 모든 키를 포함하는 배열을 리턴
-(NSEnumerator *)keyEnumerator : 키 값을 열거자로 리턴
-(NSEnumerator *)objectEnumerator : 키 값을 열거자로 리턴
-(NSArray *)allKeysForObject:(id)anObject : anObject를 갖는 모든 키를 배열로 리턴

 

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05. 
06.//greeting이라는 Dictionary를 만듬
07.//아침인사 라는 키로 안녕하세요
08.//점심인사 라는 키로 식사 하셨어요
09.//저녁인사 라는 키로 내일뵐께요
10.//로 저장하고 있는 NSDictionary 객체 생성
11.NSDictionary * greeting = [[NSDictionary alloc] initWithObjectsAndKeys:@"안녕하세요", @"아침인사", @"식사 하셨어요", @"오후인사", @"내일뵐께요",@"저녁인사",nil ];
12.//뒤에있는건 key 앞에있는건 object로 저장됨
13.//복수는 마지막에 nil로 막아야 함
14. 
15.//각각의 키로 Object를 찾아서 출력
16.NSLog(@"아침인사: %@", [greeting objectForKey: @"아침인사"]);//아침인사라는 키로 오브젝트를 불러옴
17.NSLog(@"점심인사: %@", [greeting objectForKey: @"오후인사"]);
18.NSLog(@"저녁인사: %@", [greeting objectForKey: @"저녁인사"]);
19. 
20.//for - in 을 이용하면 Dictionary에서는 키 값을 따라 순회한다.
21.for(NSString *temp in greeting) //greeting을 temp에 저장
22.NSLog(@"key:%@ value:%@", temp, [greeting objectForKey:temp]);
23.//key=temp, objectForKey:temp에 해당하는 키를 가져옴
24. 
25.[pool drain];
26.return 0;
27.}

결과
2010-11-11 10:51:38.252 d6test[1534:a0f] 아침인사: 안녕하세요
2010-11-11 10:51:38.254 d6test[1534:a0f] 점심인사: 식사 하셨어요
2010-11-11 10:51:38.254 d6test[1534:a0f] 저녁인사: 내일뵐께요
2010-11-11 10:51:38.255 d6test[1534:a0f] key:저녁인사 value:내일뵐께요
2010-11-11 10:51:38.255 d6test[1534:a0f] key:아침인사 value:안녕하세요
2010-11-11 10:51:38.256 d6test[1534:a0f] key:오후인사 value:식사 하셨어요

 

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05. 
06.// File 메뉴
07.NSArray * File = [NSArray arrayWithObjects:@"새로만들기",@"열기",@"저장",@"닫기",nil];
08.// alloc]initWithObjects 를 이용해도 된다. - 사용자가 release해줘야 함
09. 
10.// Edit 메뉴
11.NSArray * Edit = [NSArray arrayWithObjects:@"취소",@"재실행",@"복사",@"잘라내기",@"붙여넣기",nil];
12.//objective-c의 배열로 묶기
13.NSArray * Menu = [NSArray arrayWithObjects:File,Edit,nil];
14. 
15.//출력 시작
16.for(NSArray * temp in Menu) //Menu에 있는 모든 멤버를 temp로 가져옴
17.{
18.if(temp==File)
19.NSLog(@"File");
20.else if(temp==Edit)
21.NSLog(@"Edit");
22.NSLog(@"--------------------");
23. 
24.for(NSString * imsi in temp) //멤버의 내용이 문자열이므로 NSString
25.{
26.NSLog(@"    %@",imsi);
27.}
28.}
29. 
30./* 배열에 접근 (하나 일땐 요렇게!)
31.for(NSString * temp in File)
32.NSLog(@"%@",temp);
33. 
34.또는
35.for(int i=0;i<[File count]; i++)
36.NSLog(@"%@",[File objectAtIndex:0]); //Index를 가져올땐 objectAtIndex를 사용
37.이렇게 해도 됨 */
38. 
39.[pool drain];
40.return 0;
41.}

결과
2010-11-11 11:26:36.112 d6test[1794:a0f] File
2010-11-11 11:26:36.114 d6test[1794:a0f] --------------------
2010-11-11 11:26:36.114 d6test[1794:a0f]     새로만들기
2010-11-11 11:26:36.115 d6test[1794:a0f]     열기
2010-11-11 11:26:36.115 d6test[1794:a0f]     저장
2010-11-11 11:26:36.116 d6test[1794:a0f]     닫기
2010-11-11 11:26:36.116 d6test[1794:a0f] Edit
2010-11-11 11:26:36.116 d6test[1794:a0f] --------------------
2010-11-11 11:26:36.117 d6test[1794:a0f]     취소
2010-11-11 11:26:36.117 d6test[1794:a0f]     재실행
2010-11-11 11:26:36.118 d6test[1794:a0f]     복사
2010-11-11 11:26:36.118 d6test[1794:a0f]     잘라내기
2010-11-11 11:26:36.119 d6test[1794:a0f]     붙여넣기


여기에 삽입(insert)메뉴를 추가하고 싶으면

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05. 
06.// File 메뉴
07.NSArray * File = [NSArray arrayWithObjects:@"새로만들기",@"열기",@"저장",@"닫기",nil];
08.// alloc]initWithObjects 를 이용해도 된다. - 사용자가 release해줘야 함
09. 
10.// Edit 메뉴
11.NSArray * Edit = [NSArray arrayWithObjects:@"취소",@"재실행",@"복사",@"잘라내기",@"붙여넣기",nil];
12. 
13.// Insert 메뉴 추가 -1단계
14.NSArray * Insert = [NSArray arrayWithObjects:@"그림",@"노래",@"파일",nil];
15. 
16.//objective-c의 배열로 묶기
17.NSArray * Menu = [NSArray arrayWithObjects:File,Edit,Insert,nil]; // 배열 추가 -2단계
18. 
19. 
20.for(NSArray * temp in Menu) //Menu에 있는 모든 멤버를 temp로 가져옴
21.{
22.if(temp==File)
23.NSLog(@"File");
24.else if(temp==Edit)
25.NSLog(@"Edit");
26.else if(temp==Insert) //출력구문 추가 -3단계
27.NSLog(@"Insert");
28.NSLog(@"--------------------");
29. 
30.for(NSString * imsi in temp) //멤버의 내용이 문자열이므로 NSString
31.{
32.NSLog(@"    %@",imsi);
33.}
34.}
35. 
36./* 배열에 접근 (하나 일땐 요렇게!)
37.for(NSString * temp in File)
38.NSLog(@"%@",temp);
39. 
40.또는
41.for(int i=0;i<[File count]; i++)
42.NSLog(@"%@",[File objectAtIndex:0]); //Index를 가져올땐 objectAtIndex를 사용
43.이렇게 해도 됨 */
44. 
45.[pool drain];
46.return 0;
47.}

결과
2010-11-11 11:35:39.047 d66tst[1975:a0f] File
2010-11-11 11:35:39.049 d66tst[1975:a0f] --------------------
2010-11-11 11:35:39.049 d66tst[1975:a0f]     새로만들기
2010-11-11 11:35:39.050 d66tst[1975:a0f]     열기
2010-11-11 11:35:39.050 d66tst[1975:a0f]     저장
2010-11-11 11:35:39.051 d66tst[1975:a0f]     닫기
2010-11-11 11:35:39.051 d66tst[1975:a0f] Edit
2010-11-11 11:35:39.051 d66tst[1975:a0f] --------------------
2010-11-11 11:35:39.052 d66tst[1975:a0f]     취소
2010-11-11 11:35:39.052 d66tst[1975:a0f]     재실행
2010-11-11 11:35:39.053 d66tst[1975:a0f]     복사
2010-11-11 11:35:39.053 d66tst[1975:a0f]     잘라내기
2010-11-11 11:35:39.053 d66tst[1975:a0f]     붙여넣기
2010-11-11 11:35:39.054 d66tst[1975:a0f] Insert
2010-11-11 11:35:39.054 d66tst[1975:a0f] --------------------
2010-11-11 11:35:39.055 d66tst[1975:a0f]     그림
2010-11-11 11:35:39.055 d66tst[1975:a0f]     노래
2010-11-11 11:35:39.055 d66tst[1975:a0f]     파일

 

추가할때 간단한 작업으로 수정할 수가 있다.

 

 

하지만 딕셔너리를 이용하면 더욱 편리해진다.
예제

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05. 
06.// File 메뉴
07.NSArray * File = [NSArray arrayWithObjects:@"새로만들기",@"열기",@"저장",@"닫기",nil];
08. 
09.// Edit 메뉴
10.NSArray * Edit = [NSArray arrayWithObjects:@"취소",@"재실행",@"복사",@"잘라내기",@"붙여넣기",nil];
11. 
12.// Insert 메뉴 - 추가 전
13.// NSArray * Insert = [NSArray arrayWithObjects:@"그림",@"노래",@"파일",nil];
14. 
15.//Dictionary의 사용
16.NSDictionary * dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"File",@"Title",File,@"SubMenu",nil];
17.NSDictionary * dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Edit",@"Title",Edit,@"SubMenu",nil];
18. 
19.NSArray * Menu = [NSArray arrayWithObjects:dic1,dic2,nil];
20. 
21.for(NSDictionary * dic in Menu)
22.{
23.NSLog(@" %@",[dic objectForKey:@"Title"]);
24.NSArray * temp = [dic objectForKey:@"SubMenu"];
25.NSLog(@"--------------");
26.for(NSString * imsi in temp)
27.{
28.NSLog(@"         %@",imsi);
29.}
30.}
31. 
32.[pool drain];
33.return 0;
34.}

결과
2010-11-11 11:53:51.507 d66tst[2243:a0f]  File
2010-11-11 11:53:51.509 d66tst[2243:a0f] --------------
2010-11-11 11:53:51.509 d66tst[2243:a0f]          새로만들기
2010-11-11 11:53:51.509 d66tst[2243:a0f]          열기
2010-11-11 11:53:51.510 d66tst[2243:a0f]          저장
2010-11-11 11:53:51.510 d66tst[2243:a0f]          닫기
2010-11-11 11:53:51.511 d66tst[2243:a0f]  Edit
2010-11-11 11:53:51.511 d66tst[2243:a0f] --------------
2010-11-11 11:53:51.516 d66tst[2243:a0f]          취소
2010-11-11 11:53:51.518 d66tst[2243:a0f]          재실행
2010-11-11 11:53:51.519 d66tst[2243:a0f]          복사
2010-11-11 11:53:51.519 d66tst[2243:a0f]          잘라내기
2010-11-11 11:53:51.520 d66tst[2243:a0f]          붙여넣기


예제 추가

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05. 
06.// File 메뉴
07.NSArray * File = [NSArray arrayWithObjects:@"새로만들기",@"열기",@"저장",@"닫기",nil];
08. 
09.// Edit 메뉴
10.NSArray * Edit = [NSArray arrayWithObjects:@"취소",@"재실행",@"복사",@"잘라내기",@"붙여넣기",nil];
11. 
12.// Insert 메뉴 - 추가
13.NSArray * Insert = [NSArray arrayWithObjects:@"그림",@"동영상",@"파일",nil]; // 추가 1단계
14. 
15.//Dictionary의 사용
16.NSDictionary * dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"File",@"Title",File,@"SubMenu",nil];
17.NSDictionary * dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Edit",@"Title",Edit,@"SubMenu",nil];
18.NSDictionary * dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"Insert",@"Title",Insert,@"SubMenu",nil]; //추가 2단계
19. 
20.NSArray * Menu = [NSArray arrayWithObjects:dic1,dic2,dic3,nil]; // 추가 3단계
21. 
22.//출력부분은 놔둬도 됨
23.for(NSDictionary * dic in Menu)
24.{
25.NSLog(@" %@",[dic objectForKey:@"Title"]);
26.NSArray * temp = [dic objectForKey:@"SubMenu"];
27.NSLog(@"--------------");
28.for(NSString * imsi in temp)
29.{
30.NSLog(@"         %@",imsi);
31.}
32.}
33. 
34.[pool drain];
35.return 0;
36.}

결과
2010-11-11 12:02:58.517 d66tst[2478:a0f]  File
2010-11-11 12:02:58.519 d66tst[2478:a0f] --------------
2010-11-11 12:02:58.520 d66tst[2478:a0f]          새로만들기
2010-11-11 12:02:58.520 d66tst[2478:a0f]          열기
2010-11-11 12:02:58.522 d66tst[2478:a0f]          저장
2010-11-11 12:02:58.522 d66tst[2478:a0f]          닫기
2010-11-11 12:02:58.523 d66tst[2478:a0f]  Edit
2010-11-11 12:02:58.523 d66tst[2478:a0f] --------------
2010-11-11 12:02:58.523 d66tst[2478:a0f]          취소
2010-11-11 12:02:58.524 d66tst[2478:a0f]          재실행
2010-11-11 12:02:58.524 d66tst[2478:a0f]          복사
2010-11-11 12:02:58.525 d66tst[2478:a0f]          잘라내기
2010-11-11 12:02:58.525 d66tst[2478:a0f]          붙여넣기
2010-11-11 12:02:58.525 d66tst[2478:a0f]  Insert
2010-11-11 12:02:58.526 d66tst[2478:a0f] --------------
2010-11-11 12:02:58.526 d66tst[2478:a0f]          그림
2010-11-11 12:02:58.527 d66tst[2478:a0f]          동영상
2010-11-11 12:02:58.527 d66tst[2478:a0f]          파일


 

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool * pool = [NSAutoreleasePool new];
05.NSArray *KIA;
06.NSArray *SK;
07.NSArray *HD;
08.NSArray *LG;
09.KIA = [NSArray arrayWithObjects:@"윤석민", @"이용규", @"이종범",@"서재응", @"양현종", nil];
10.SK = [NSArray arrayWithObjects:@"김광현", @"고효준", @"김재현",@"정근우", @"나주환", nil];
11.HD = [NSArray arrayWithObjects:@"클락",@"황재균", nil];
12.LG = [NSArray arrayWithObjects:@"박용택", @"이택근", @"이병규", @"봉중근", nil];
13.NSDictionary *Dic1, *Dic2, *Dic3, *Dic4;
14.Dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"KIA", @"Team", KIA, @"data", nil];
15.Dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"SK", @"Team", SK, @"data", nil];
16.Dic3 = [[NSDictionary alloc] initWithObjectsAndKeys:@"HD", @"Team", HD, @"data", nil];
17.Dic4 = [[NSDictionary alloc] initWithObjectsAndKeys:@"LG", @"Team", LG, @"data", nil];
18.NSArray *data = [[NSArray alloc] initWithObjects:Dic1, Dic2, Dic3, Dic4, nil];
19.[Dic1 release];
20.[Dic2 release];
21.[Dic3 release];
22.[Dic4 release];
23.for(NSDictionary * dic in data)
24.{
25.NSString * team = [dic objectForKey:@"Team"];
26.NSArray * ar = [dic objectForKey:@"data"];
27.NSLog(@"team:%@", team);
28.NSLog(@"======================");
29.for(NSString * name in ar)
30.NSLog(@"%@", name);
31.NSLog(@" ");
32.}
33.[pool drain];
34.return 0;
35.}

결과
2010-11-11 11:07:19.102 d6test[1670:a0f] team:KIA
2010-11-11 11:07:19.105 d6test[1670:a0f] ======================
2010-11-11 11:07:19.105 d6test[1670:a0f] 윤석민
2010-11-11 11:07:19.106 d6test[1670:a0f] 이용규
2010-11-11 11:07:19.106 d6test[1670:a0f] 이종범
2010-11-11 11:07:19.107 d6test[1670:a0f] 서재응
2010-11-11 11:07:19.107 d6test[1670:a0f] 양현종
2010-11-11 11:07:19.107 d6test[1670:a0f]  
2010-11-11 11:07:19.108 d6test[1670:a0f] team:SK
2010-11-11 11:07:19.108 d6test[1670:a0f] ======================
2010-11-11 11:07:19.109 d6test[1670:a0f] 김광현
2010-11-11 11:07:19.109 d6test[1670:a0f] 고효준
2010-11-11 11:07:19.110 d6test[1670:a0f] 김재현
2010-11-11 11:07:19.110 d6test[1670:a0f] 정근우
2010-11-11 11:07:19.110 d6test[1670:a0f] 나주환
2010-11-11 11:07:19.114 d6test[1670:a0f]  
2010-11-11 11:07:19.115 d6test[1670:a0f] team:HD
2010-11-11 11:07:19.115 d6test[1670:a0f] ======================
2010-11-11 11:07:19.116 d6test[1670:a0f] 클락
2010-11-11 11:07:19.117 d6test[1670:a0f] 황재균
2010-11-11 11:07:19.118 d6test[1670:a0f]  
2010-11-11 11:07:19.118 d6test[1670:a0f] team:LG
2010-11-11 11:07:19.119 d6test[1670:a0f] ======================
2010-11-11 11:07:19.119 d6test[1670:a0f] 박용택
2010-11-11 11:07:19.120 d6test[1670:a0f] 이택근
2010-11-11 11:07:19.120 d6test[1670:a0f] 이병규
2010-11-11 11:07:19.121 d6test[1670:a0f] 봉중근
2010-11-11 11:07:19.121 d6test[1670:a0f] 

 


2. NSMutableDictionary

NSMutableDictionary는 수정이 가능한 Dictionary입니다.
아래와 같은 메서드가 추가됩니다.
+(id) dictionaryWithCapacity:size : size 크기만큼으로 메모리 할당
-(id)initWithCapacity:size : size 크기만큼으로 초기화
-(void)setObject:(id)anObject forKey:(id)aKey : aKey를 Key로 anObject를 추가합니다.
둘 다 nil이면 안되고 aKey가 존재한다면 내용은 대체됩니다.
-(void)removeAllObjects : 모든 엔트리 삭제
-(void)removeObjectForKey:key : key에 해당하는 인스턴스 삭제
-(NSArray *)keysSortedByValueUsingSelector:@selector(비교메서드:) : 이 경우 내용에 따라서 정렬한 후 key를 배열로 리턴합니다.


반응형