첫 번째 강의

안녕하세요! A.I.S 한정일입니다. 새로 들어온 후배, 곧 전역할 동생들을 위해 C 언어를 ‘어떻게 하면 더 쉽게 공부할 수 있을까?’ 생각 하다가 강의를 시작하게 되었습니다. 저도 많이 부족하기에 초보자의 관점에서 되도록이면 쉽게 글을 쓰도록 하겠습니다. 절대 어려운 내용 없어요. AnD 깊게는 못 들어갑니다. 나도 잘 몰라 -_ㅡ;;

무슨 내용부터 시작해야 될 지 한참을 고민했습니다. 동아리방에 있는 C언어 책 다 살펴보고 결국엔 처음부터 고고 하자라고 결론 놨습니다.

그러면 첫 번째 시간 고고 하겠어욘~

Aritficial IntelligEnce SystEm                                                 C Language Study

C언어를 공부하는 학생이라면 한번쯤은 작성해 봤을 “Hello World”. 간단한 몇 줄이지만 아래의 소스를 들여 다 봄으로써 C언어의 상당 부분을 이해할 수 있지요~ ^^

그림 . Hello World.c

위 소스를 보면서 이런 의문이 한번쯤 들게 됩니다.

▪ 헤더 파일은 왜 필요한가요?

▪ int main(void)은 뭐하는 겁니까?

▪ printf()는 또 머야~.

▪ return 0; 넌 누구니?

그럼 첫 번째 궁금증부터 풀어 나가보죠.

▪ 헤더 파일은 왜 필요한가요?

우선 헤더 파일이란 위 소스의 stdio.h 처럼 확장자가 .h로 끝나는 파일을 일컫습니다. 헤더 파일의 필요성을 알기 전에 라이브러리라란 것을 먼저 설명하겠습니다. 라이브러리란 프로그래밍에 사용할 수 있게 미리 만들어 놓은 함수나 변수들의 묶음을 의미합니다. 위 소스에서 printf() 함수도 여기에 속합니다. printf()라는 함수는 위 소스 어디에서도 제가 구현하지 않았습니다. 하지만 printf()라는 함수를 쓰게 되면 화면에 “Hello World“라는 문자열을 출력하죠. 그러면 printf()는 도대체 어디에 구현 되어져 있는 걸까? 라고 생각해볼 수 있습니다. 바로 라이브러리란 곳에 구현되어 있는 거죠. 이러한 것들 printf, scanf, read, write, memcpy, strcpy 등의 함수가 모여 있는 라이브러리를 표준 C 라이브러리라 합니다. 그러면 다시 처음으로 돌아가서 헤더파일은 왜 쓸까? 결론부터 얘기하자면 바로 이러한 라이브러리를 사용하기 위해서입니다. 일반적으로 헤더파일 안에는 함수들의 원형이 선언되어져 있습니다. C 언어의 문법적 특성과 관련된 것으로써 C 언어는 함수를 사용하기에 앞서 함수의 원형이 어떤지 먼저 선언을 해야 합니다. 이렇게 선언된 정보는 함수가 실제로 호출될 때 컴파일러가 인자 값이나 리턴 값을 체크하여 함수가 제대로 호출되었나를 확인할 때 이용됩니다. 컴파일을 하기 전에 stdio.h 헤더 파일을 삽입하는 역할을 하는 것이  #include 지시자입니다. 그리고 이러한 동작을 전처리 과정이라 합니다. #include의 역할을 좀 더 쉽게 얘기하면 Hello World 소스의 #include <stdio.h> 자리에 stdio.h 내용이 Ctrl+C CTRL+V를 한 것처럼 붙여 넣어 진다라고 이해하면 쉬울 거 같습니다. 이렇게 전처리 과정이 끝나면 실제 컴파일 과정에서 링커에 의해 printf() 라이브러리가 링크 되는 것입니다.

▪ int main(void)은 뭐하는 겁니까?

C프로그램은 함수로 시작해서 함수로 끝이 난다는 얘기가 있습니다. 프로그램이 시작되면 컴퓨터는 main()이라는 이름의 함수를 가장 먼저 찾아 실행을 합니다. 이 말은 C로 구현된 모든 프로그램은 main이라는 이름의 함수를 지니고 있다는 얘기입니다. 그럼 질문의 내용을 다시 보죠. int main(void) main은 main인데 앞뒤로 단어 하나씩 더 붙어있네요. 아래 그림을 보면서 설명 드리겠습니다.

