main 함수와 #include / C언어 입문 #1

c-language

C언어의 기본적인 특성부터 main 함수와 같은 실행 방식과 작성 시 유의 사항까지 C언어를 처음 배울 때 알아야 하는 점을 짚어봅시다.

C언어

C언어는 1972년 벨연구소에서 Dennis Ritchie가 개발한 언어이다. 역사가 오래된 만큼 투박하지만 그만큼 문법 자체가 단순한 언어다. (그래서 어렵다.) 이 언어는 다른 프로그래밍 언어들의 근간이 되고 있기 때문에 잘 배워두면 다른 언어를 배울 때 편할 것이다.

또한, 하드웨어와 밀접한 언어이다. 다른 언어들은 메모리 관리를 프로그래머가 깊게 신경 쓸 필요가 없지만 C언어는 프로그래머가 메모리 관리를 하지 않으면 큰 일이 날 수 있다. 이 언어를 통해서 메모리와 효율성을 생각하는 습관을 들인다면 다른 언어를 사용할 때도 더 효율적으로 코드를 작성할 수 있을 것이다.

main

프로그래머는 코드를 컴퓨터에서 “실행”시키기 위해서 코딩을 한다. C파일을 만들고 프로그래밍을 하면 바로 컴퓨터가 바로 그 파일을 실행할 수 있을까?

확장자가 c인 파일(예. main.c)을 C파일이라고 한다. 이 파일에 앞으로 배울 내용을 작성하면 컴퓨터가 바로 그 파일을 실행할 수 있을까? 그럴 수 없다. 왜냐하면 컴퓨터는 0과 1만 알아들을 수 있기 때문에 인간이 작성한 코드를 바로 이해할 수 없다. 따라서 인간의 코드를 컴퓨터가 알아들을 수 있게 만들어 주는 “번역가”가 필요하다.

컴파일러

컴파일러는 무엇일까? 위에서 말한 “번역가”가 컴파일러이다. 프로그래머가 작성한 코드를 컴퓨터가 이해할 수 있는 형태로 전환한다. 컴퓨터는 흔히 이진 파일(binary file)라고 불리는 파일을 실행할 수 있다. 코드를 이진 파일로 번역해주는 작업을 컴파일러가 담당한다.

main 함수

C언어는 기본적으로 “함수”들을 정의하여 작동한다. 함수가 무엇인지는 나중에 다루겠다.

#include <stdio.h>

int main(void)
{
    printf("Hello, world!");
    return 0;
}

일단은 3번째 줄 int main(void)를 무조건 작성하고 중괄호를 열어야 한다. 이렇게 코드를 작성하면 “main 함수”가 정의된 것이다. 이 파일을 실행하면 컴퓨터는 main 함수를 먼저 찾고 main 함수 중괄호 내부 내용부터 한줄씩 처리하기 시작한다.

위의 코드를 통해 예를 들어보자. 3번째 줄에서 main 함수를 찾은 컴퓨터는 5번째 줄을 실행하고 6번째 줄을 실행한다. 그리고 main 함수가 끝이 난다. 이렇게 이 파일의 실행이 끝이 난다.

라이브러리(library)

라이브러리는 함수 혹은 변수타입 등이 정의 되어있는 “파일 뭉치”라고 생각하면 편하다. 숙련된 프로그래머들이 라이브러리를 만들고 우리에게 제공해준다. 우리는 우리의 파일에 라이브러리를 가지고 오고 라이브러리에 있는 함수나 변수 타입들을 사용하면 된다.

어떤 라이브러리에 어떤 함수가 있고 그 함수가 어떤 기능을 하는지는 문서에 잘 정리되어있다. 위의 5번째 줄에서 printf()라는 함수를 실행하고 있다. 이 함수는 괄호안에 있는 내용을 화면에 출력해서 보여주는 함수이다. 따라서 5번째 줄이 실행되면 화면에 Hello, world!가 보일 것이다. 우리는 printf() 함수를 만든 적이 없는데 어떻게 사용할 수 있는 것일까?

#include <stdio.h>

첫 번째 줄에 있는 #include <stdio.h>에 주목해보자. 이 명령어는 stdio.h라는 파일을 통채로 우리의 함수에 “복사”→”붙여넣기”하는 역할을 한다. stdio.h안에 우리가 사용한 printf()에 대한 정보가 들어있기 때문에 첫번째 줄에 #include <stdio.h>를 작성하면 printf()를 바로 사용할 수 있는 것이다.

