cout << endl vs cout << "\n", 무엇이 다를까?
C++에서 콘솔이나 파일에 출력할 때 cout << endl과 cout << "\n"은 겉보기에 같은 결과를 내지만, 내부 동작에는 중요한 차이가 있습니다. 상황에 따라서는 "\n"을 사용하고 endl은 피하는 것이 좋습니다.
std::endl을 피해야 하는 이유
std::endl은 현재 줄 뒤에 새 줄을 만드는 역할을 합니다. 몇 줄 되지 않는 간단한 입출력 작업에서는 문제가 되지 않지만, 대량의 입출력(I/O) 작업이 필요한 경우에는 성능 저하의 원인이 됩니다.
핵심은 endl이 단순히 커서를 다음 줄로 이동시키는 데 그치지 않고, 매번 출력 버퍼를 강제로 비우는(flush) 작업까지 수행한다는 점입니다.
버퍼 플러시는 개발자의 몫이 아닙니다
버퍼를 비우는 작업은 원래 프로그래머가 신경 쓸 부분이 아니라 운영체제가 담당하는 영역입니다. endl이 버퍼를 비울 때마다 운영체제에 플러시 요청을 보내게 되는데, 이 요청 자체가 상대적으로 비용이 큰 작업입니다. 게다가 몇 줄 출력할 때마다 일일이 버퍼를 비울 필요는 전혀 없습니다. I/O 스트림은 버퍼가 가득 차면 자동으로 버퍼를 비워주기 때문입니다.
실제 성능 차이는 얼마나 될까?
약 10만 줄의 텍스트를 파일에 기록하는 작업을 std::endl을 사용한 코드와 '\n'을 사용한 코드로 각각 실행해 소요 시간을 비교해 보면 그 차이를 쉽게 확인할 수 있습니다. 실험 결과, std::endl을 사용한 코드는 '\n'을 사용한 코드보다 거의 두 배 가까운 시간이 걸리는 것으로 나타났습니다.
결론
특별히 즉시 출력을 보장해야 하는 상황(예: 실시간 로그 확인)이 아니라면, 줄바꿈에는 '\n'을 사용하는 것이 성능 면에서 훨씬 유리합니다. 대량의 데이터를 다루는 프로그램일수록 이러한 작은 차이가 전체 실행 속도에 큰 영향을 미칠 수 있습니다.