티스토리 뷰

Table of Contents


컴파일러

hello world! 프로그램 분석




1. 컴파일러


 영어로 compiler
이름 그대로 컴파일을 해주는 도구입니다.


 C언어가 아무리 프로그래밍 언어라고 해도, 기계 입장에서는 0101010으로 이루어진 것이 아닌 꽤 복잡한 언어입니다. 따라서 CPU가 C언어의 명령들을 그대로 실행하는 것에는 무리가 있습니다. 하지만 C 컴파일러가 있다면 문제 되지 않습니다. C 언어로 작성된 명령들을 C 컴파일러에게 전달하면, C 컴파일러가 알아서 컴퓨터가 이해할 수 있는 기계어로 바꾸어 주기 때문입니다. 이러한 과정을 컴파일이라고 합니다.


 당연하다면 당연한 이야기지만, 결국 C언어를 공부하기 위해선 이 컴파일러가 필요하게 됩니다.


 컴파일러는 직접 PC에 설치하여 사용할 수도 있고, 컴파일러를 제공하는 웹 사이트를 통해 사용하는 것도 가능합니다. 아래의 링크는 이 두 가지 방법 중 웹 사이트를 이용하는 방법으로서, 아직 C언어로 프로그래밍을 한 번도 해보지 않았다면 반드시 링크를 따라 들어가서 첫 번째 프로그래밍을 해보는 걸 추천합니다.


웹 사이트에서 프로그래밍 연습하기


 그리고 아래의 링크를 순서대로 따라가면, 윈도우 환경에서 직접 컴파일러를 깔아 사용할 수 있습니다. (14->15->13 순이 맞습니다.)


https://www.acmicpc.net/blog/view/14


https://www.acmicpc.net/blog/view/15


https://www.acmicpc.net/blog/view/13


C++ 컴파일러는 C언어도 제대로 컴파일할 수 있으므로, 위의 링크에서 완성한 C++ 환경에서 공부하여도 무리는 없습니다.




2. hello world! 프로그램 분석


 이제, '웹 사이트에서 프로그래밍 연습하기'에서 쓰인 hello world! 프로그램을 통해 C언어의 기본 구조를 알아보도록 하겠습니다. 이 프로그램은 짧지만, C언어의 특성을 고루 갖추고 있기 때문에 생애 첫 프로그래밍을 할 때 작성하는 것으로 유명한 프로그램입니다.


 이 글은 이 간단한 프로그램 예제의 분석을 통해 C언어의 기본적인 문법과 실행 방식에 대한 감을 잡는 걸 목적으로 합니다. 아래에서 할 설명을 100% 이해할 필요까진 없지만, C언어가 대강 이런 식으로 진행된다는 감을 잡게 되면 이후의 공부를 편하게 하실 수 있습니다.


1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void) {
    // your code goes here
    printf("hello hell world!");
    return 0;
}
cs


 이 프로그램의 기능은 화면에 hello hell world! 를 출력하는 것으로서, 타이핑을 제대로 마친 후 실행시켜 보면 output 부분에 hello hell world! 가 출력됨을 알 수 있습니다.  (온라인에서 웹 컴파일러를 사용하든, 윈도우에 컴파일러를 깔아서 사용하든, 복사 붙여넣기는 자제하고 직접 타이핑을 마친 후 실행시켜 봐야 합니다. 스스로 프로그래밍을 해보면서 진도를 나가지 않으면, 갈수록 이해와 습득이 어려워지게 됩니다.)


1. #include <stdio.h>


 include는 한글로 '포함하다'란 뜻으로 직역하면 '<stdio.h>를 포함하라.'라는 뜻이 되며, 실제 하는 일도 크게 다르지 않습니다. C 컴파일러는 이 구문을 본 후, stdio.h 파일을 이 프로그램에 포함 시킵니다. stdio.h 파일은 C언어로 작성되어 있으며, #include<stdio.h> 한 줄을 적어줌으로서, 결과적으로 stdio.h 파일에 있는 모든 C언어 구문들을 타이핑한 것과 같은 효과를 누릴 수 있습니다.


 stdio.h 파일에는 C 언어의 기능 중 '출력' 에 필요한 것이 담겨있기 때문에, hello world! 라는 구문을 출력할 때 필요합니다. 이처럼 외부의 파일을 프로그램에 포함 시키는 구문을 '전처리기'라고 부릅니다.



2. int main(void)


 이 구문은 C언어 프로그램의 시작을 알리는 main 함수를 선언한 것입니다. C언어에서 함수란, 함께 작업을 수행하는 구문들의 그룹입니다.


1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void) {
    // your code goes here
    printf("hello hell world!");
    return 0;
}
cs



 위의 프로그램으로 예시를 들면, 4, 5, 6번째 줄에 있는 3개의 구문을 3, 7번째 줄에 있는 괄호({})로 묶어놓은 후, 그 그룹에 main이라고 이름을 붙인 것입니다. 또한, 수학에서의 함수와 같이 C언어의 함수에도 입력과 출력이 있을 수 있습니다. 이해를 위해, '로그인 함수'를 예시로 들어보면 아래와 같이 됩니다.



 위의 '로그인 함수'는 사용자가 로그인을 시도할 때, 입력한 ID와 비밀번호가 유효하다면 YES, 아니면 NO를 반환하는 함수입니다. 아이디와 비밀번호의 유효성을 확인하기 위한 구문 1~4를 '로그인 함수' 라는 그룹으로 묶어 놓은 개념으로도 볼 수 있습니다. 이를 C언어의 형식과 유사하게 표현하면 아래와 같이 됩니다. (이 예시는 C언어의 문법에 정확히 따른 것이 아닌, 개념만 담은 것입니다.)