stdio.hstudio.h라고 잘못 쓰는 경우를 많이 발견할 수 있다. (스튜디오??) stdio는 standard input/output(표준 입출력)의 줄임말로 표준 입출력에 대한 함수들이 선언되어 있는 파일이다.

“.h” 확장자를 가진 파일은 헤더파일이라고 한다. C언어를 작성할 때 자주 같이 쓰일 파일이니까 간단하게 기억하고 있자.

C언어 규정에 정의되어 있는 라이브러리들이 있고, 그것을 “표준 라이브러리(standard library)”라고 부른다. 하지만 라이브러리가 표준 라이브러리만 있는 것은 아니다. 우리도 라이브러리를 만들 수 있다.

하지만 표준 라이브러리와 개인이 만든 라이브러리는 구분을 할 필요가 있기 때문에 만들어진 약속이 있다. 우리가 만약 라이브러리를 만들어서 cafe.h라는 헤더파일을 배포했다고 하면 이 라이브러리를 사용하기 위해서는 아래와 같이 코드를 작성해야한다.

#include "cafe.h"

각 괄호(<>)를 사용하면 안 되고 큰 따옴표("")를 사용하여야 한다. 이점을 유의하며 표준 라이브러리 외의 라이브러리들도 사용하여 보자.

C언어 기본 작성 방식

  1. 코드를 위에서 아래로 읽으면서 실행한다.
  2. 줄바꿈이나 띄어쓰기에 영향을 받지 않는다.
  3. 한 명령어의 끝을 ;을 통해 표현한다.

코드를 위에서 아래로 읽으면서 실행한다.

C언어는 기본적으로 코드를 위에서 아래로 읽으면서 실행한다. 따라서 제대로 실행되던 코드도 순서를 바꾸면 실행되지 않는 경우가 있다. 아래처럼 #include <stdio.h>가 main 함수의 뒤에 위치하면 어떻게 될까?

int main(void)
{
    printf("Hello, world!");
    return 0;
}

#include <stdio.h>

3번째 줄에서 printf()함수를 불러야 하는데 컴퓨터는 printf()함수가 무엇인지 알지 못 한다. 컴퓨터는 아직 #include <stdio.h>를 만나지 못 했기 때문이다. 따라서 코드를 작성할 때 실행 순서를 유의하면서 코드를 작성해야 한다.

줄바꿈이나 띄어쓰기에 영향을 받지 않는다.

C언어는 줄바꿈이나 띄어쓰기에 크게 영향을 받지 않는다. 물론, 아예 안 받는 것은 아니지만 줄바꿈이나 띄어쓰기에 대해 다른 언어들에 비해서 자유로운 언어이다. 아래와 같이 코드를 작성해도 실행에 아무런 문제가 없다.

#include <stdio.h>

int main(void){printf("Hello, world!");return 0;}

구분해야할 요소를 띄어쓰기를 통해 구분한다는 선을 지키면 들여쓰기나 줄바꿈 등은 프로그래머가 알아보기 좋은 방식으로 얼마든지 변형하여 사용할 수 있다. 어떤 요소들을 구분하여서 코드를 작성해야 하는지는 명시적으로 알아볼 수도 있지만 차근차근 공부하고 코드를 작성하다 보면 자연스럽게 알 수 있을 것이다.

한 명령어의 끝을 ;을 통해 표현한다.

위의 코드처럼 함수를 통째로 한 줄에 작성하면 컴퓨터는 어떻게 한 줄씩 순서대로 실행할 수 있는 것일까? 한 줄이 시작되고 끝났음을 알리는 기호가 바로 ;이다. 일반적인 글의 온점(.)과 같은 역할을 한다. 많은 입문자들이 ;를 작성하는 것을 까먹는데 잊지 말고 작성해 주어야 한다.

아래와 같이 코드를 작성하면 사람이 보기에는 한 줄 같지만 컴퓨터는 printf()return 0가 다른 명령어라는 것을 인지한다.

printf("Hello, world!"); return 0;

하지만 아래처럼 사람들이 보기에는 두 줄처럼 보여도 ;가 없다면 컴퓨터는 하나의 명령어로 이해한다. 그런데 당최 이해할 수가 없으니 제대로 실행되지 않을 것이다.

printf("Hello, world!") 
return 0

main 함수와 기본적인 C언어의 특성들에 대해서 알아보았다.

Leave a Comment

Index