이 글은 아직 완성된 글이 아니며, 공부하면서 알게 된 내용들을 바탕으로 짤막한 지식들을 나열해 나갈 것입니다.

잘못된 부분이 있으면 덧글이나 방명록 등으로 알려주시면 감사하겠습니다 :)



1. IO 객체 std::cin/cout/cerr/clog 중 cerr는 un-itbuffered이다.


 흔히 우스갯소리로 printf 디버깅 또는 cout 디버깅이라고 부르는 오류 해결 방식이 오류가 나는 지점 주변에 출력문을 넣어 어디까지 정상적인 값이 출력되었는지를 살펴보는 것이다. C++에서는 출력 방식으로 흔히 std::cout을 사용하는데, 기본적으로 std::cout은 buffered 로 동작하기 때문에 원하는 위치에서 정상적인 출력이 되지 않을 수 있다. 따라서 std::cout으로 로그를 찍기 위해서는 버퍼를 비우는 동작을 추가로 진행해 주어야 하며, 이를 std::endl이 수행한다.


 하지만 그렇게 번거롭게 하지 않더라도 버퍼를 비우는 방법은 한 가지가 더 있는데, 바로 std::cerr를 사용하는 것이다. std::cerr는 디폴트로 un-itbuffered 로 동작한다. un-itbuffered란 '이 연산은 buffered이기는 하지만 출력 이후 바로 버퍼를 비운다'는 것을 의미한다. 따라서 추가로 버퍼를 비우는 행위를 하지 않더라도 정상적인 위치에서 출력이 가능하게 된다.


* buffering이란 효율적인 입/출력을 위해 프로그램에서 일정 크기만큼을 메모리에 임시로 보관하고 있다가 일괄로 처리하는 것을 의미한다.



2. stream의 operator<<, operator>> 는 자기 자신을 반환한다.


  C++을 사용하면서 operator<<를 사용할 때,

1
std::cout << "Hello World!" << std::endl;


 이런 식으로 연속하여 사용해 본 적이 있을 것이다.

이것이 가능한 이유는 앞에서부터 연산을 수행하되, ostream::operator<< 의 리턴 값이 자기 자신이기 때문이다.

즉, 앞의 연산인 std::cout << "Hello World!" 가 먼저 수행되고 자기 자신이 리턴되어 다음 명령도 std::cout << std::endl이 되는 것이다.



3. method와 function은 다르다.


 보통 함수라고 부르는 function은 '이름으로 불려지는 특정 코드의 집합'을 의미한다.  메서드라고 부르는 method는 '특정 객제에 포함된 이름으로 불려지는 특정 코드의 집합'이다. 간단하게 '멤버 함수' == '메서드' 라고 볼 수 있다. 함수가 메서드보다 더 큰 범위라고 할 수 있겠다.



4. std::endl은 함수로 쓸 수 있다.


 std::endl을 보통 '\n'을 출력하는 것과 같다고만 알거나, 조금 더 나가서 버퍼를 flush해준다고 알고 있는 사람들은 많지만 사실 std::endl은 함수로써 사용도 가능하다. 인자로 output stream을 받으며, 사용법은 다음과 같다.

1
std::endl(std::cout);



...계속 추가됩니다.

'Programming' 카테고리의 다른 글

[C++] unique_ptr, weak_ptr  (0) 2016.12.15
[C++] auto_ptr, shared_ptr  (0) 2016.12.14
[C++] 얕은 복사, 깊은 복사, 복사 생성자  (0) 2016.12.13
[C++] std::for_each  (0) 2016.12.12
[Python] Pacro : Python 기반 매크로 프로그램  (5) 2016.11.28
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,