티스토리 뷰

이번엔 C언어 책 앞부분에 항상 등장하는 HelloWorld를 한번 분석하는 시간을 가져봅시다. 사실 그 짧아 보이는 코드에는 굉장히 많은 개념이 담겨있어요. 우선 코드를 봅시다. 


#include <stdio.h>


int main()

{

printf("Hello World!\n");

return 0;

}


지난번 글이었던 "C언어 진입장벽 부수기" 에 있던 코드라 익숙하죠? 

우선은 Visual Studio 에 입력하고 실행시켜 봅시다.

단축키 기억나시나요?


Ctrl + F5


실행 결과가 어떻게 나오나요?



이렇게 잘 나오나요?


지난번에 printf 함수의 역할이 쌍따옴포(") 사이에 있는 글자를 출력하는 기능을 한다고 했었어요. 

그리고 "\n" 은 출력할 때 개행(줄바꿈)을 하는 기능을 한다고 했구요.

그런데 printf 말고 그 주위에 있는 녀석들은 그냥 쳐보기만 했지 정확히 무슨 의미인지 대체 왜 입력을 하는건진 아직 모를거에요.

오늘은 printf 주변에 있는 녀석들에 대해서 알아보도록 하죠. 


1: #include <stdio.h>

2: 

3: int main()

4: {

5: printf("Hello World!\n");

6: return 0;

7: }


#include <stdio.h>


앞에 #이 붙은 코드는 전처리기 명령어라고 하는데 #include, #define, #if ...등이 있습니다. 그 중 #include 은 매 코드마다 빠지지 않고 등장하는 명령어죠. include 라는 단어가 의미하는 "포함하다" 라는 의미를 볼 때 stdio.h 라는 것을 포함한다는 그런 의미로 해석이 가능하죠?


전처리기란 단어 그대로 '전에' 처리하는 것을 말하는데요, 컴파일 하기 전에 미리 어떤 처리를 한다고 생각하면 됩니다. 여기서는 stdio.h 라는 파일을 포함시킨 다음에 컴파일을 진행하는거죠. 여기서 포함이란건 그냥 현재 소스코드에 stdio.h 파일의 내용을 쭈욱 붙여넣는다고 보면 쉽습니다.


파일 이름 끝에 ".h"가 붙은 것은 헤더 파일이라고 부르는데 이 헤더 파일은 마법서라고 생각하면 편합니다. 지난번에 함수를 설명하면서 "윙가디움 레비오사"를 예로 들었었죠? 함수는 제각기 사용 방법이 있고, 기능이 있다고 했었습니다. 헤더 파일은 저 윙가디움 레비오사라는 마법 주문의 사용법과 기능이 적혀있는 마법서라고 생각하면 되는거죠. 우리가 사용한 printf 라는 함수에 대한 정의가 저 stdio.h 라는 파일에 정의되어 있는겁니다. 그래서 우리가 printf 를 사용하고 싶으면 반드시 stdio.h 를 포함시켜 주어야 한다는거죠. 이런 전처리 명령어는 다른 코드들 보다도 소스 코드 최상단에 위치하고 있어야 합니다. 그래서 우리 코드도 보면 제일 먼저 #include <stdio.h> 로 시작하고 있죠?


stdio 라는건 STanDard Input Ouput 의 약자로 stdio.h 에는 입력과 출력에 대한 함수들이 정의되어 있습니다. 


int main() { }


위 코드는 main 함수라고 불리는 녀석입니다. printf 와 같은 함수가 stdio.h 라는 헤더 파일에 정의되어 있다고 했죠? 함수를 정의할 때 위와 같은 형식으로 함수를 정의하게 됩니다. printf 역시 저런 형식으로 정의되어 있는거죠! "int printf (어쩌구 저쩌구...) { } " 즉 위 코드는 main 이라는 함수를 정의하는 부분입니다. 


여기서 잠깐! 우리가 프로그래밍에서 사용되는 함수라는 용어에 대해 먼저 생각을 해 봐야합니다. 그동안 함수라는 단어를 수학에서나 봤지 대체 왜 저걸 함수라고 부르는 걸까... 



어디서 많이 본 그림이죠? ㅎㅎ

수학책에서 함수에 대해 설명할 때 항~~~상 나오는 이미지입니다.

저 그림을 이용해서 함수를 설명해보자면 x 라는 입력이 들어가면 어떤 일련의 작업을 한 뒤에 y라는 결과가 나오는게 함수라는 거죠.


좀 더 예를 들어보자면 수학시간에 했던 함수의 형태를 보자구요.


f(x,y) = 2x + 3y


f라는 이름을 가진 이 함수는 x와 y 값을 입력으로 받고, 2 * x + 3 * y 라는 작업을 한 결과를 반환하는 함수입니다. 

여기서 봤을 때 함수에게 필요한건 이름과 입력, 일련의 작업, 반환 값 이런 요소들이 필요하네요.


C언어에서의 함수 역시 똑같히 함수 이름과 입력, 반환, 작업 들이 정의되어 있어야하죠.


int main() { }


그럼 함수의 형태를 좀 더 세세하게 보도록 할까요?


반환형 함수이름(인자정의) { 동작정의 }


위와 같습니다. main 함수와 비교해서 볼까요?


int main() { }

반환형 함수이름(인자정의) { 동작정의 }


int는 c언어에서 사용되는 자료의 형태중 하나인데 정수를 나타냅니다. 즉 main 함수는 값을 반환하는데 그 형태가 정수형태라는 거죠. 


C언어 뿐만 아니라 대부분의 프로그래밍 언어에서는 어떤 데이터를 사용할 때 그 데이터의 형태를 항상 명시해주어야 합니다. 함수의 반환 형태도 우리가 생각 하기에는 그냥 정수든 실수든 그냥 반환하면 되는데 왜 저렇게 명시를 해주어야 하나 싶을껀데 컴퓨터는 사실 어마어마하게 빠른 계산기에 불과하고 지능이라는게 없습니다. 그렇기 때문에 모든걸 인간이 명시해주어야 합니다. 쟤는 정수다, 쟤는 실수다 이렇게 말이죠.


main 은 함수의 이름을 말하는거구요 소괄소() 안에는 함수에 필요한 인자 값을 정의하는 부분입니다. 이 부분은 나중에 살펴보도록 하죠! 

중괄호{} 안에 이제 실제로 main 함수의 동작이 정의되는 부분입니다. 그런데 아까 제가 함수에는 반환값도 필요하다고 했죠? 근데 지금 제가 써둔 main 함수는 반환값이 보이지 않습니다. 그 반환값은 return 0; 이라는 코드가 그 역할을 합니다. 


int main()

{


return 0;

}


이렇게 써주면 그제서야 완벽한 main 함수가 되는거죠. return 이라는 것은 반환한다 혹은 돌려주다라는 의미가 있죠? 의미 그대로 반환 한다는 겁니다 0이라는 숫자를! 함수라는건 어디선가 호출을 해야 실행이 되는데 함수가 실행되고 마지막에 호출을 해준 곳으로 값을 반환하게 됩니다. 위 코드에서는 0이라는 숫자를 반환하는거구요!


제가 앞에서 함수를 호출한다고 했는데 우리는 따로 호출을 한적 없습니다. 그런데 왜 main 함수가 실행된걸까요? 사실 여기엔 main 함수가 왜 main 함수인지를 알아야됩니다. C언어는 함수를 단위로 코드가 만들어지는데 대체 컴퓨터가 어떤 함수부터 실행을 할 것인지를 모릅니다. 그렇기 때문에 C언어를 만들 때 아예 무조건 시작은 main 함수다 라고 지정을 해둔거죠. 이 때 main 이라는 함수 이름은 절대 바뀌어선 안됩니다. Main 도 안되고 MAIN도 안됩니다. 무조건 main 만 가능하다는 사실을 기억해두세요 ~ 


그러면 누가 호출을 하느냐가 문제인데 답은 간단합니다. 여러분들이 사용하고 있는 운영체제(xp, 윈도우7, 리눅스 등등)이 프로그램이 실행되면 호출을 한답니다. 그러면 반환값은 누구에게 가는걸까요? 당연히 호출을 한 운영체제에게 값이 전달됩니다. 즉 return 0; 는 0이란 값을 운영체제에게 돌려주는거죠. 왜 하필 0이냐하면 프로그램이 정상적으로 동작을 했을 경우 0이 반환되고 그 외의 경우에는 -1 이나 1 이 반환되는게 일반적이기 때문입니다. 그동안의 프로그램을 만들면서 생긴 일종의 습관과 같은거죠. 사실 return 0; 자리에 return 100; 을 넣든 return -22321;을 넣든 프로그램 실행은 정상적으로 됩니다만 0을 넣어주는게 가장 일반적이고, 대부분의 프로그래머가 0을 반환하기 때문에 우리도 0을 반환하도록 하는게 좋겠죠?


그럼 마지막으로 전체 코드를 한번 보면서 정리를 해봅시다.


#include <stdio.h>


int main()

{

printf("Hello World!\n");

return 0;

}


이제 대충 눈에 들어오나요?

우선 stdio.h 를 코드에 포함 시키고 main 함수를 정의합니다.

main 함수의 반환 형태는 int 로 정수 형태구요, 인자값은 없습니다.

하는 역할은 "Hello World\n" 를 출력하고 반환 값으로는 0을 반환합니다.


c언어의 가장 기본적인 형태를 한번 알아봤는데 정리가 좀 되셨나요?

다음번엔 변수와 자료형 그리고 printf를 좀 더 파헤쳐 보도록 하겠습니다 ~ 

저작자 표시 비영리 변경 금지
신고

'##Programming > #C' 카테고리의 다른 글

[C언어] HelloWorld 를 분석해보자  (4) 2016.03.05
[C언어] C언어 진입장벽 부수기  (1) 2016.03.03
[C언어]1편 - C언어의 기본  (2) 2013.12.28
C언어란?  (7) 2013.02.05
[C언어]Visual C++ 사용법  (17) 2013.02.01
댓글
댓글쓰기 폼