다루지 않은 것

사실 이 책만 해도 C 언어의 꽤 많은 부분을 담고 있습니다만, 아직 우리에게는 배우지 않은 C언어의 다양한 기능들이 있습니다. 앞으로 C언어를 더 공부하고 싶은 사람들을 위해, '공부하면 좋은 것들'을 담아 보았습니다.


가변 인자

혹시 지금껏 printf 함수와 scanf 함수를 써오며 이상함을 느끼지 않았나요? 어떻게 이 두 함수는 받는 인자의 개수가 달라질까요? 어라? %d의 개수와 인자의 개수가 맞지 않아도 오류가 나지 않잖아? 잠깐, 나는 분명 printf("%d", "BOY");라고 했는데 왜 무언가 출력되지?

그 답은 가변 인자에 있습니다. 가변 인자를 공부해 두면 어셈블리 언어에서 프로시저(함수)에 인자를 전달하는 과정을 쉽게 이해할 수 있습니다.


longjmp

열심히 공중 재귀를 돌다 재귀를 탈출하고 싶을 때 어떤 방법을 사용하나요? 아마 다들 ifreturn을 열심히 사용할 것입니다. 하지만 이 길고 긴 함수 호출 스택을 훅 바꿔버리는 마법이 있습니다!


공용체

사실 많은 C 언어 프로그래밍 책에서 공용체를 다루고 있지만, 컴퓨터의 성능이 좋아지고 메모리의 용량이 크게 증가한 요즘, 공용체는 잘 사용되지 않습니다. 그렇기 때문에 C발라먹기에서는 이를 의도적으로 배제하였지만, 혹시 'C 언어의 모든 것을 알아야겠다!'고 한다면 공용체를 공부하십시오.


수많은 라이브러리

C 언어에서는 자주 사용하는 기능들을 모아 헤더 파일 형태의 라이브러리로 제공하고 있습니다. 다른 언어들만큼은 아니지만, C 언어의 기본 라이브러리는 무척 방대합니다. 또 기본 라이브러리 이외에도 여러 라이브러리가 있는데, 여기에서 모두 다룰 수는 없으니 따로 공부해 보시기 바랍니다. 


인라인 어셈블리

 'C 언어만으로는 속도가 모자라!'라고 생각한다면, C 언어 코드 중간에 어셈블리 코드를 박을 수도 있습니다. 물론 완전한 어셈블리 언어는 아닙니다. 하지만 요즘은 컴파일러가 무척 좋기 때문에 권장하지 않고, 모든 환경에서 정상 작동 하리라는 보장도 없습니다. 인라인 어셈블리를 쓰고 싶다면 한 마디만 기억하십시오.

코딩보다 중요한 것은 흐름이다.

 이 말은 아래의 비트 연산이나 포인터 꼼수에도 적용됩니다.


비트 연산

컴퓨터는 수를 2진수로 저장합니다. 이 수를 비트 단위로 조종함으로서 특정 작업들을 쉽게 할 수 있는 경우가 있는데, 이 조종 작업을 비트 연산이라 합니다. 비트 연산을 적극적으로 도입하면 메모리를 아끼고 속도를 단축시킬 수 있지만, 자칫하면 찾기 힘든 버그가 발생하거나 남들이 읽기 힘든 코드가 되므로 주의해 주세요.


비트필드 구조체

비트필드 구조체를 사용하면 멤버들의 크기를 비트 단위로 지정할 수 있습니다. 공용체와 같이 잘 쓰이지 않지만, 일부 저수준 작업에서 필요한 경우도 있습니다.


파일 입출력

지금까지는 printfscanf를 사용한 콘솔 입출력만을 했지만, C 언어는 파일 입출력을 지원합니다. 텍스트 파일에서 글자를 읽어오는 것뿐만 아니라 다양한 종류의 파일들을 읽고 쓸 수 있습니다. 다만, 환경에 따라 달라질 수 있는 요소들도 많고, 복잡한 부분도 많아 여기에서는 생략했습니다.


멀티 스레드

멀티 스레딩을 통해 작업의 병렬화가 가능합니다. 다만, 메모리를 공유할 경우 주의를 기울여야 하며 작업간의 종속성이 없을 경우에만 멀티 스레딩을 통한 병렬화가 가능합니다. 또 멀티 스레딩을 하기 위한 오버헤드도 감안할 필요가 있습니다. 많은 온라인 알고리즘 트레이딩 사이트에서는 멀티 스레딩을 금지하고 있습니다.


동적 할당

배열은 우리가 처음 선언할 때 지정한 크기 이상으로 사용하지 못합니다. 그런데, 경우에 따라서는 더 큰 크기의 배열이 필요해질 수도 있습니다. 이럴 때 사용하는 것이 동적 할당입니다. 하지만 잘못 사용할 경우 허상 포인터나 메모리 누수 등의 문제가 일어날 수 있고, 캐시 효율에도 악영향을 끼칠 수 있으니 주의해서 사용해 주세요.