Programming Language/C

2-1. hello world!

O773H 2018. 7. 11. 18:17
728x90

(설치 과정은 생략하겠습니다!)



1-0. hello world! 들여다보기


1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void)
{
    printf("hello world!\n");
    return 0;
}
cs


위 프로그램으로부터 C언어의 기본특성 몇 가지를 이끌어 낼 것이다. 일단 프로그램을 다시 한번 보자.

"이 문장이 의미하는 바가 무엇일까?"라는 의문을 가지면서 보자.


1-1. C언어의 기본단위인 '함수'의 이해


C언어를 소개할 때 다음과 같은 이야기가 흔히 등장한다.

"C언어는 함수로 시작해서 함수로 끝난다."

C언어로 프로그램을 작성한다는 것은 '함수를 만들고, 만든 함수들의 실행순서를 결정하는 것'이기 때문이다. 우리가 처음 만든 프로그램도 하나의 함수로 구성되어있다. 함수에 대한 완벽하고 구체적인 이해는 잠시 뒤로 미뤄두기로 하고, 여기서는 함수를 만드는 방법과 만든 함수를 실행하는 방법만 이해하기로 하자. 우리는 수학을 공부하면서 이미 수도 많은 함수를 만들어 보았다.


6x+4=y 와 같이 보이는 것이 바로 함수이다.


여기서 x에 2를 대입하면 y는 16이 된다. C언어에서는 x에 삽입되는 값을 '입력'이라 하고, 그 결과로 얻게되는 y의 값을 '출력'이라 한다.

그리고 적절한 입력과 그에 따른 출력이 존재하는 것을 가리켜 '함수(function)'이라 한다.


함수에 대해 간단히 소개하였으니, C언어에서 함수와 관련해서 사용되는 용어 몇 가지를 정리하겠다.


* 함수의 정의    :    만들어진 함수, 실행이 가능한 함수를 일걸음

* 함수의 호출    :    함수의 실행을 명령하는 행위

* 인자의 전달    :    함수의 실행을 명령할 때 전달하는 입력 값


6x+4=y 는 함수의 '정의'이고, 이 함수의 '호출'을 위해서 x에 전달되는 값이 '인자'가 된다.

따라서 인자의 전달은 함수의 호출과정에서 동시에 발생한다고 볼 수 있다.


1-2. 함수는 어디에?


다시 한번 말하지만 C프로그램은 함수로 시작해서 함수로 끝난다. 즉, 정해진 순서에 의해서 진행되는 함수의 호출이 바로 프로그램의 흐름이 되는 것이다. 그렇다면 제일 먼저 호출되는 함수는 무엇일까? 바로 main이라는 이름의 함수이다.

프로그램이 실행되자마자 컴퓨터는 main이라는 이름의 함수를 찾아서 호출을 한다. 따라서 C언어로 구현된 모든 프로그램에는 main이라는 이름의 함수가 정의되어야 한다. 처음 소개한 예제를 다시 보자.



 출력형태     함수이름       입력형태

 int  main (void)


위에서 int와 void는 각각 출력과 입력의 형태를 설명하는 것이다. 즉, 의미하는 바는 다음고 같다.

"출력의 형태가 int이고 입력의 형태가 void인 main이라는 이름의 함수"

int와 void가 갖는 의미는 이후에 설명할 것이다. 입력과 출력에 대한 정보가 어느 위치에 오는지, 그리고 함수의 이름은 어디에 위치하는지에 대해서만 기억하기 바란다.

이렇듯 함수의 특성(입력형태, 출력형태 그리고 함수이름)만 정의했다고 해서 함수가 되는 것은 아니다.

함수는 기능을 지녀야 한다. C언어에서 그 기능은 중괄호 안에 표현이 된다. 즉 main함수의 기능은 다음과 같다.


1
2
3
4
5
int main()
{
    printf("hello world!\n");
    return 0;
}
cs


위의 중괄호 내부는 두 개의 문장으로 이뤄져 있는데, 이 문장들은 순차적으로 실행이 된다. 즉, 중괄호 내에 존재하는 문장은 그 수에 상관없이 위에서 아래로 순차적으로 실행이 된다. 그리고 이렇게 함수의 기능을 정의하고 있는 영역을 가리켜 '함수의 몸체(body)'라 한다. 

지금까지 설명한 내용을 종합하게 되면 함수 정의의 전체적인 구조는 다음과 같음을 알 수 있다.


출력형태   함수이름   입력형태

 int  main (void)

 {

 함수의 몸체

 }



여기서 '출력의 형태'라는 표현은 함수임을 강조할 때 사용이 되며, 실제로는 '반환형(return type)'이라는 표현이 주로 사용된다.



1-3. 함수 내에 존재하는 문장의 끝에는 세미콜론(;)을 붙여준다.

 

위에서 main 함수의 몸체는 다음 두 문장으로 이뤄져 있다.


printf("hello world!\n");

return 0;


여기서 각 문장의 끝에는 ; 이 붙어있다. 이렇듯 C언어는 문자으이 끝을 표현하기 위해서 세미콜론을 사용한다.

그런데 모든 문장에 세미콜론이 붙는 것은 아니다. 이후에 소개하는 조건문이나 반복문과 같은 컨트롤 문장에는 세미콜론이 붙지 않는다.


1-4. 표준 라이브러리와 printf 함수


main 함수의 몸체에는 다음 문장이 존재한다. 이것은 우리가 처음보는 함수의 호출문이다.

