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;
}
실제로 위 코드로 실행시간을 비교해봤을 때 ‘\n’을 사용하는 것이 훨씬 빠른것을 확인할 수 있습니다.