인프런 커뮤니티 질문&답변
9.3 강의 보다가 궁금한 점
작성
·
142
1
class Cents {
private:
int m_cents;
public:
Cents(int cents = 0) {
m_cents = cents;
}
int getCents() const {
return m_cents;
}
int& getCents() {
return m_cents;
}
Cents operator - () const {
return Cents(-m_cents);
}
bool operator ! () const {
return (m_cents == 0) ? true : false;
}
friend std::ostream& operator << (std::ostream &out, const Cents ¢s) {
out << "(" << cents.m_cents << ")";
return out;
}
};
int main() {
Cents cents1(6);
Cents cents2(0);
cout << cents1 << endl;
cout << cents2 << endl;
cout << -cents(-10) << endl;
cout << !cents1 << endl;
cout << !cents2 << endl;
return 0;
}
// 결과
(6)
(0)
(10)
0
1
이렇게 1~3번째와 4,5번째가 다른 이유가 궁금합니다.
답변 1
1
안녕하세요, 질문&답변 도우미 Soobak 입니다.
출력 결과의 첫 번째 ~ 세 번째 줄은
friend std::ostream& operator << (std::ostream &out, const Cents ¢s)
{
out << "(" << cents.m_cents << ")";
return out;
}위의 operator << 연산자에 대한 오버로딩 결과로, Cents 객체의 m_cents 값을 괄호로 둘러싸서 출력하도록 구현되어있기 때문입니다.
네 번째 ~ 다섯 번째 줄은
bool operator ! () const
{
return (m_cents == 0) ? true : false;
}논리 부정 연산자 operator ! 에 대한 오버로딩 결과로, Cents 객체의 m_cents 값이 0 이면 true 를, 그렇지 않으면 false 를 반환합니다.
이 때, bool 값인 true 와 false 는 출력 시 정수로 변환되어 1 과 0 으로 출력됩니다.
따라서, !cents1 은 cents1 의 m_cents 값이 6 이기 때문에 false (즉, 0) 를, !cents2 는 cents2 의 m_cents 값이 0 이기 때문에 true (즉, 1)를 출력합니다.
<< 연산자와 ! 연산자의 오버로딩 구현 부분을 보시면,
<< 연산자는
//...
out << "(" << cents.m_cents << ")";
//...으로, "(" 와 ")" 를 함께 출력하도록 되어 있습니다.
따라서, "(" 와 ")" 와 같이 출력됩니다.
반면, ! 연산자 오버로딩은 단순히 값을 반환하며, 반환된 값에 대하여 표준 출력 << 스트림을 사용하여 출력합니다.! 연산자의 반환값 true 와 false 에 대한 출력은 Cents 객체의 std::ostream& operator << 오버로딩과는 관련이 없으며,
단순히 bool 값의 표준 출력 방식에 따른 것입니다.
(Cents 객체의 오버로딩된 << 연산자를 통해서 직접적으로 출력이 이루어지는 것이 아니라,Cents 객체에 대해 ! 연산자를 사용한 결과를 표준 출력 스트림으로 출력)






감사합니다. 그럼 네번째, 다섯번째에서 (0)과 (1)이 아닌, 0과 1이 출력되는 이유는 뭔가요?