지금도 그런지는 모르겠지만 가정 처음 C를 접할 때 나오는 함수는 “Hello world”를 출력하기 위한 printf()이고, C++ 책에는 같은 기능을 보여 주기 위해 std::cout였다. C++를 배우려고 하는 사람들이 이전의 C와 가장 이질감을 가지는 부분이 이곳인데 시작하면서부터 C와 C++은 문자 하나 출력하는데도 이렇게 다른 것이구나 라고 생각하게 된다.
그런데 나와 나의 주위를 보자면, C++을 사용하는 현업에서도 printf()를 썼으면 썼지 std::cout은 거의 사용하는 사람이 없다. iostream의 사용법이 C++의 operator 재정의의 사용 철학을 알리기 위해서 지금처럼 ‘<<’와 ‘>>’를 사용하게 되었다고 들은 적이 있다. 하지만 printf()의 다양한 format을 표현하기 위해서는 알아야 하는 함수(또는 template, 또는 functor)가 너무도 많다. 진수(radix)를 바꾸기 위한 방법도 그렇고 출력 시 고정폭을 지원하게 하는 방법도 너무 귀찮다. (물론 처음부터 C++로 시작한 사람은 그냥 그려러니 하고 사용할 것이다. 도리어 C의 format함수가 더 어려울지도 모르겠다)
내가 가장 큰 문제라고 생각하는 것은 printf() 보다 직관적이지
못한 부분이 있기 때문이다.예를 들어 아래의 두 가지는 서로 결과가 다르다. 그냥 보면 둘 다 같은 결과가 나올 것 같은데 그렇지 못하다. std::cout에서
결과가 예상한 것과 다르게 나오는 것은 operator의
overloading 때문이다.
#include <stdio.h>#include <iostream>int main(){char ch = '0';// 1. printf() 버전printf("%c\n", ch+0);printf("%c\n", ch+1);printf("%c\n", ch+2);// 2. std::cout 버전std::cout << ch+0 << std::endl;std::cout << ch+1 << std::endl;std::cout << ch+2 << std::endl;return 0;}
결과
0 <-- printf() 버전1248 <-- std::cout 버전4950
Posted by 안영기