Priv's Blog

구조화된 바인딩 본문

Dev. Study Note/C++

구조화된 바인딩

Priv 2023. 12. 24. 22:12


 

 

1. 함수의 반환 값과 구조화된 바인딩

함수는 값을 반환할 수 있으나, 무조건 1개의 값만 반환할 수 있습니다.

하지만 함수의 반환값은 많음 멤버를 포함하는 객체 1개일 수도 있습니다.

Python에서 다루는 튜플(Tuple)처럼 여러 값을 묶어 하나의 객체로 다루는 기능을 C++에서도 제공합니다.

#include <iostream>

using namespace std;

struct Entry {
    string name;
    int value;
};

Entry read_entry(istream& is) {
    string s;
    int i;
    is >> s >> i;
    
    return {s, i};
}



int main() {
    cout << "Hello, world!" << "\n";
    
    auto e = read_entry(cin);
    
    cout << e.name << ", " << e.value << endl;
    
    
    return 0;
}

구조체 Entry를 반환하는 read_entry 함수는 {s, i} 형태로 값을 반환합니다.

여기서 s와 i는 Entry 구조체의 name과 value가 됩니다.

즉, Entry 타입의 반환 값을 {s, i}를 통해 생성한 것입니다.

이와 반대로 Entry의 멤버를 지역 변수로 언팩(unpack)할 수도 있습니다.

auto [n, v] = read_entry(is);
cout << n << ", " << v << endl;

위 코드는 read_entry( ) 함수를 실행하여 나온 반환 값을 가지고 n과 v 변수의 타입을 유추해 매핑합니다.

이처럼 클래스 객체 멤버의 지역적인 이름을 부여하는 방식을 구조화된 바인딩이라고 부릅니다.

map<string, int> m

for (const auto[key, value] : m) {
    cout << key << ", " << value << endl;
}

바인딩 안에 정의된 이름의 개수는 클래스에 존재하는 비정적 데이터 멤버의 수와 같아야 합니다.

이때, 바인딩 이름은 해당하는 멤버의 이름으로 사용됩니다.

객체 코드의 품질 면에서 객체의 멤버를 직접 지칭하는 것과 구조회된 바인딩을 사용하는 것은 사실상 차이가 없습니다.

하지만 아이디어를 보다 잘 표현할 수 있다는 점 때문에 구조화된 바인딩을 활용할 것을 권장하고 있습니다.

complex<double> z = {1, 2};
auto [re, im] = z + 2;

 

위와 같이 구조화된 바인딩은 멤버 함수를 통해 접근되는 클래스를 다루는 것도 가능합니다.

 


 


수고하셨습니다!


'Dev. Study Note > C++' 카테고리의 다른 글

2D Array Row, Column  (0) 2024.01.23
friend 키워드  (0) 2024.01.10
클래스  (0) 2023.12.27
C++의 하드웨어 대응  (0) 2023.12.17
auto 타입을 사용할 '특별한 이유'  (0) 2023.12.17
Comments