<출처 : 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