구조화된 바인딩
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 88번째.
Structured bindings은 C++17에서 도입되었으며, 한 번의 선언으로 배열, pair, tuple 또는 구조체의 여러 값을 개별적인 이름이 지정된 변수로 풀어낼 수 있게 해줍니다. 따라서 복합 데이터를 다룰 때 코드를 더 깔끔하고 읽기 쉽게 만들 수 있습니다.
이 구문은 새 변수 이름을 포함하는 대괄호와 함께 auto를 사용합니다:
#include <iostream>
#include <map>
#include <tuple>
int main() {
// pair 언패킹
std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;
std::cout << name << " is " << age << "\n";
// tuple 언패킹
std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;
// 범위 기반 for 루프에서 언패킹
std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
std::cout << student << ": " << score << "\n";
}
}구조적 바인딩은 배열 및 public 멤버를 가진 사용자 정의 구조체에서도 작동합니다:
struct Point {
double x;
double y;
};
Point getOrigin() { return {0.0, 0.0}; }
int main() {
auto [x, y] = getOrigin();
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;
}auto& 또는 const auto&를 사용하여 참조로 바인딩하면 복사를 피하고 필요할 때 원래 값을 수정할 수 있습니다. 이 기능은 STL 컨테이너를 순회하거나 여러 값을 반환하는 함수를 처리할 때 특히 유용합니다.
챌린지
쉬움구조적 바인딩의 강력한 기능을 보여 주는 학생 성적 분석기를 만들어 봅시다. 학생 기록과 과목 데이터를 처리하는 시스템을 만들고, 코드 전체에서 구조적 바인딩을 사용하여 pair, tuple, struct를 우아하게 풀어낼 것입니다.
코드를 세 개의 파일로 구성합니다.
Student.h: 학생의 이름(std::string), ID(int), GPA(double)를 위한 public 멤버를 포함하는Studentstruct를 Define합니다. 또한 이름, ID, GPA를 인수로 받아Studentstruct를 반환하는createStudent라는 function을 만듭니다.GradeUtils.h: 성적 처리를 위한 유틸리티 function을 만듭니다.숫자 점수(정수)를 인수로 받아 세 가지 값, 즉 문자 성적(
std::string), 성적 점수(double), 그리고 합격 여부(bool)를 포함하는std::tuple을 반환하는getGradeInfofunction을 Define합니다. 다음 성적 기준을 사용합니다.- 90 이상: "A", 4.0, true
- 80-89: "B", 3.0, true
- 70-79: "C", 2.0, true
- 60-69: "D", 1.0, true
- Below 60: "F", 0.0, false
또한 과목 이름(
std::string)과 점수(int)를 인수로 받아 해당 값들로 구성된std::pair를 반환하는makeScorePairfunction을 Define합니다.main.cpp: 네 개의 입력을 읽습니다.- 학생 이름(string)
- 학생 ID(정수)
- 과목 이름(string)
- 점수(정수)
main function 전체에서 구조적 바인딩을 사용합니다.
- 이름, ID, 그리고 placeholder GPA 0.0을 사용하여
createStudent를 Call합니다. 구조적 바인딩을 사용하여 반환된 struct를 개별 변수로 풀어낸 다음, 다음을 출력합니다:Student: [name] (ID: [id]) - 과목 이름과 점수를 사용하여
makeScorePair를 Call합니다. 구조적 바인딩을 사용하여 pair를 풀어낸 다음, 다음을 출력합니다:Course: [course], Score: [score] - 점수를 사용하여
getGradeInfo를 Call합니다. 구조적 바인딩을 사용하여 세 tuple 요소를 모두 풀어낸 다음, 다음을 출력합니다.(합격 여부가 true이면 "yes"를, false이면 "no"를 출력합니다.)Grade: [letter] Points: [points] Passing: [yes/no]
예를 들어 입력이 Alice, 1001, Math, 85인 경우:
Student: Alice (ID: 1001)
Course: Math, Score: 85
Grade: B
Points: 3
Passing: yes입력이 Bob, 2002, Physics, 55인 경우:
Student: Bob (ID: 2002)
Course: Physics, Score: 55
Grade: F
Points: 0
Passing: no필요한 곳에 <tuple>과 <utility>를 include하는 것을 잊지 마세요. 핵심은 구조적 바인딩을 사용하면 composite type, pair, tuple, struct를 한 번에 읽기 쉬운 선언으로 named variable에 풀어낼 수 있다는 점입니다.
직접 해보기
#include <iostream>
#include <string>
#include "Student.h"
#include "GradeUtils.h"
int main() {
// 입력 읽기
std::string studentName;
int studentId;
std::string courseName;
int score;
std::cin >> studentName;
std::cin >> studentId;
std::cin >> courseName;
std::cin >> score;
// TODO: name, id 및 플레이스홀더 GPA 0.0으로 createStudent 호출
// 구조적 바인딩을 사용하여 구조체 언팩: auto [name, id, gpa] = ...
// 출력: Student: [name] (ID: [id])
// TODO: course name과 score로 makeScorePair 호출
// 구조적 바인딩을 사용하여 pair 언팩: auto [course, sc] = ...
// 출력: Course: [course], Score: [score]
// TODO: score로 getGradeInfo 호출
// 구조적 바인딩을 사용하여 튜플 언팩: auto [letter, points, passing] = ...
// 출력:
// Grade: [letter]
// Points: [points]
// Passing: [yes/no] (passing이 true이면 "yes"를, false이면 "no"를 출력)
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러