1
2
3
4
5
6
YESorNO 로그인(ID, 비밀번호) {
    저장된 비밀번호 중, 입력 받은 ID 에 해당하는 것을 찾아라.
    찾은 비밀번호와 입력 받은 비밀번호를 비교하라.
    두 비밀번호가 일치하면 YES를 출력하라.
    두 비밀번호가 서로 다르면 NO를 출력하라.
}
cs


 이제 int main(void)을 해석해 보면, int 는 integer '정수'의 약자, main은 함수의 이름, void 는 '없음'을 지칭하는 것으로, 이 세 개가 조합된 int main(void)의 의미는 '아무것도 입력받지 않고(void) 정수 형태의 데이터(int) 를 반환하는 main이라는 이름의 함수' 가 됩니다.



 이러한 main 함수를 실행시키면 { 부터 } 사이에 있는 구문들이 순차적으로 실행됩니다. 함수에 대해서는 시리즈 후반에 따로 다룰 것이기 때문에 지금 당장은 잘 이해가 안 되더라도, C언어를 공부하는 데에 무리는 없습니다. 다만, main 함수에 대해서는 꼭 알아두어야 할 것이 있습니다. C언어는 이 main 함수를 찾은 후, 그곳부터 프로그램을 실행시키기로 약속되어 있습니다. 이는 다른 함수와는 다른 main 함수의 특징입니다. 따라서 C언어로 작성된 프로그램을 실행시키면, main 함수부터 실행되며 main 함수가 종료되면 프로그램도 종료됩니다.


3. {


메인 함수의 시작을 알리는 기호입니다. 함수의 범위는 { 부터 } 까지 입니다.


4. // your code goes here


'주석'이라고 부릅니다. C언어는 // 로 시작하는 줄은 무시하고 실행되며, 이를 이용해 프로그램에 대한 설명을 넣고 싶다면,


// main 함수는 ~~한 함수이다.


이런 식으로 작성하는 것이 가능합니다. 컴파일러는 // 이후의 글을 완전히 무시하기 때문에, C언어의 문법에 맞지 않더라도 에러가 나지 않습니다. (위의 구문에서 // 를 지운 후 실행시키면, C언어의 문법에 맞지 않기 때문에 에러가 납니다.)


주석을 여러 줄 쓰고 싶다면


/*

주석주석1

주석주석2

*/


의 형식으로 사용 가능합니다. /* 와 */  를 쓰면 /* 를 시작으로 */ 까지 주석으로 처리됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void) { // 메인함수의 시작
    // your code goes here
    printf("hello hell world!");
    /*
    printf 설명
    printf("출력할 내용");
    위와 같이 입력하면 원하는 글을 출력할 수 있다.
    */
    return 0;
// 메인함수의 끝
cs


5. printf("hello hell world!");


 화면으로 괄호 안의 내용을 출력하는 함수이며, 그러므로 이 구문은 hello hell world!를 출력하라는 뜻이 됩니다. 따라서 이 프로그램을 실행시켜 보면, 웹 컴파일러에서는 output 탭을 통해 이 출력 값을 표시하고, PC에 설치한 컴파일러에서는 대개 새로운 실행 창을 띄워 보여줌을 알 수 있습니다.



 이 구문의 끝에는 ;가 달려 있는데 C언어에서는 함수의 선언, 전처리기 등 특수한 경우가 아니라면 마치 한글에서의 . 처럼 문장의 끝을 알려주는 ; 을 반드시 붙여줘야 합니다. 한글에서는 맞춤법을 조금 틀려도 뜻이 통해서 상관없는 경우들이 있지만, C언어는 컴퓨터가 이해해야 하므로 정확하게 문법을 맞춰주는 것이 중요합니다.


6. return 0;


 '0 을 반환하라.'라는 뜻으로 이 구문을 통해 main 함수는 함수가 끝날 때 0을 반환하게 됩니다.

(위에서 main 함수의 출력 형식을 int (정수) 로 지정했기 때문에 return 뒤에는 반드시 정수가 와야 합니다.)


 C로 만들어진 프로그램은 main 함수를 제일 처음으로 실행하며, main 함수에서 0이 반환되어야 정상적으로 종료되었다고 판단합니다. 0을 반환해 줘야 운영체제가 '프로그램이 정상적으로 종료되었음.'을 확인할 수 있는 것입니다. main 함수가 0을 반환하는 것은 C 언어 표준으로 정해진 것으로서 C 언어와 C 언어를 사용하는 프로그래머들 사이의 약속이라고 볼 수 있습니다. 또한, 여기에도 문장의 끝을 알려주는 ; 를 반드시 붙여줘야 합니다.


7. }


} 는 main 함수의 끝을 의미합니다.



프로그램 시작 -> main 함수 호출 (자동) -> main 함수의 중괄호 내부 내용을 실행 ( 이 부분에서 printf 함수 실행 )

-> main 함수가 0을 반환 -> 정상 종료