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