1장 C 언어

제가 좋아하는 최호성 저자의 "독하게 시작하는 C 프로그래밍" 책을 참고하여 작성하였습니다.

C 언어 소개

C 언어는 '데니스 리치'가 UNIX 운영체제를 개발하기 위해서 만든 고급 언어로, '켄 톰슨'이 만든 B언어를 발전 시켜 만들어졌다.

첫 번째 예제, Welcome C Programing!

#include <stdio.h>

int main(void){
  printf("Welcome C Programing!\n");
  return 1;
}

소스코드 작성.

작성후 파일을 저장하고 컴파일과 링킹후 실행해본다.

❯ gcc -c welcome.c
❯ gcc -o welcome welcome.o
❯ ./welcome
Welcome C Programing!

터미널에서 실행.

프로그램의 기본 요소

상단에 예제 Welcome C Programing! 는 기본 뼈대를 모두 갖추었기 때문에 중요한 예제이다.

예제를 이루는 주요 요소는 전처리기, 구문, 함수, 반환 자료형, 매개변수, 스코프 등이 있다.

#include 전처리기

#include <stdio.h>

'#' 기호는 전처리기를 나타내는 기호이며, include는 뒤에 오는 파일을 소스에 포함하라는 의미이며, stdio.h 는 'Standard Input/Output' 을 의미하는 표준입출력 헤더 파일이다.

전처리기에서 '전'은 '컴파일 이전'을 의미한다. stdio.h 파일처럼 .h 확장자를 가진 파일을 헤더 파일이라고 하며, 헤더 파일에는 각각의 기능을 수행하는 함수들이 선언 되어있다.

따라서 #include <stdio.h>는 소스 코드를 기계어로 만들기 이전에 stdio.h 파일을 소스 코드에 포함시켜 컴파일 하라는 의미가 된다.

이처럼 stdio.h 헤더를 포함하는 이유?

예제에서 사용한 printf()함수에 대한 선언이 stdio.h 에 있기 때문이다.

스코프와 구문

스코프는 여러 구문을 한 덩어리로 묶을 때 사용하며, 중괄호'{', '}' 로 표시한다. C 언어에서 구문의 끝은 세미콜론 ';'으로 나타내며 이를 빼고 작성하게되면 문법 오류가 발생하며 주의해야한다.

프로그램이란 각 구문이 모여 연속된 흐름으로 한 덩어리를 이룬것이다.

예를들어 내가 커피를 마신다 라고 가정한다면.

1. 카페에 간다.
2. 카페 문을 연다.
3. 직원에게 커피를 주문한다.
4. 직원에게 금액을 지불한다.
5. 커피가 나올때까지 대기한다.
6. 직원이 커피를 제공한다.
7. 커피를 받는다.
8. 커피를 마신다.

시간에 흐름에 따라 행동들이 차례대로 나열되어 있음을 알수있다. 그런데 만약 1번과 3번을 바꾼다면 카페에 가지도 도착하지도 못한채로 커피를 주문하는 꼴이된다. 즉, 논리적으로 말이 되지 않는다. 이처럼 문법이나 논리적으로 문제가 없는 구문들을 나열하여 의미 있는 절차상의 흐름을 만드는 것을 프로그래밍이라고 할 수 있다.

함수

C 언어는 함수로 시작하여 함수로 끝나는 절차지향 프로그래밍 언어이다.

f(x) = y

C 언어의 함수는 기본적으로 매개변수 x, 함수몸체 f(), 반환값 y, 로 이루어져 있다. 매개변수는 함수가 연산을 하는데 영향을 주는 변수이고 반환값은 함수가 연산을 끝내고 얻는 결론 값이다.

위 예제에서 printf() 와 main()이 함수이다. printf()는 이미 만들어져있는 함수이고, main() 은 프로그래머가 직접 만든 함수이다.

int main(void){
  printf("Welcome C Programing!\n");
  return 1;
}

이 코드는 int main(void)은 main() 함수의 반환 자료형이 int형이며 매개변수는 없다 라는 의미이다.

main 함수에서 printf 함수를 호출하며, main 함수는 호출자 콜러가 되고 main 함수로부터 호출된 printf 함수는 피호출자 콜리가 된다.

호출자 함수는 반드시 피호출자 함수 매개변수의 초깃값을 확정해야한다. 예제의 printf() 함수에서는 "Welcome C Programing!\n"가 매개변수의 초기값이다.

피호출자 함수는 호출자에게 적절한 정보를 반환 해야할 의무가 있다. 시스템에 어떤 함수가 main 함수를 호출한다면 main 함수는 호출자 함수에게 정보를 반환 해야한다. 이때 사용하는 예약어가 return 이다.

빌드 타임에 벌어지는 일들

빌드 과정은 컴파일과 링킹 과정을 하나로 합친 것을 말하며, 컴파일은 사람이 작성한 소스코드를 기계(CPU) 가 이해할수 있는 명령어로 번역 하는 과정이다. 그리고 링킹은 번역된 결과물을 한데 묶어서 실행할 수 있는 파일 형식으로 만드는 과정이다.

프로그램의 소스코드(.c)는 '설계도' 이고 목적파일(.o)는 설계도를 가지고 만든 '부품' 이고 이 부품들을 조림하는 과정이 링킹 이다.

최종 결과물인 실행파일 (.exe)는 '완제품'이라고 할수 있다.