이 페이지에서

Qt의 Java 스타일 반복자

Java 스타일의 이터레이터

각 컨테이너 클래스마다 두 가지 자바 스타일 이터레이터 데이터 유형이 있습니다. 하나는 읽기 전용 액세스를 제공하고, 다른 하나는 읽기-쓰기 액세스를 제공합니다.

참고: 새로운 코드에서는 STL 스타일의 이터레이터를 사용해야 합니다. STL 스타일 이터레이터가 더 효율적이며 Qt XML 및 STL의 ` generic algorithms`과 함께 사용할 수 있기 때문입니다.

컨테이너읽기 전용 반복자읽기-쓰기 이터레이터
QList<T>, QQueue<T>, QStack<T>,QListIterator<T>QMutableListIterator<T>
QSet<T>QSetIterator<T>QMutableSetIterator<T>
QMap<Key, T>, QMultiMap<Key, T>QMapIterator<Key, T>QMutableMapIterator<Key, T>
QHash<Key, T>, QMultiHash<Key, T>QHashIterator<Key, T>QMutableHashIterator<Key, T>

이 논의에서는 QList 와 QMap 에 집중할 것입니다. QSet 의 반복자 유형은 QList 의 반복자와 정확히 동일한 인터페이스를 가집니다. 마찬가지로, QHash 의 반복자 유형은 QMap 의 반복자와 동일한 인터페이스를 가집니다.

STL 스타일의 이터레이터와 달리, Java 스타일의 이터레이터는 항목을 직접 가리키기보다는 항목 사이를 가리킵니다. 이러한 이유로, 이터레이터는 컨테이너의 맨 처음(첫 번째 항목 앞), 맨 끝(마지막 항목 뒤), 또는 두 항목 사이를 가리킵니다. 아래 다이어그램은 네 개의 항목을 포함하는 리스트에서 유효한 이터레이터 위치를 빨간색 화살표로 표시하고 있습니다:

항목 A, B, C, D 사이의 이터레이터 위치

다음은 QList<QString>의 모든 요소를 순서대로 순회하는 일반적인 루프입니다:

QList<QString> list = {"A", "B", "C", "D"};

QListIterator<QString> i(list);
while (i.hasNext())
    QString s = i.next();

작동 방식은 다음과 같습니다. 반복할 QList 가 QListIterator 생성자에 전달됩니다. 이 시점에서 이터레이터는 목록의 첫 번째 항목 바로 앞(항목 "A" 앞)에 위치합니다. 그런 다음 hasNext()를 호출하여 이터레이터 뒤에 항목이 있는지 확인합니다. 만약 있다면, next()를 호출하여 해당 항목을 건너뜁니다. next() 함수는 건너뛴 항목을 반환합니다. QList<QString>의 경우, 해당 항목의 타입은 QString 입니다.

QList 에서 뒤로 반복하는 방법은 다음과 같습니다:

QListIterator<QString> i(list);
i.toBack();
while (i.hasPrevious())
    QString s = i.previous();

이 코드는 정방향 반복과 대칭적이지만, toBack()를 호출하여 이터레이터를 리스트의 마지막 항목 뒤쪽으로 이동시키는 것으로 시작한다는 점이 다릅니다.

아래 다이어그램은 next() 및 previous() 호출이 이터레이터에 미치는 영향을 보여줍니다:

다음 항목과 이전 항목으로 이동하기

다음 표는 ` QListIterator ` API를 요약한 것입니다:

함수동작
toFront()이터레이터를 목록의 맨 앞(첫 번째 항목 앞)으로 이동합니다.
toBack()이테레이터를 리스트의 맨 뒤(마지막 항목 뒤)로 이동시킵니다.
hasNext()이터레이터가 리스트의 끝이 아닐 경우 ` true `를 반환합니다
next()다음 항목을 반환하고 이터레이터를 한 칸 앞으로 이동시킵니다
peekNext()이테레이터를 이동시키지 않고 다음 항목을 반환합니다.
hasPrevious()이터레이터가 목록의 맨 앞에 있지 않은 경우 ` true `를 반환합니다
previous()이전 항목을 반환하고 이터레이터를 한 위치 뒤로 이동시킵니다
peekPrevious()이테레이터를 이동시키지 않고 이전 항목을 반환합니다

