우선적으로, 코코스2D에서 사용하는 Vector( cocos2d::Vector)는 "C++ STL의 List"랑 비슷한 사용법을 가진다. 즉 다음과 같은 특징을 가지게 되는데,
- 배열크기의 제한이 없다. 사전에 배열크기를 지정하지 않아도 된다.
- 배열번호가 정해져있지 않기 때문에 배열번호에 직접 데이터를 대입할 수 없고 (ex v_int[3] = 27;) push_back등을 이용하여 데이터를 추가한다.
- 배열을 검사할땐 iterator를 사용한다.
1 2 3 4 5 6 7 8 9 | Vector <int> vInteger; vInteger.push_back(11); vInteger.push_back(237); vInteger.push_back(1981); vInteger.push_back(774); vInteger.push_back(2555); vInteger.push_back(37); | cs |
이건 "int형 자료형을 가진 벡터 배열을 돌 수 있는 이터레이터 itor을 생성한다" 라는 의미이다.
많은 오해와 달리 이터레이터는 벡터 배열과 쌍으로 이루어진게 아니라 그냥 완전 별개의 물건이다. 즉 위에서 생성한 iterator는 위에서 만든 vInteger 벡터 배열 전용이 아니라 그냥 자료형이 int인 벡터 배열이면 어디든지 사용할 수 있고, 재활용도 물론 가능하다.
*iterator의 사용
iterator을 사용하기 위해서는 다음과 같은 명령을 내려준다. 주로 사용하게 될 for문에서의 사용 예시이다.
- 먼저 이터레이터를 원하는 지점에 꽂아준다.
1 2 3 4 | for(itor = vInteger.begin() ; ; ){ } | cs |
이렇게 꽂힌다.
- 다음은 반복 종료 조건을 설정한다. "배열을 끝까지 전부 돌아라"라는 조건을 설정할텐데, 그러기 위해서는 배열의 끝이 어딘지 아는 것이 필요하다. 위 그림과 같이 Vector배열은 배열의 마지막 요소 다음칸이 자동으로 .end()로 배정이 된다. 따라서 .end()가 나오면 루프를 멈추면 된다. 그러므로
1 2 3 4 | for(itor = vInteger.begin();itor != vInteger.end() ; ){ } | cs |
- 마지막으로 루프 1번당 몇 칸씩 움직일지를 지정한다.
1 2 3 4 | for(itor = vInteger.begin();itor != vInteger.end() ;++itor ){ } | cs |
루프 1번당 1칸씩 움직이라는 소리다. 그림은 생략.
실제로 어떻게 동작하는지 분석하면 다음과 같다.
- 1번째 루프
- 2번째 루프
2번째 루프에서는 for문의 조건인 ++itor에 따라 이터레이터 itor이 앞으로 1칸 이동하여 다음과 같은 위치에 있다. 그에 따라 현재 itor이 가리키는 주소의 값인 *itor은 237이다.
- 3번째 루프
마찬가지로 itor이 한칸 더 이동했고, 그에 따라 *itor은 1981이다.
이하는 마찬가지이므로 생략.
*결론
즉 이터레이터는 "특정 배열 안에 들어가서 해당 배열 방의 주소를 찍어주는 검색 기계"의 개념이다.
본문에서 이터레이터는 설명의 편의를 위해서 배열 안에 들어가서 일을 하는 것처럼 묘사했지만, 사실은 직접 배열안에 들어가는건 아니다. 포인터와 비슷한 개념으로 해당 배열의 시작점을 받아서 배열의 자료형의 데이터 byte 수 만큼 주소를 이동시키며 배열 요소를 가리키는 역할을 한다.
'Programming > C++ 학습노트' 카테고리의 다른 글
[1]. 클래스, STL(vector,list) (0) | 2018.02.13 |
---|