메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

이해하기 어려운 C ?

한빛미디어

|

2002-11-14

|

by HANBIT

9,896

「한빛 네트워크 기사 공모전」 가작: 민경준

대학교에 들어오니 C언어를 어려워하는 친구들이 대다수였다. "사실 C언어는 정말 어려운 게 아닌데…" 정말 이상하다고 느꼈다. 어려운 수학문제는 곧잘 풀면서 간단한 프로그래밍을 힘들어 하다니… 참 아이러니한 일이다.

개념만 잡으면 정말 쉬운 것이 프로그래밍 언어이다. 하나를 확실히 이해하면 다른 프로그래밍언어는 단지 필요에 따라 사용하는 도구에 불가한 것이고, 굳이 어려운 점을 꼽으라면 그것을 응용하여 프로그래밍하고 주어진 문제에 맞는 좋은 알고리즘을 작성하는 것이다. 프로그래밍을 처음 접할 때 이상한 코드 때문에 처음부터 어렵다고 느낄지도 모르겠다. 그렇지만 생각을 바꾸어 자기자신이 컴퓨터에게 명령하는 것이라고 생각하면 훨씬 이해하기 편할 것이다.

printf ?

프로그래밍을 시작할 때 처음 보게되는 명령어들이다. 그냥 단어처럼 생각하면 이해하기도 쉽겠지만 베이직처럼 PRINT "Hello World"처럼 C는 간결하지가 못하다. C언어에서도 이와 같은 단순 문자열 출력은 printf("Hello World"); 이렇게 약간은 간결하고 어떤 사람이 보더라도 명확하게 "저건 Hello World를 출력하는것이구나" 라고 말할 수 있다.

하지만 printf("%d %d %d\n",size,x,y);와 같은 문장은 분명 초보자들은 이해하기가 아주 힘들 것이다. 처음 보는 사람은 %d가 무엇인지 \n은 무엇을 하는 건지 전혀 감이 잡히지 않기 때문에 점점 프로그래밍이 어렵다고 생각될 것이다. 하지만 우리가 일상생활에서 사용하는 것을 예로 들어 설명하면 쉽게 이해가 갈 것이다.

어머니가 나에게 이런말씀을 하신다고 생각해보자.
"책상 위에 있는 종이에다가 삼촌 전화 번호 700-5857을 적어두렴"
이건 어머니가 나에게 책상 위에 있는 종이에다가 삼촌 전화 번호인 700-5857을 적으라고 명령하는 것이다. 이것을 프로그래밍 언어틱(?) 한 명령문으로 만들어보면 다음과 같다.
우리가 많이 알고있는 베이직이라면 적어놔라 "700-5857"
C언어라면 이 명령문의 구조는 적어놔라("700-5857");이 되고,
다시 이 문장은 c언어로 볼 때 printf("700-5857");과 같다.

 적어놔라 = printf();
 700-5857 = "700-5857"
적어놔라라고 말씀하신 어머님의 명령은 printf 함수와 같은 기능을 하며, 700-5857은 출력할 대상이 되는 것이다. 이제는 약간 이해가 될 것이다. 이제 우리는 C로 우리가 원하는 내용을 출력하려 한다면 printf("출력할내용");이라는 사실을 알 수 있을 것이다. 그리고 어머님께서 하신 말씀 중에 삼촌 전화번호 700-5857(설마 이 번호로 전화하실 분은 없는 걸로 알겠다. 전화를 걸면 자신의 빈 주머니가 더 쓸쓸해지게 된다)을 그냥 아무 곳에다가 적으라고 하신게 아니고 "책상 위에 있는 종이"에 적으라고 명령하셨다. 꼭 책상 위가 아닐 수도 있다. 탁자 위에 있는 종이가 적힐 대상이 될 수도 있다. C언어에서도 이처럼 출력하는 명령어가 한 가지만 있는 것은 아니다. printf는 표준출력함수로 단지 화면에다가 출력하는 역할을 한다.

그렇다면 다른 곳에 출력하려면 어떻게 해야 할까? 답은 각 출력할 곳에 따른 명령어가 C에선 따로 존재한다는 것이다. 파일에다가 출력해야 한다면 fwrite라는 함수를 제공한다. 그리고 처음부터 printf("%d %d\n",a,b); 이런 것에 신경쓰지 않아도 된다. 굳이 신경 쓴다면 이것도 위에서처럼 "%d %d\n"을 출력하는 것이다. 다만 %d %d <- 이 부분에는 정수형 변수 a,b의 값이 대입된다고 말하는데 여기서 왜 그러케 되는지 왜 겹따옴표 안에 있는 문자들이 출력되는지는 함수의 인수(parameter)에 관한 내용도 알아야 하고 기본적으로 알아야 할 것이 많다. 어느 정도 기본을 이해하고 나중에 책을 읽는다면 쉽게 이해가 갈 것이다. 적어도 단순하게 printfstdio.h란 헤더파일에 정의되어있는 표준입출력함수 중 출력을 담당하는 함수라고 가르쳐주는 친절한 사람들의 강의보다는 훨씬 친절하지않는가?

