스트림 연산자
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 43번째.
스트림 삽입(<<) 및 추출(>>) 연산자를 사용하면 사용자 정의 클래스를 std::cout 및 std::cin과 함께 사용할 수 있습니다. 지금까지 살펴본 연산자들과 달리, 왼쪽 피연산자가 클래스가 아닌 스트림이기 때문에 이 연산자들은 비멤버 함수(non-member functions)로 구현되어야 합니다.
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
// private 멤버에 접근하기 위해 friend로 선언
friend std::ostream& operator<<(std::ostream& os, const Point& p);
friend std::istream& operator>>(std::istream& is, Point& p);
};
std::ostream& operator<<(std::ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
std::istream& operator>>(std::istream& is, Point& p) {
is >> p.x >> p.y;
return is;
}두 연산자 모두 스트림에 대한 참조를 반환하여 std::cout << p1 << p2와 같은 체이닝을 가능하게 합니다. 삽입 연산자는 데이터를 읽기만 하므로 객체를 const 참조로 받는 반면, 추출 연산자는 객체를 수정하므로 non-const 참조를 받습니다.
이제 스트림과 함께 Point를 자연스럽게 사용할 수 있습니다:
Point p(3, 4);
std::cout << "Location: " << p << std::endl; // 출력: Location: (3, 4)
Point p2(0, 0);
std::cin >> p2; // p2로 두 개의 정수를 읽어들임챌린지
쉬움스트림 연산자 오버로딩을 통해 std::cout 및 std::cin과 함께 원활하게 사용할 수 있는 Temperature 클래스를 만들어 보겠습니다. 이는 온도를 읽기 쉬운 형식으로 표시하고 입력으로부터 자연스럽게 읽어오고 싶을 때 유용한 실무적인 시나리오입니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Temperature.h: 섭씨 온도 값(double)과 단위 레이블(섭씨의 경우'C', 화씨의 경우'F'인char)을 저장하는Temperature클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- 온도 값과 단위를 위한 private 멤버
- 0.0 섭씨로 초기화하는 기본 생성자
- 값과 단위를 매개변수로 받는 생성자
- 게터(Getter)인
getValue()및getUnit()(둘 다 const) - 스트림 삽입(
<<) 및 추출(>>) 연산자를 위한 friend 선언
스트림 연산자를 비멤버 함수로 구현하세요:
- 삽입 연산자는 온도를
VALUE UNIT형식(예:25.5 C또는77.9 F)으로 출력해야 합니다. 값은 소수점 첫째 자리까지 표시하세요. - 추출 연산자는 스트림에서 값과 단위 문자를 읽어 Temperature 객체에 저장해야 합니다.
두 연산자 모두 체이닝(chaining)이 가능하도록 스트림에 대한 참조를 반환해야 합니다.
main.cpp: 입력에서 두 개의 온도를 읽습니다. 각 온도는value unit형식(예:25.5 C)으로 별도의 줄에 제공됩니다.추출 연산자를 사용하여
std::cin으로부터 두 개의Temperature객체를 생성하여 읽어옵니다. 그런 다음 삽입 연산자를 사용하여 다음 형식으로 출력합니다:Temperature 1: <temp1> Temperature 2: <temp2>예를 들어, 입력이 다음과 같다면:
25.5 C 98.6 F출력은 다음과 같아야 합니다:
Temperature 1: 25.5 C Temperature 2: 98.6 F
온도 값을 정확히 소수점 첫째 자리까지 형식화하려면 <iomanip>의 std::fixed와 std::setprecision(1)을 사용하세요. 헤더 파일에 헤더 가드(header guards)를 포함하는 것을 잊지 마세요.
치트 시트
스트림 삽입(<<) 및 추출(>>) 연산자를 사용하면 사용자 정의 클래스가 std::cout 및 std::cin과 함께 작동할 수 있습니다. 왼쪽 피연산자가 클래스가 아닌 스트림 객체이기 때문에 이러한 연산자는 비멤버 함수로 구현되어야 합니다.
기본 구문
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
// 프라이빗 멤버에 접근하기 위해 friend로 선언
friend std::ostream& operator<<(std::ostream& os, const Point& p);
friend std::istream& operator>>(std::istream& is, Point& p);
};
std::ostream& operator<<(std::ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
std::istream& operator>>(std::istream& is, Point& p) {
is >> p.x >> p.y;
return is;
}주요 사항
- 두 연산자 모두 체이닝(예:
std::cout << p1 << p2)을 가능하게 하기 위해 스트림에 대한 참조를 반환합니다. - 삽입 연산자(
<<)는 데이터를 읽기만 하므로 객체를const참조로 받습니다. - 추출 연산자(
>>)는 객체를 수정하므로 비-const 참조를 받습니다. - 이러한 비멤버 함수가 프라이빗 멤버에 접근할 수 있도록
friend선언을 사용합니다.
사용 예시
Point p(3, 4);
std::cout << "Location: " << p << std::endl; // 출력: Location: (3, 4)
Point p2(0, 0);
std::cin >> p2; // p2에 두 개의 정수를 읽어들임직접 해보기
#include <iostream>
#include "Temperature.h"
int main() {
// TODO: 두 개의 Temperature 객체 생성
// TODO: 추출 연산자(>>)를 사용하여 std::cin에서 두 개의 온도를 읽기
// TODO: 삽입 연산자(<<)를 사용하여 온도 출력
// 형식:
// Temperature 1: <temp1>
// Temperature 2: <temp2>
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.