그림 . 함수의 전체적인 형태

함수는 위 그림과 같은 형태를 갖고 있습니다. 그전에 함수 의미란 “적절한 입력과 그에 따른 출력이 존재하는 것을 가리켜 함수라 한다.”라고 제가 보고 있는 책에 친절히 설명이 되어있네요. main 앞에 오는 int를 가리켜 출력의 형태 또는 반환형이라고 합니다. 좀 더 구체적으로 얘기하면 main이라는 이름을 갖고 있는 함수가 정상적으로 실행을 마칠 때 운영 체제에게 int(정수)형 값을 반환한다는 것을 의미합니다. (void)는 입력의 형태라고 하였습니다. 앞에서도 설명했듯이 함수는 적절한 입력과 그에 따른 출력이 존재한다고 했으니 main 다음에 오는 값을 입력으로 받겠다. 라는 뜻으로 이해하시면 될 거 같습니다. 여기서 (void)라는 키워드는 main 함수가 실행될 때 “입력 값으로 어떠한 데이터도 받지 않을 거야” 라는 걸 의미 합니다. 함수에 대한 더 자세한 얘기는 차후에 함수 파트에서 또 얘기 드리겠습니다.

▪ printf()는 또 뭐야~

그림 . printf()의 함수 원형

printf의 함수 원형입니다. 저런 식으로 stdio.h에 원형이 선언되어있습니다. 실제로 함수가 구현된 부분은 표준 입출력 라이브러리에 있습니다. 위에서 다 설명했던 내용이죠. 라이브러리는 미리 컴파일 되어 오브젝트 파일로 존재하고 있습니다. 그러므로 실제로 라이브러리의 파일을 열어봐도 우리가 알아먹을 수 없는 문자들로 존재합니다. printf() 함수의 동작 원리가 궁금하다면 MSDN을 통해 알 수 있을 겁니다. 그리고 printf()의 반환형이 int형이 이군요. 그럼 저 반환 값은 어떤 정보를 나타내는 걸까요? 한번 찾아보세요.

▪ return 0; 넌 누구니?

return 문은 두 가지 의미를 지닙니다. 하나는 함수의 실행이 끝나서 함수를 빠져 나온다는 의미 이며, 다른 하나는 호출 한 영역으로 값을 반환(리턴)한다는 의미를 지닙니다. 따라서 위의 return 0; 은 main 함수를 빠져 나오면서 main 함수를 호출한 영역으로 0을 반환 한다는 의미가 되겠습니다. 그럼 반환된 0은 어디로 가나요? 위에서 말했듯이 main 함수를 호출한 영역으로 반환됩니다. main 함수는 우리가 프로그램에서 호출한 것이 아니라, 운영체제에 의해서 자동적으로 호출되는 함수이므로, 반환된 0은 운영체제로 넘어가는 거죠. 운영체제는 main 함수가 최종적으로 반환해 주는 값을 통해서 프로그램이 잘 종료 되었는지, 아니면 문제가 발생되었는지를 파악하게 됩니다. 여기서 0을 반환한다는 것은 정상적인 종료를 의미하는 것이고 만약에 잘못된 종료를 하게 되는 경우에는 0 이외의 값을 전달하게 프로그램을 구현하면 되겠죠.

⌜첫 번째 강의를 여기서 끝내겠습니다. 후배들이 C 언어를 어려워하고 C 언어에 대한 이해 부족으로 다른 프로그램 분야를 접할 때 힘들어 하는걸 많이 봐왔습니다. 저 또한 혼자 공부하면서 힘든 점도 많았고 몇 번이나 ‘프로그래밍은 나랑 적성에 안 맞아’ 라고 생각했던 적이 한두 번이 아닙니다. 하지만 C 언어를 제대로 모르니깐 다른 것 또한 쉽지 않더군요. 결국엔 어쩔 수 없이 또 공부하게 되더라고용 ^^;;. 저처럼 여러 번 시행착오를 격지 않는다면 많은 시간을 아낄 수 있을 거예요. 그럼 다음에 두 번째 강의에서 만나요~ ^^⌟

참고자료

✔ 열혈강의, 윤성우 저, 프리렉

✔ Teach Yourself C, 피터 에이컨, 비앤씨

✔ C로 배우는 컴퓨터 프로그래밍, 이규철 외, 홍릉과학출판사

✔ 유닉스 ▪ 리눅스 프로그래밍 필수 유틸리티, 백창우, 한빛미디어