QListIterator 이터레이션을 수행하는 동안 목록에 항목을 삽입하거나 제거하는 함수는 제공되지 않습니다. 이를 수행하려면 ` QMutableListIterator`을 사용해야 합니다. 다음은 ` QMutableListIterator`을 사용하여 ` QList<int>`에서 모든 홀수를 제거하는 예제입니다:

QMutableListIterator<int> i(list);
while (i.hasNext()) {
    if (i.next() % 2 != 0)
        i.remove();
}

루프 내의 next() 호출은 매번 수행됩니다. 이 호출은 리스트의 다음 항목을 건너뜁니다. remove() 함수는 우리가 건너뛴 마지막 항목을 리스트에서 제거합니다. remove() 호출은 이터레이터를 무효화하지 않으므로, 이터레이터를 계속 사용하는 것이 안전합니다. 이 방법은 역순으로 반복할 때도 똑같이 잘 작동합니다:

QMutableListIterator<int> i(list);
i.toBack();
while (i.hasPrevious()) {
    if (i.previous() % 2 != 0)
        i.remove();
}

단순히 기존 항목의 값을 수정하고 싶다면 setValue()을 사용할 수 있습니다. 아래 코드에서는 128보다 큰 모든 값을 128로 대체합니다:

QMutableListIterator<int> i(list);
while (i.hasNext()) {
    if (i.next() > 128)
        i.setValue(128);
}

remove()와 마찬가지로, setValue()는 우리가 건너뛴 마지막 항목을 대상으로 합니다. 앞으로 반복할 때는 이 항목이 이터레이터 바로 앞의 항목이고, 뒤로 반복할 때는 이터레이터 바로 뒤의 항목입니다.

next() 함수는 리스트 내 항목에 대한 비const 참조를 반환합니다. 간단한 연산의 경우 setValue()을 사용할 필요조차 없습니다:

QMutableListIterator<int> i(list);
while (i.hasNext())
    i.next() *= 2;

앞서 언급했듯이 QSet 의 이터레이터 클래스는 QList 의 이터레이터 클래스와 정확히 동일한 API를 갖습니다. 이제 QMapIterator 으로 넘어가 보겠습니다. 이 함수는 (키, 값) 쌍을 순회하기 때문에 다소 다릅니다.

QListIterator 와 마찬가지로, QMapIterator 는 toFront(), toBack(), hasNext(), next(), peekNext(), hasPrevious(), previous(), peekPrevious()을 제공합니다. 키와 값 구성 요소는 next(), peekNext(), previous(), peekPrevious()가 반환한 객체에 대해 key() 및 value()를 호출하여 추출합니다.

다음 예제는 수도 이름이 "City"로 끝나는 모든 (수도, 국가) 쌍을 제거합니다:

QMap<QString, QString> map = {
    {"Paris", "France"},
    {"Guatemala City", "Guatemala"},
    {"Mexico City", "Mexico"},
    {"Moscow", "Russia"}
};
//...

QMutableMapIterator<QString, QString> i(map);
while (i.hasNext()) {
    if (i.next().key().endsWith("City"))
        i.remove();
}

QMapIterator 또한 이터레이터에 직접 작용하여 이터레이터가 건너뛴 마지막 항목의 키와 값을 반환하는 key() 및 value() 함수도 제공합니다. 예를 들어, 다음 코드는 QMap 의 내용을 QHash 로 복사합니다:

QMap<int, QWidget *> map;
QHash<int, QWidget *> hash;

QMapIterator<int, QWidget *> i(map);
while (i.hasNext()) {
    i.next();
    hash.insert(i.key(), i.value());
}

동일한 값을 가진 모든 항목을 순회하려면 findNext() 또는 findPrevious()를 사용할 수 있습니다. 다음은 특정 값을 가진 모든 항목을 제거하는 예시입니다:

QMutableMapIterator<int, QWidget *> i(map);
while (i.findNext(widget))
    i.remove();

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.