Menu
Coddy logo textTech

스트림 연산자

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 43번째.

스트림 삽입(<<) 및 추출(>>) 연산자를 사용하면 사용자 정의 클래스를 std::coutstd::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로 두 개의 정수를 읽어들임
challenge icon

챌린지

쉬움

스트림 연산자 오버로딩을 통해 std::coutstd::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::fixedstd::setprecision(1)을 사용하세요. 헤더 파일에 헤더 가드(header guards)를 포함하는 것을 잊지 마세요.

치트 시트

스트림 삽입(<<) 및 추출(>>) 연산자를 사용하면 사용자 정의 클래스가 std::coutstd::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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