본문 바로가기
C++ STL, 알고리즘

c++ 구조적 바인딩

by wanna_dev 2024. 10. 7.

 

 

C++17에서 도입된 구조적 바인딩(structured binding)은 여러 값을 간단하고 직관적인 문법으로 한 번에 변수로 분해할 수 있게 해주는 기능입니다. 이는 튜플, 구조체, 배열 등의 복합 데이터 타입을 더 쉽게 다룰 수 있도록 도와줍니다.

구조적 바인딩의 기본 개념

구조적 바인딩을 사용하면 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
++i vs i++ 누가 일반적인가.  (0) 2024.10.07
Optional Type  (0) 2024.10.07
가상 베이스 클래스 (다이아몬드 상속 해결)  (0) 2024.10.07