본문으로 건너뛰기
모던 C++LESSON 09

구조적 바인딩: pair와 map 결과를 편하게 꺼내기

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

9강. 구조적 바인딩: pair와 map 결과를 편하게 꺼내기

이번 강의에서 해결할 문제​

pair.first, pair.second만 보면 어느 쪽이 아이템 이름이고 어느 쪽이 수량인지 매번 타입을 확인해야 합니다. map::emplace가 반환하는 두 값도 번호나 임시 객체로 접근하면 성공 여부가 잘 드러나지 않습니다.

학습 목표​

  • 구조적 바인딩으로 묶인 값을 이름별로 분해합니다.
  • map 원소를 복사하지 않고 읽습니다.
  • 삽입 결과의 반복자와 성공 여부를 구분합니다.

먼저 알아야 할 핵심 개념​

C++17 구조적 바인딩은 배열, pair, tuple, 공개 멤버가 있는 구조체의 구성 요소를 auto [a, b] 형태로 받습니다. const auto& [name, count]처럼 참조를 사용하면 원본을 복사하지 않고 읽을 수 있습니다.

가장 작은 실행 가능한 예제​

structured_inventory.cpp
#include <iostream>
#include <map>
#include <string>

int main() {
std::map<std::string, int> inventory{{"Potion", 2}, {"Sword", 1}};

for (const auto& [name, count] : inventory) {
std::cout << name << ':' << count << '\n';
}

const auto [position, inserted] = inventory.emplace("Potion", 5);
std::cout << position->first << ' ' << std::boolalpha << inserted << '\n';
}

핵심 코드 줄별 설명​

  1. map 원소는 키와 값이 묶인 pair 형태입니다.
  2. [name, count]는 first, second에 의미 있는 이름을 줍니다.
  3. const auto&는 문자열과 수량 쌍을 복사하지 않습니다.
  4. emplace 결과는 원소 위치와 새 삽입 성공 여부입니다.
  5. 같은 키 Potion이 이미 있어 inserted는 false입니다.

실행 결과와 값 변화​

Potion:2
Sword:1
Potion false

삽입 키를 Shield로 바꾸면 새 원소가 생기고 inserted는 true가 됩니다. 반환된 position은 기존 또는 새 원소를 모두 가리킵니다.

단계별 실습​

실습 목표​

플레이어별 점수 표를 구조적 바인딩으로 출력합니다.

시작 전 상태와 실행 방법​

map<string, int> scores에 플레이어 두 명을 넣습니다.

1단계: 최소 코드 작성​

const auto& [player, score]로 모든 항목을 출력합니다.

2단계: 값 또는 조건을 바꿔 결과 비교​

기존 이름과 새 이름을 각각 emplace해 성공 여부를 비교합니다.

3단계: 작은 기능 확장​

삽입에 실패하면 기존 점수에 10을 더하는 분기를 작성합니다.

4단계: 스스로 해결하기​

함수가 pair<int, bool>을 반환하도록 만들고 두 결과에 의미 있는 이름을 붙여 사용하세요.

막혔을 때​

구조적 바인딩 문법 오류가 나면 C++17 표준 설정을 확인합니다. map 출력 순서는 삽입 순서가 아니라 키 정렬 순서입니다.

흔한 실수와 해결 방법​

  • auto [name, count]로 큰 값을 복사: 원본 읽기라면 const auto&를 고려합니다.
  • map 순서를 삽입 순서로 가정: map은 키 순서이며 unordered_map은 안정된 순서를 보장하지 않습니다.
  • 반환값 의미를 모른 채 분해: API가 각 구성 요소에 무엇을 담는지 먼저 확인합니다.

게임 개발 연결​

플레이어 ID와 점수, 아이템 ID와 수량처럼 키·값 데이터를 읽을 때 유용합니다. Unreal의 TPair와 컨테이너 반복 문법은 표준 라이브러리와 다를 수 있으므로 엔진 API 예제를 확인합니다.

이해 점검 질문 3개​

  1. 구조적 바인딩이 first, second보다 읽기 좋은 이유는 무엇인가요?
  2. 분해 선언에 const auto&를 사용하는 이유는 무엇인가요?
  3. map::emplace의 두 반환값은 각각 무엇을 뜻하나요?

핵심 요약​

구조적 바인딩은 묶인 데이터의 구성 요소에 문맥에 맞는 이름을 줍니다. 복사 여부와 API 반환 계약을 확인한 뒤 값 또는 참조로 분해합니다.

다음 강의 연결​

10강. 람다 표현식에서 지역 조건을 이름 없는 함수 객체로 만들어 알고리즘에 전달합니다.

MINI QUIZ

구조적 바인딩: pair와 map 결과를 편하게 꺼내기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“구조적 바인딩: pair와 map 결과를 편하게 꺼내기” 기능을 확장하기 좋은 구조로 설명한 것은 무엇인가요?
  2. 문제 2‘반환값 의미를 모른 채 분해’ 실수를 판단할 때 “구조적 바인딩: pair와 map 결과를 편하게 꺼내기” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

9강. 구조적 바인딩: pair와 map 결과를 편하게 꺼내기 미완료 상태