printf("hello world!\n");

함수의 호출문에서 소괄호 안에는 함수호출 시 전달할 인자정보를 표현한다. 그리고 C언어는 큰따옴표를 이용해서 문자열을 표현한다.

즉, 위 문장은 문자열 "hello world!\n"를 인자로 전달하면서 printf라는 이름의 함수를 호출하는 문장이다. 그런데 가만히 생각해 보면, 우리는 print라는 이름의 함수를 만든 적이 없다. 그렇다면 만들지도 않은 함수를 어떻게 호출할 수 있었던 것일까?


[참고] 문자열에 삽입된 \n

큰따옴표로 표현되는 문자열 안에는 특수한 의미의 문자를 삽입할 수 있다. 앞서 보인 문자열에 삽입된 문자 \n도 그러한 특수문자 중 하나이다. 이러한 특수문자의 공식명칭은 '이스케이프 시퀀스(escape sequence)'인데, 이스케이프 시퀀스 중 하나인 \n은 줄을 바꾸라는(개행 하라는) 의미로 사용이 된다. 이와 관련해서는 이후에 다시 설명할 것이다.


printf 함수는 함수호출 시 전달되는 문자열을 모니터에 출력하는 기능을 한다. 이러한 printf 함수는 직접 만들지 않아도 호출이 가능한, 기본적으로 제공되는 함수이다. 즉, 누구나 가져다 쓸 수 있도록 이미 만들어져 있는 함수이다.

이렇듯 기본적으로 제공되는 함수를 가리켜 '표준함수'라 하고, 표준함수들의 모임을 가리켜 '표준 라이브러리'라 한다.

C언어는 많은 수의 표준함수를 제공한다. 따라서 프로그램을 구현할 때 필요한 모든 함수를 직접 만들지 않아도 된다. 필요한 함수가 표준함수로 정의되어 있다면, 이를 사용해서 프로그램을 완성하는 것이 더 바람직하다.


1-5. '헤더파일 선언의 필요성'에 대한 설명


printf와 같은 표준함수의 호출을 위해서는 printf 함수와 관련 있는 '헤더파일 선언'이라는 것을 해야 한다. 앞어 보인 예제의 헤더파일 선언은 다음과 같다.


#include <stdio.h>


이는 stdio.h 라는, 확장자가 .h로 끝나는 헤더파일을 포함하라는 의미의 선언인데, printf 함수의 호출에 앞서 이러한 유형의 선언이 필요한 이유를 정확히 이해하는데 아직은 무리가 있으니, 일단은 다음과 같이 이해하기를 바란다.


"헤더파일 stdio.h에는 printf 함수의 호출에 필요한 정보가 존재한다. 따라서 이 파일의 정보를 포함하는 헤더파일 선언문이 삽입되어야 한다."


표준 라이브러리에는 다양한 표준함수가 존재하기 때문에, 헤더파일도 다양하게 존재한다. 그래서 필요에 따라서 여러 개의 헤더파일 선언문을 삽입하기도 한다. 헤더파일 stdio.h와 관련해서 다음 두 가지 내용을 정리하겠다.


* printf 함수의 호출을 위해서는 stdio.h를 대상으로 헤더파일 선언을 해야 한다.

* 헤더파일의 선언은 소스파일의 맨 앞부분, main 함수 정의 이전에 와야 한다.


이후에 헤더파일에 대한 내용을 공부할테니 당분간은 이 정도로 만족하자.


1-6. return은 함수의 종료와 값의 전달(반환)이라는 두 가지 의미를 지닌다.


이제 마지막으로 앞서 보인 main 함수의 다음 두 번째 문장에 대해서 설명하겠다.


return 0;

이를 가리켜 return문이라 하는데, 이 문장이 지니는 두 가지 의미는 다음과 같다.


* 함수를 호출한 영역으로 값을 전달(반환)

* 현재 실행중인 함수의 종료


따라서 위의 예제에서는 이 문장을 실행하면서 main 함수를 호출한 영역으로 0을 전달한다. 그리고는 함수를 빠져 나온다.

그런데 main 함수의 종료는 프로그램의 종료로 이어지기 때문에 결국 프로그램이 종료가 된다.

우리는 앞으로 main이 아닌 다른 이름의 함수도 정의하게 도니다. 그리고 그 함수에서도 위의 문장을 사용할 것이다. 값의 전달과 함수의 종료를 목적으로 말이다. 참고로 0이 아닌 1을 전달하려면 다음과 같이 return문을 구성하면 된다.

return 1;

이제 예제에 대한 기본적인 설명은 끝났다. 이해되지 않는 부분도 분명히 존재할텐데, 이는 앞으로 조금씩 이해해 나가면 된다.


[참고] main 함수의 return문

main함수의 마지막에서 0을 전달(반환)하는 이유는 무엇일까? 이 값은 main 함수를 호출한 영역으로 전달된다. 그런데 main 함수는 프로그램이 시작되면 자동으로 호출되는 함수이다. 그리고 호출의 주체는 Windows나 Linux와 같은 운영체제이다. 따라서 0은 운영체제에게 전달된다. 그리고 그 값은 프로그램의 종료상태를 알리는 용도로 사용된다. 보통 0은 정상적인 종료의 상호아에서 전달하는 값이다. 반면 비정상적인 상황으로 인해서 종료될 때에는 일반적으로 0이 아닌 값을 전달한다.




728x90