구조적 바인딩: pair와 map 결과를 편하게 꺼내기
9강. 구조적 바인딩: pair와 map 결과를 편하게 꺼내기
이번 강의에서 해결할 문제
pair.first, pair.second만 보면 어느 쪽이 아이템 이름이고 어느 쪽이 수량인지 매번 타입을 확인해야 합니다. map::emplace가 반환하는 두 값도 번호나 임시 객체로 접근하면 성공 여부가 잘 드러나지 않습니다.
학습 목표
- 구조적 바인딩으로 묶인 값을 이름별로 분해합니다.
map원소를 복사하지 않고 읽습니다.- 삽입 결과의 반복자와 성공 여부를 구분합니다.
먼저 알아야 할 핵심 개념
C++17 구조적 바인딩은 배열, pair, tuple, 공개 멤버가 있는 구조체의 구성 요소를 auto [a, b] 형태로 받습니다. const auto& [name, count]처럼 참조를 사용하면 원본을 복사하지 않고 읽을 수 있습니다.
가장 작은 실행 가능한 예제
#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';
}
핵심 코드 줄별 설명
map원소는 키와 값이 묶인 pair 형태입니다.[name, count]는first,second에 의미 있는 이름을 줍니다.const auto&는 문자열과 수량 쌍을 복사하지 않습니다.emplace결과는 원소 위치와 새 삽입 성공 여부입니다.- 같은 키
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개
- 구조적 바인딩이
first,second보다 읽기 좋은 이유는 무엇인가요? - 분해 선언에
const auto&를 사용하는 이유는 무엇인가요? map::emplace의 두 반환값은 각각 무엇을 뜻하나요?
핵심 요약
구조적 바인딩은 묶인 데이터의 구성 요소에 문맥에 맞는 이름을 줍니다. 복사 여부와 API 반환 계약을 확인한 뒤 값 또는 참조로 분해합니다.
다음 강의 연결
10강. 람다 표현식에서 지역 조건을 이름 없는 함수 객체로 만들어 알고리즘에 전달합니다.
구조적 바인딩: pair와 map 결과를 편하게 꺼내기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.