이 페이지에서

Qt의 foreach 키워드

foreach 키워드

참고: foreach키워드는 C++11의 범위 기반 루프가 등장하기 전에 도입되었습니다. 새로운 코드를 작성할 때는 C++11의 범위 기반 루프를 우선적으로 사용해야 합니다.

foreach 키워드는 C++ 언어에 Qt에서 추가한 것으로, 전처리기를 사용하여 구현됩니다.

구문은 다음과 같습니다: foreach (변수, 컨테이너) 문. 예를 들어, foreach 를 사용하여 QList<QString>를 반복 처리하는 방법은 다음과 같습니다:

QList<QString> values;
//...
QString str;
foreach (str, values)
    qDebug() << str;

foreach 코드는 이터레이터를 사용하는 동등한 코드보다 훨씬 짧습니다:

QList<QString> values;
//...
QListIterator<QString> i(values);
while (i.hasNext()) {
    QString s = i.next();
    qDebug() << s;
}

데이터 유형에 쉼표(예: std::pair<int, int>)가 포함되어 있지 않은 경우, 반복에 사용되는 변수는 foreach 문 내에서 정의할 수 있습니다:

QList<QString> values;
//...
foreach (const QString&str, values)
    qDebug() << str;

다른 C++ 루프 구조와 마찬가지로, ` foreach ` 루프의 본문 주변에 중괄호를 사용할 수 있으며, ` break `를 사용하여 루프를 빠져나올 수 있습니다:

QList<QString> values;
//...
foreach (const QString&str, values) {
    if (str.isEmpty())
        break;
    qDebug() << str;
}

QMap 와 QHash 를 사용할 경우, foreach 은 (key, value) 쌍의 값 구성 요소에 자동으로 접근하므로, 컨테이너에 대해 values()를 호출해서는 안 됩니다(불필요한 복사가 발생하기 때문이며, 아래를 참조하십시오). 키와 값을 모두 반복 처리하려면 이터레이터를 사용할 수 있습니다(이터레이터가 더 빠릅니다). 또는 키를 먼저 얻은 다음, 이를 활용하여 값도 함께 가져올 수 있습니다:

QMap<QString, int> map;
//...
foreach (const QString&str, map.keys())
    qDebug() << str << ':' << map.value(str);

다중값 함수의 경우:

QMultiMap<QString, int> map;
//...
foreach (const QString&str, map.uniqueKeys()) {
    foreach (int i, map.values(str))
        qDebug() << str << ':' << i;
}

Qt는 foreach 루프에 진입할 때 컨테이너의 복사본을 자동으로 생성합니다. 반복 처리 중에 컨테이너를 수정하더라도 루프에는 영향을 미치지 않습니다. (컨테이너를 수정하지 않더라도 복사는 여전히 수행되지만, 암시적 공유 덕분에 컨테이너 복사 속도는 매우 빠릅니다.)

foreach는 컨테이너의 복사본을 생성하므로, 변수에 const가 아닌 참조를 사용하면 원본 컨테이너를 수정할 수 없습니다. 이는 복사본에만 영향을 미치는데, 이는 아마도 여러분이 원하는 바가 아닐 것입니다.

Qt의 ` foreach ` 루프에 대한 대안으로는 C++11 및 그 이후 버전에 포함된 범위 기반 ` for `가 있습니다. 다만, 범위 기반 ` for `는 Qt 컨테이너의 분리( detach)를 강제할 수 있는 반면, ` foreach `는 그렇지 않다는 점을 유의해야 합니다. 하지만 ` foreach `를 사용하면 항상 컨테이너가 복사되는데, 이는 일반적으로 STL 컨테이너의 경우 비용이 많이 듭니다. 확실하지 않은 경우에는 Qt 컨테이너의 경우 foreach 를, STL 컨테이너의 경우 범위 기반 for 를 사용하는 것이 좋습니다.

QT_NO_FOREACH 매크로를 정의하면 Qt의 foreach 루프를 사용할 수 없도록 할 수 있습니다.

© 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.