Chaining(체이닝)은 C++에서 입출력 연산을 연속적으로 연결하는 기법이다. 이를 통해 여러 개의 입력 또는 출력 연산을 한 줄로 연결하여 처리할 수 있다. C++에서 체이닝은 주로 스트림(stream) 연산자를 통해 이루어지며, 이러한 방식이 가능한 이유는 연산자 오버로딩과 연속적인 반환 덕분이다.
체이닝은 여러 개의 입출력 연산을 한 줄에서 처리하는 방식으로, 각 연산이 스트림 객체를 반환하기 때문에 가능하다. 예를 들어, cin과 cout에서 체이닝을 사용할 수 있다. 연산자를 통해 데이터를 입력받거나 출력한 후, 다시 스트림 객체 자체를 반환하므로 다음 연산이 연속적으로 이어질 수 있다.
#include <iostream>
int main() {
int a, b;
std::cout << "Enter two numbers: ";
std::cin >> a >> b; // 체이닝을 통해 두 값을 한 줄에서 입력받음
std::cout << "You entered: " << a << " and " << b << std::endl;
return 0;
}
이 코드에서 std::cin >> a >> b는 체이닝의 예시로, 한 줄에서 두 개의 값을 연속적으로 입력받는 동작을 한다. 마찬가지로 std::cout << "You entered: " << a << " and " << b << std::endl;도 여러 개의 출력을 연속적으로 처리한다.
체이닝은 연산자 오버로딩을 통해 동작한다. C++에서 >>(입력 연산자)와 <<(출력 연산자)는 연산자 오버로딩되어 있으며, 이러한 연산자가 스트림 객체를 반환하기 때문에 여러 번의 입출력 작업을 하나의 연산으로 연결할 수 있다.
std::cin >> a >> b; // a에 값을 입력한 후, 반환된 cin 객체로 b에 값을 입력받음
std::cout << a << " " << b; // a를 출력한 후, 반환된 cout 객체로 b를 출력함
C++에서 >>와 << 연산자는 표준 라이브러리에서 오버로딩되어 있다. 이 연산자들은 스트림 객체를 인자로 받아 작업을 수행한 후, 그 스트림 객체를 그대로 반환한다. 반환된 객체는 이후 추가적인 연산에 다시 사용될 수 있다.
#include <iostream>
class MyStream {
public:
MyStream& operator<<(int value) {
std::cout << "Value: " << value << std::endl;
return *this; // 현재 객체를 반환
}
};
int main() {
MyStream stream;
stream << 10 << 20 << 30; // 체이닝
return 0;
}
위 코드에서 operator<<는 현재 객체(*this)를 반환한다. 이렇게 함으로써 다음 출력 연산도 이어서 가능해진다. stream << 10 << 20 << 30;은 결국 세 번의 출력을 연속적으로 수행하면서, 각 연산 후 현재 스트림 객체를 반환하여 다음 연산을 가능하게 한다.
std::cin >> x >> y >> z;
위 코드는 x, y, z에 대한 입력을 한 번에 처리하며, 이는 세 줄로 나누는 것보다 간결하다.
체이닝은 단순한 입출력 외에도 여러 곳에서 유용하게 사용된다. 예를 들어, 파일 스트림에서도 체이닝을 통해 여러 파일 처리 작업을 연속적으로 수행할 수 있다.
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("example.txt");
if (file) {
file << "First line" << std::endl
<< "Second line" << std::endl
<< "Third line" << std::endl;
}
file.close();
return 0;
}
이 예에서는 여러 줄의 데이터를 하나의 출력 스트림(file)에 연속적으로 쓰고 있다. 각 출력 연산 후 스트림 객체가 반환되므로 다음 출력 연산을 이어서 수행할 수 있다.
if (std::cin >> a >> b >> c) {
// 입력 성공
} else {
// 입력 실패 시 처리
}