c++에서 'std::endl'과 '\n'의 차이점은 무엇인가?

c++에서 ‘std::endl’과 ‘\n’은 모두 새로운 줄을 표시하는데 사용되지만, 중요한 차이점이 있습니다.

해당 포스트는 이전 포스트인 Buffer와 관련된 내용입니다.

이전 포스트 해당 링크 참고 - https://its-seon.github.io/2024/06/28/buffer.html

1. 'std::endl'

‘std::endl’은 새로운 줄 문자를 출력하고 스트림을 강제로 플러시(flush)합니다.

#include <iostream>

int main() {
    std::cout << "Hello" << std::endl;
    std::cout << "World" << std::endl;
    return 0;
}

해당 코드에서 ‘std::endl’은 단순히 새로운 줄을 추가하는 것 외에도 출력 버퍼를 강제로 비웁니다. 이로 인해 출력이 즉시 콘솔에 나타나게 됩니다.

2. '\n'

‘\n’은 새로운 줄 문자를 출력하지만 스트림을 플러시하지는 않습니다.

#include <iostream>

int main() {
    std::cout << "Hello\n";
    std::cout << "World\n";
    return 0;
}

해당 코드에서는 ‘\n’은 단순히 새로운 줄 문자를 추가합니다. 출력 버퍼는 자동으로 가득 차거나 프로세스가 종료될 때 비워집니다.

'std::endl'과 '\n'의 차이점 요약

  • 플러시(flush) 동작: ‘std::endl’은 새로운 줄 문자를 출력하고 스트림을 플러시합니다. 반면, ‘\n’은 새로운 줄 문자만 출력하고 플러시하지 않습니다.

  • 성능: ‘std::endl’은 매번 플러시를 수행하므로, 많은 경우 ‘\n’을 사용하는 것이 더 성능에 유리합니다. 특히 많은 양의 출력을 하는 경우에 ‘\n’을 사용하는 것이 효율적입니다.

  • 사용 용도: ‘std::endl’은 주로 출력이 즉시 필요할 때 사용하고, ‘\n’은 단순히 줄 바꿈이 필요할 때 사용합니다.

#include <chrono>
#include <fstream>
#include <iostream>

int main() {
  //  '/dev/null'은 리눅스나 유닉스 시스템에서 모든 입력을 버리는 특수 파일
  std::ofstream nullstream("/dev/null");

  // std::endl 사용
  auto start = std::chrono::high_resolution_clock::now();
  for (int i = 0; i < 10000; ++i) {
    nullstream << "Line " << i << std::endl;
  }
  auto end = std::chrono::high_resolution_clock::now();
  std::chrono::duration<double> duration = end - start;
  std::cout << "std::endl time: " << duration.count() << " seconds"
            << std::endl;

  // \n 사용
  start = std::chrono::high_resolution_clock::now();
  for (int i = 0; i < 10000; ++i) {
    nullstream << "Line " << i << '\n';
  }
  end = std::chrono::high_resolution_clock::now();
  duration = end - start;
  std::cout << "\\n time: " << duration.count() << " seconds" << std::endl;

  return 0;
}

image-2

실제로 위 코드로 실행시간을 비교해봤을 때 ‘\n’을 사용하는 것이 훨씬 빠른것을 확인할 수 있습니다.