함수와 #include에 대해

우선 함수란 "특정한 작업을 수행하도록 설계된 독립적인 프로그램"이라고 정의할 수 있다. 이렇게 말해서 곧바로 이해한다면 다행이지만 대부분 쉽게 이해하지 못할 것이다. 우선 C언어의 함수도 수학에서 정의된 함수(Function)과 별반 다를게 없다는 것을 보여주겠다.
C 프로그래밍의 이해(개정 3판)


f(x)=x+1로 정의된 함수가 있다고 가정하면 f(3)의 결과는 4라는 것을 알 수 있다. f(4)의 경우에는 당연히 5가 될 것이다. 수학의 함수와 C의 함수는 정말 비슷하다.
 f(x)=x+1 은 

int f(int x)
{ 
  x=x+1;
  return x;
}
다르게 설명하자면 지금 세탁을 해야 하는데 세탁하는 방법을 모른다. 그래서 사용법이 적힌 세탁기 사용설명서를 참조하여 세탁기에게 세탁하라고 명령을 해야 한다(물론 지금은 버튼하나로 된다지만 ^^). 그럼 해결 과제인 빨래를 끝내는 프로그래밍을 해보겠다.
#include <사용설명서13page.h>

main()
{
   int is_ok;
   is_ok=세탁하기(20,5);
   if(is_ok==0) printf("너무 드러워서 빨래못함");
   else if(is_ok==1) printf("빨래가 너무 많아서 빨래못함");
   else printf("빨래 완료");
}
이 코드를 보면 알겠지만 우리는 세탁기에게 빨래하라고 시켜야 하는데 어떻게 시켜야 할지 모르고 있다. 그래서 사용설명서를 참조해야 하는데 빨래하는 방법이 적힌 페이지는 13페이지이다. 그래서 우리는 C언어의 #include로 사용설명서13page를 읽어야 한다. 이제 #include <사용설명서13page.h>를 통해서 우리는 세탁하는 방법을 알았다. 세탁하는 방법은 세탁하기(옷의 개 수,더러운 정도);라고 정의된 것이 아닌가! 이제 명령어가 "세탁하기(옷의 개 수,더러운 정도);"라는 것을 알 수 있다.

세탁하기라는 명령은 우리에게 필요한 명령어이다. 그리고 우리는 이런 것을 함수라고 한다. 함수를 이용하기 위해서는 그 함수가 정의되어있는 (사용 설명서와 같이) 헤더파일을 설정해야 한다. 만약 컴퓨터 모니터에 "안녕하세요"라는 문장을 출력하기 위해서는
main()
{
 printf("안녕하세요"); 
}
라고 하는 것은 당연하지만 에러가 난다. 우리가 컴퓨터에게 이렇게 명령한다면 컴퓨터는 printf가 무엇을 하는 것인지 모르기 때문이다. printf 명령어는 stdio.h라는 헤더파일에 사용방법이 기록되어있다. 그러므로 #include 라고 해서 stdio.h에 정의되어있는 printf를 사용할 수 있게 되는 것이다. 만약 우리가 세탁하기라는 명령어를 사용하기 위해서는 사용설명서를 읽어와야 하는 것과 같은 이치다. 내가 막노동판 일꾼이고 일하는 방법을 하나도 모르는데 업자가 나에게 "미장이를 하라", "벽돌을 쌓아라"라고 명령한다면 나는 못한다고 말할 것이다. 이것과 같이 C언어도 자기가 모르는 상태에서 무리하게 명령을 하면 못하겠다고 에러를 낸다.

마찬가지로 사장이 아무것도 모르는 나에게 미장이와 벽돌 쌓는 일을 제대로 시키려면 다음과 같이 한다. 이 코드는 미장이와 벽돌을 쌓는 방법이 나와 있는 책이 있다는 가정 하에 만들었으며 그 방법이 적힌 책의 이름은 『막노동의 이해』라고 하겠다.
#include <막노동의 이해.h>

main()
{
  미장이 하기();
  벽돌 쌓기(2); 
}
이와 같이 『막노동의 이해』라는 책을 보여주면서 미장이하는 방법과 벽돌 쌓는 방법을 가르쳐줘야 나는 미장이와 벽돌 쌓기를 할 수 있을 것이다. 이렇게 C언어는 우리의 생활에서 쉽게 발견될 수 있는 것으로 충분히 설명되며, 그 원리 또한 쉽게 알 수 있기 때문에 쉽게 잊혀지지 않는다.

C는 단순히 우리가 컴퓨터에게 일을 시키는 언어에 불과할 뿐이다.
덧붙이는 말: C언어 책처럼 순서대로 진행하면서 각 부분을 설명하지 않았기에 좀 난잡합니다.
TAG :
댓글 입력
자료실

최근 본 상품0