안녕하세요. 저는 C언어로 밥먹고 사는 6년차 프로그래머입니다.
가끔씩 C언어 관련 게시물이 베스트 게시물에 등록 되는 것을 보고
저도 뭔가 도움을 줄 수 있을게 없을까 하다가 이렇게 글을 남깁니다.
C언어 공부를 막 시작하신 분들이나, 앞으로 프로그래밍으로 밥먹고 살려고 하시는 분들은 한번쯤 읽어 주시면 고맙겠네요.. :)
1. 배우는 목적을 정확히 하라
프로그래밍을 처음 공부 하시는 분들은 반드시 C언어부터 해야 된다고 생각하시는 분들을 종종 봅니다만,
저는 구지 그럴 필요가 없다고 생각합니다.
가령, JSP등의 웹 프로그래밍 잘하고 싶으신 분들은 C언어의 포인터 개념을 전혀 모르셔도 됩니다.
왜냐하면 Java의 인터 프리터가 해당 역활을 대신 해주기 때문입니다.
물론 인터 프리터의 구조나 하는 일에 대해 정확히 이해하기 위해 공부하 것이 좋겠지만,
그 시간에 DB의 구조화나 최적화에 대해 공부 하시는 게 훨씬 좋습니다.
이것을 레이어(층)의 개념으로 이해 하셔야 되는데요.
예를들어 네트워크의 프로그래밍의 경우, 네트워크 스택(7레이어)에 대해 정확히 몰라도 기본 개념정도만 알면
네트워크 프로그래밍을 할 수 있도록 네트워크 스택이 캡슐화, 모듈화 되어 하나의 레이어(층)을 형성하고 있습니다.
그 레이어(네트워크 층)위에서 APP 개발자들이 네트워크프로그래밍에 전념 할 수가 있습니다.
반대로 해당 레이어를 개발한 개발자는 상위 APP개발자가 무슨일을 하는지 관심을 안가져도 됩니다.
결국 레이어 개념은 업무의 분업화를 명확히 하자는 겁니다.
그러므로 모든 분야에 대해 다 공부하려고 하지말고, 자신의 레이어(층)을 정해 해당 분야의 전문가가 되는 것이 좋습니다.
2. OS를 공부하라
1번의 이유를 통해 C언어를 배워야하겠다고 생각하신 분들은 반드시 OS를 공부 하셔야됩니다.
C언어는 unix라는 OS개발을 위해 만들어진 언어 입니다.
그런데 Unix OS 방식 대 성공을 거두면서 현존하는 대부분의 OS에서 차용하는 방식이 되었습니다.
가령 우리가 흔히 사용하는 디렉토리 구조.. 이것도 Unix OS에서 처음 선보인 방식입니다.
마이크로 소프트도 처음에는 윈도우를 자체 개발하다가, 결국 실패하고 Unix 계열 OS회사를 인수 해 윈도우를 새롭게 만들었습니다.
그렇기 때문에 윈도우는 Unix 커널을 사용하지는 않지만 기본 컨셉은 크게 다르지 않다고 생각합니다.
그러므로 C언어를 잘하기 위해서는 OS에 대한 이해가 필수 입니다.
특히 C언어의 꽃 포인터를 완벽히 공략 하실려면 OS의 Logical Address Space의 개념을 반드시 아셔야합니다.
예를 한번들어 볼까요?
포인터로 접근하는 0x000028이라는 주소가 있다고 치면, 이 주소는 RAM의 물리적인 0x28번째 주소를 뜻할까요?
정답은 아닙니다. 해당 주소는 RAM의 특정영역이나 하드웨어 ASIC의 특정 레지스터가 될 수도 있습니다.
단순히 C언어의 포인터의 개념이 있다고 해도 , OS를 정확히 모르면 어떤 결과물을 산출 해 내더라도 최적화를 통한 좋은 프로그램을 만들어
가는것이 힘듭니다.
이외에도 , 데드락 문제(세마포어...), 인터럽트 서비스 루틴 등등 OS나 더 들어가서 하드웨어와 연관된 지식을 가지고 있어야만 C언어를 할 줄 안다고 할 수 있습니다.
그러므로 C언어를 잘하고 싶으신 분은 반드시 OS를 공부하세요.