
1. C언어의 기본단위인 '함수'의 이해
"C언어로 만든 프로그램은 함수로 시작해서 함수로 끝난다"
C언어로 프로그램을 작성한다는 것은 '함수를 만들고, 만든 함수들의 실행순서를 결정하는 것'이기 때문이다.
즉, 정해진 순서에 의해서 진행되는 함수의 호출이 바로 프로그램이다.
그렇다면 제일 먼저 호출되는 함수는 무엇일까?
바로 main이라는 이름의 함수이다.
프로그램이 실행되자마자 컴퓨터는 main이라는 이름의 함수를 찾아서 호출을 한다.
따라서 C언어로 구현된 모든 프로그램에는 main이라는 이름의 함수가 정의되어야 한다.
int main(void){
int num = 10;
printf("Hello World");
}
위 소스코드의 각 단어는 다음을 의미한다.
"출력의 형태가 int이고 입력의 형태가 void인 main이라는 함수"
그리고 중괄호로 감싸지는 부분이 함수의 몸체이며, 여기 안에 있는 문장들은 순차적으로 실행이 된다.
즉, 중괄호 내에 존재하는 문장은 그 수에 상관없이 위에서 아래로 순차적으로 실행이 된다.
이 문장들 끝에는 세미콜론(;)이 붙어있다.
이렇듯 C언어는 문장의 끝을 표현하기 위해서 세미콜론을 사용한다.
그런데 모든 문장에 세미콜론이 붙는 것은 아니다.
이후에 소개하는 조건문이나 반복문과 같은 컨트롤 문장에는 세미콜론이 붙지 않는다.
2. 표준 라이브러리와 printf 함수
main 함수의 몸체에는 printf() 함수가 존재한다.
printf("Hello World\n");
함수를 호출할 때, 소괄호 안에는 함수호출 시 전달할 인자정보를 표현한다.
그리고 C언어는 큰따옴표를 이용해서 문자열을 표현한다.
그런데 우리는 printf 라는 이름의 함수를 만든 적이 없는데 어떻게 호출할 수 있을까?
큰따옴표로 표현되는 문자열 안에는 특수한 의미의 문자를 삽입할 수 있다.
앞서 보인 문자열에 삽입된 문자 \n도 그러한 특수문자 중 하나이다.
이러한 특수문자의 공식명칭은 'escape sequence'인데,
이스케이프 시퀀스 중 하나인 \n은 줄을 바꾸라는(개행 하라는) 의미로 사용이 된다.
printf 함수는 함수호출 시 전달되는 문자열을 모니터에 출력하는 기능을 지닌다.
이러한 printf 함수는 직접 만들지 않아도 호출이 가능한, 기본적으로 제공이 되는 함수이다.
즉, 누구나 가져다 쓸 수 있도록 이미 만들어져 있는 함수이다. 이렇듯 기본적으로 제공되는 함수를 가리켜 '표준함수'라 하고, 표준 함수들의 모임을 가리켜 '표준 라이브러리'라 한다.
C언어는 많은 수의 표준함수를 제공한다.
따라서 프로그램을 구현할 때 필요한 모든 함수를 직접 만들지 않아도 된다.
필요한 함수가 표준함수로 정의되어 있다면, 이를 사용해서 프로그램을 완성하는 것이 더 바람직하다.
3. 헤더파일 선언의 필요성
printf 와 같은 표준함수의 호출을 위해서는 printf 함수와 관련 있는 '헤더파일 선언'이라는 것을 해야 한다.
#include <stdio.h>
이는 stdio.h라는, 확장자가 .h로 끝나는 헤더파일을 포함하라는 의미의 선언이다.
"헤더파일 stdio.h에는 printf 함수의 호출에 필요한 정보가 존재한다. 따라서 이 파일의 정보를 포함하는 헤더파일 선언문이 삽입되어야 한다."
표준 라이브러리에는 다양한 표준함수가 존재하기 때문에, 헤더파일도 다양하게 존재한다.
그래서 필요에 따라서 여러 개의 헤더파일 선언문을 삽입하기도 한다.
이제 마무리 차원에서 헤더파일 stdio.h와 관련해서 다음 두 가지 내용을 정리하고자 한다.
- printf 함수의 호출을 위해서는 stdio.h를 대상으로 헤더파일 선언을 해야 한다.
- 헤더파일 선언은 소스파일의 맨 앞부분, main 함수 정의 이전에 와야 한다.
4. 함수의 종료와 값의 전달(반환), 두 가지 의미를 갖는 return
이제 마지막으로 앞서 보인 main 함수의 마지막 문장에 대해서 설명하겠다.
return 0;
이를 가리켜 return문이라 하는데, 이 문장이 지니는 두 가지 의미는 다음과 같다.
- 함수를 호출한 영역으로 값을 전달(반환)
- 현재 실행중인 함수의 종료
따라서 위의 소스코드에서는 이 문장을 실행하면서 main 함수를 호출한 영역으로 0을 전달한다.
그리고 main 함수를 빠져 나온다.
그런데 main 함수의 종료는 프로그램의 종료로 이어지기 때문에 결국 프로그램이 종료가 된다.
우리는 앞으로 main이 아닌 다른 이름의 함수도 정의하게 된다.
값의 전달과 함수의 종료를 목적으로 말이다.
main 함수의 마지막에서 0을 전달(반환)하는 이유는 무엇일까?
이 값은 main함수를 호출한 영역으로 전달된다.
그런데 main 함수는 프로그램이 시작되면 자동으로 호출되는 함수이다.
그리고 호출의 주체는 Windows나 Linux와 같은 운영체제이다.
따라서 0은 운영체제에게 전달된다.
그리고 그 값은 프로그램의 종료상태를 알리는 용도로 사용된다.
보통 0은 정상적인 종료의 상황에서 전달하는 값이다.
반면 비정상적인 상황으로 인해서 종료될 때에는 일반적으로 0이 아닌 값을 전달한다.
5. 주석의 필요성
주석(comment)은 프로그램 내에 삽입된 메모를 뜻한다.
이는 컴파일 대상에서 제외가 되기 때문에 주석의 유무는 프로그램의 실행결과에 영향을 미치지 않는다.
/*
주석처리 된 문장
*/
//주석처리 된 문장
6. printf 함수를 이용한 출력과 서식문자
"printf 함수는 첫 번째 인자로 전달된 문자열을 출력한다."
이 소스코드에서 처음으로 등장하는 %d라는 문자가 있는데, 이를 가리켜 '서식문자(conversion specifier)'라 한다.
이는 출력의 형태를 지정하는 용도로 사용이 된다.
그런데 출력의 형태를 지정하려면 '출력의 대상'이 있어야 할게 아닌가?
printf("%d\n", 1234);
이 문장을 자세히 보면 두 번째 인자가 있음을 알 수 있다.
바로 이 두 번째 전달인자가 출력의 대상이 된다.
"함수호출 시 전달되는 인자는 ,(콤마)로 구분한다."
그렇다면 %d가 지정하는 출력의 형태는 무엇일까?
이는 '10진수 정수형태의 출력'을 의미한다.
따라서 printf 함수호출 시 전달된 두 번째 인자가 %d의 위치에서 10진수 정수로 출력되고, 이어서 나오는 \n이 출력된다.
물론 \n은 개행을 의미하므로 별 다른 출력 결과 없이 개행만 이뤄진다.