본문 바로가기
프로그래밍/C++

C++에서 endl을 쓰면 왜 시간초과가 날까?

by YongRa 2024. 10. 7.

안녕하세요~ 오랜만에 글을 쓰게 되었습니다!

김종관님의 알고리즘 코딩 테스트

요즘에 위 책을 가지고 알고리즘을 공부하고 있는데 말이죠? C++로 하다보니 C언어와 다른게 있어서 이것저것 찾아보면서 하고 있습니다. 그중에서! 문제를 잘 풀었어도 '맞았습니다!!'가 나오지 않고, 시간초과 나게 되어 저를 종종 괴롭히고 있습니다..

그 중에서 오늘 알아볼 것은 바로바로.. endl 입니다!


 

endl은 줄바꿈이 필요할 때 사용하게 됩니다. 마치 C언어에서 줄바꿈을 하기 위해서 printf("\n"); 했던것 처럼요~

C++에서는(using namespace std; 를 위에 적었다는 가정 하에) cout << endl;를 사용할 수도 있습니다. 그렇지만, 제목에 적었다시피 endl을 사용하면 잘 만든 코드도 시간초과가 뜨는 것을 볼 수 있습니다... 왜그럴까요?!


 

endl과 \n의 차이점을 알기 위해서는 우선 버퍼(buffer)의 개념부터 알아보겠습니다!

버퍼(buffer)란? 버퍼는 데이터를 한 번에 처리하지 않고 임시로 저장하는 메모리 공간을 의미합니다. 컴퓨터 프로그램은 출력 시 모든 데이터를 즉시 출력 장치(모니터 등)에 보내는 대신, 출력 데이터를 버퍼에 잠시 저장합니다. 그러다가 버퍼가 꽉 차거나 특정 조건이 충족될 때, 한꺼번에 데이터를 출력 장치로 보냅니다. 이를 통해 성능을 최적화하고 출력 장치와의 불필요한 상호작용을 줄이는 효과가 있습니다.

 

비슷한 예로 여러분들이 영상을 볼 때 인터넷 환경이 좋지 않다면 버퍼링 걸린다고 하잖아요~? 여기서의 버퍼 또한 위에서 얘기한 것과 같이

스트리밍할 때 데이터를 미리 받아 끊김 없이 재생되도록 임시로 저장하는 과정을 뜻합니다. 

 

그렇다면 두개의 줄바꿈 방식에는 어떤 차이점이 있을까요~?

 

endl (C++)

 

endl은 줄바꿈을 하면서 버퍼를 강제로 비우는(즉시 플러시) 역할을 합니다. 즉, endl을 사용하면 버퍼에 있던 내용이 즉시 출력되고, 그 후에 줄바꿈이 발생합니다.

사용 예: std::cout << "Hello" << std::endl;

여기서 "Hello"는 출력 버퍼에 저장된 뒤, std::endl에 의해 줄바꿈이 이루어지며 버퍼에 남아 있는 출력이 화면으로 전송됩니다.

 

\n (C, C++)

 

\n은 단순히 줄바꿈 문자입니다. 이것은 버퍼에 줄바꿈 문자를 추가하는 역할만 하고, 버퍼를 강제로 비우지는 않습니다. 버퍼가 꽉 차거나 프로그램이 종료될 때까지 출력이 화면에 나타나지 않을 수 있습니다.

사용 예: std::cout << "Hello\n";

여기서 "Hello\n"은 버퍼에 저장되지만, 즉시 출력되지 않을 수 있고 버퍼가 비워질 때 출력됩니다.

 

그러니까, endl을 사용을 하면 출력을 할 때마다 버퍼를 비우는 작업을 매번 하게 되니까 시간이 그만큼 오래 걸린다~ 라고 생각하시면 되겠습니다! 그래서 저는 그냥.. \n만 쓰려구요!