C++17에서 도입된 구조적 바인딩(structured binding)은 여러 값을 간단하고 직관적인 문법으로 한 번에 변수로 분해할 수 있게 해주는 기능입니다. 이는 튜플, 구조체, 배열 등의 복합 데이터 타입을 더 쉽게 다룰 수 있도록 도와줍니다.
js에서만 구조적 바인딩 같은 문법이 존재한다고 생각했는데, 그냥 제 공부가 부족한 것 이었습니다.
구조적 바인딩의 기본 개념
구조적 바인딩을 사용하면 auto를 이용해 여러 개의 변수를 동시에 선언하고 초기화할 수 있습니다. 일반적으로는 복합 데이터 구조에서 개별 요소에 접근할 때 일일이 인덱스나 멤버 이름을 지정해야 했지만, 구조적 바인딩을 통해 각 요소를 한꺼번에 각각의 이름으로 할당할 수 있습니다.
구조적 바인딩의 문법
구조적 바인딩을 사용하려면 다음과 같은 문법을 사용합니다:
auto [var1, var2, ..., varN] = expression;
여기서 expression은 분해할 수 있는 복합 데이터 타입이어야 하며, var1, var2 등은 expression이 반환하는 개별 요소를 담을 변수를 지정합니다.
예제 1: 튜플에서의 구조적 바인딩
std::tuple을 사용하여 반환된 여러 값을 분해할 수 있습니다.
#include <iostream>#include <tuple>using namespace std;
tuple<int, double, string> getData() {
return {42, 3.14, "Hello"};
}
int main() {
auto [number, pi, text] = getData(); // 튜플의 요소들을 각각 변수에 바인딩
cout << "Number: " << number << endl;
cout << "Pi: " << pi << endl;
cout << "Text: " << text << endl;
return 0;
}
위 코드에서는 getData() 함수가 std::tuple<int, double, string>을 반환하고, main 함수에서 구조적 바인딩을 사용하여 반환된 값을 각각 number, pi, text라는 변수에 분해해 저장합니다.
예제 2: 구조체에서의 구조적 바인딩
구조적 바인딩은 구조체와 클래스에서도 사용할 수 있습니다. 멤버 변수가 public이고, 구조체의 순서대로 멤버 변수를 바인딩할 수 있습니다.
#include <iostream>#include <string>using namespace std;
struct Person {
string name;
int age;
};
int main() {
Person person{"Alice", 30};
auto [name, age] = person; // 구조체 멤버를 각각 바인딩
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
return 0;
}
위의 코드에서는 Person 구조체의 멤버인 name과 age를 auto [name, age] = person;을 통해 각각의 이름으로 바인딩했습니다.
예제 3: 배열에서의 구조적 바인딩
배열에서도 구조적 바인딩을 사용할 수 있습니다. 배열의 크기를 정확하게 지정해야 합니다.
#include <iostream>using namespace std;
int main() {
int arr[3] = {10, 20, 30};
auto [a, b, c] = arr; // 배열의 요소들을 각각 바인딩
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
return 0;
}
이 코드에서는 배열 arr의 각 요소를 각각 a, b, c로 바인딩하여 값에 접근했습니다.
예제 4: std::pair 사용
구조적 바인딩은 std::pair와도 잘 어울립니다.
#include <iostream>#include <map>using namespace std;
int main() {
map<int, string> data = {{1, "One"}, {2, "Two"}, {3, "Three"}};
for (const auto& [key, value] : data) {
cout << "Key: " << key << ", Value: " << value << endl;
}
return 0;
}
여기서는 std::map의 각 요소를 구조적 바인딩을 통해 key와 value로 바인딩하여 사용했습니다.
구조적 바인딩의 장점
- 가독성 향상: 여러 변수를 한 번에 선언하고, 의미 있는 이름으로 접근할 수 있습니다.
- 코드 간결화: 복잡한 튜플이나 데이터 구조에서 값을 추출할 때 필요한 중복 코드를 줄일 수 있습니다.
- 사용 편의성: 함수에서 여러 값을 반환할 때 사용하면 편리합니다.
주의사항
- 구조적 바인딩을 사용하려면 C++17 이상을 지원하는 컴파일러가 필요합니다.
- 구조체나 클래스 멤버 변수가 public이어야 하며, 배열의 경우 크기가 맞지 않으면 컴파일 오류가 발생합니다.
구조적 바인딩은 코드를 더욱 직관적으로 작성할 수 있도록 돕는 C++17의 강력한 기능입니다. 복합 데이터를 다룰 때 유용하게 사용할 수 있습니다.
'C++ STL, 알고리즘' 카테고리의 다른 글
파라미터 참조형 vs 포인터 (0) | 2024.10.14 |
---|---|
참조형 & (0) | 2024.10.07 |
c++ 구조적 바인딩 (0) | 2024.10.07 |
++i vs i++ 누가 일반적인가. (0) | 2024.10.07 |
Optional Type (0) | 2024.10.07 |