=============================================================================
C 프로그래밍 1회
=============================================================================
제가 C언어 강좌를 시작하려고 합니다.
제가 아는 모든 내용을 잘 정리해 쓴 것입니다.
부족한 점 있더라고 잘 봐주세요.
1. C언어 소개.
C언어란 것은 아주 강력한 기능을 가진 프로그래밍 언어 입니다.
C언어가 Unix운영체제 하에서 시스템 프로그래밍을 하기 위해 개발된 언어라는건
알고 있지만 정확히 누가 만들었는지는 저두 잘 모릅니다.
(추가사항 - C언어/UNIX 창시자 : 데니스 리치<Dennis Ritchie | Dennis MacAlistair Ritchie> ,B언어 업그레이드가 C언어..)
사실 그건 중요한게 아니죠.
C언어는 구조화 프로그래밍을 지향하는 언어이고 정말로 가장 쓸모있는 언어라고
할수 있습니다.
이유는 C언어에서는 못하는게 없기 때문이죠.
좀 과장된 표현 같기도 하지만 다른 언어들과 비교해 볼때 못하는거란 없습니다.
그리고 C언어로 만든 프로그램의 속도는 어셈블리어 만큼이나 빠른 속도를 내기 때문에
빠른 속도를 요구하는 프로그램에도 적합하죠.
단 게임과 같은 곳에서는 C언어의 속도도 조차도 느리기 때문에..
어셈블리가 요구되는 곳이 있지만, 요즘 C언어 컴파일러들은 인라인 어셈블러라는 것을
지원해서 C소스 내에 어셈블리 코드를 추가할수 있습니다.
이런 점으로 볼때 C로는 못하는게 없다고 봐도 되겠죠?
그래도 실감이 나지 않으시면 C언어로 만들어진 대표적인 프로그램을 예로 들어 볼까요?
그런데 그럴려면 한가지 문제가 있네요.
이 문제가 뭐냐 하면..
C언어로 만들어진 유명한 프로그램이 너무나도 많다는 것이죠.
그래도 몇가지 예를 들어 보죠.
우선 OS에서는 Unix의 커널의 일부분을 제외한 모든 부분이 C로 만들어 졌습니다.
정말 굉장하죠..?
그리고 Windows 95도 커널의 일부분과 *.VxD만 빼면 모두 C로 만들어졌습니다.
그것두 우리가 잘 알고 있는 Visual C++의 버전 2.1로 만들어졌죠.
또하나 굉장한 사실이 있는데..
Windows NT는 커널 부분까지 C로 만들어졌다는 것이죠.
C언어로 만들어진 프로그램에는 게임도 많은데, 데부분의 게임은 C언어로 만들어졌다고
보면 됩니다.
게임을 시작할때
DOS/4GW Protected Mode Run-time Version 1.97 Copyright (c) Rational Systems Inc...
이런 것을 많이 보셨을 겁니다.
유명한 게임을 시작할땐 다 이게 나오는데, 이게 나오는건 C언어도 만들어진 것 입니다.
Watcom C++라는 개발 툴로 만들어진 것이죠.
또 한가지 놀라운 사실이 있는데, C언어 컴파일러도 C언어로 만든다는 것이죠.
이정도면 C언어로 못하는게 없다는 말이 이해가 되시겠죠?
그럼 이제 그 C언어의 세계로 들어가 보도록 하죠.
2. C언어에는 어떤 종류가..
'C언어에는 어떤 종류가..'라는 제목을 보고 글이 자꾸 읽고 싶어 지신다면
그 분은 분명 C언어 초보자 입니다.
하지만 이 제목을 보고선 무언가 이상하다고 느끼시면 진정한 전문가라고 할수 있죠.
이유가 궁금하시죠?
이유는 C언어에는 종류가 없기 때문이죠.
종류가 없는데 제목이 저러니 당연히 이상할수 밖에요.
C를 처음 하시는 분들이 많이 질문하시는 것들 중 하나가
'C와 Visual C의 차이점이 무엇인가요?' 입니다.
제가 이 질문을 받았다면 이렇게 답해 드리고 싶군요.
'C는 언어이고 Visual C는 언어가 아님니다.' 라구요.
여기서 Visual C라는 건 Microsoft라는 회사에서 만든 C언어로 프로그래밍 할때
필요한 도구를 말합니다.
즉 언어가 아니라는 것이죠.
단지 C언어로 프로그래밍을 할때 필요한 도구에 지나지 않습니다.
언어는 바로 C이죠.
그러므로 Visual C와 Borland C등은 문법에선 차이가 있을수 없습니다.
정리하면 C는 언어이고, Visual C, Borland C등은 언어가 아니라 C언어를 사용해 프로그램을
제작하기 위한 도구이며, 모두 C언어 프로그램을 제작하기 위한 도구 이므로 문법이 차이는
있을수 없다는 것을 꼭 기억하시기 바랍니다.
그리고 여기서 한가지 말씀드릴것이 있는데,
위에 Visual C라고 썼지만 실제는 이게 아니고 Visual C++입니다.
그럼 또 한가지 의문이 생기실건데 Visual C++에서 C++가 아닌 C언어 프로그램을
작성할 수 있는지 말입니다.
이 의문의 답은 Yes!입니다.
C++라는 언어는 C언어를 객체 지향 프로그래밍이란 것을 할수 있도록 확장시킨 언어 이죠.
그래서 C++언어는 C언어를 포함한다고 할수 있죠.
그러므로 Visual C++에서 아무리 C++라고 쓰여져 있어도 C프로그래밍은 가능합니다.
3. C언어는 어떻게..
이제 C언어 프로그램이 어떻게 실행되어지는가를 알아봅시다.
C언어로 프로그램을 만들면 실행파일(.EXE)을 만들 수가 있습니다.
실행파일이 만들어지데는 다음과 같은 과정을 거칩니다.
(1)소스 코드 -> (2)소스 파일 -> 텍스트 에디터 선행처리기
(3)선행처리기 지시어가 번역된 소스 파일 -> 컴파일러 라이브러리
(4)목적 파일 -> (5)실행파일 링커
(1) 소스 코드 (Source)
프로그램의 내용 자체를 소스 코드라고 합니다.
(2) 소스 파일 (Source file)
소스 코드를 택스트 파일에 기술하여 만들어진 파일을 소스 파일이라고 합니다.
C언어의 소스 파일은 확장자가 .C입니다.
C언어 프로그램 만드는 가장 첫번째 과정이라고 할 수 있죠.
(3) 선행처리기 지시어가 번역된 소스 파일
C언어 프로그램 내에는 여러가지 지시어 들이있는데 이건 C언어 문법과는 별게이고 번역도
컴파일러가 하지 않습니다.
이걸 번역하는 프로그램을 선행처리기라고 합니다.
(4) 목적 파일 (Object file)
지시어가 번역된 소스 파일은 다음으로 컴파일러라는 프로그램에 의해 기계어로 번역 됩니다.
이 번역된 파일을 목적 파일이라고 하고, 확장자는 .OBJ가 됩니다.
그러데 여기서 이상한 점이 있죠? 기계어로 번역하면 실행할수 있을 건데 왜??
실행파일을 만들지 않고 목적파일이라는 만들까요?
하지만 기계어로 번역되었다고 해서 실행할수는 없습니다.
실행파일이 되기 위해선 런타임 라이브러리 라는 것이 목적 파일과 합쳐져야 하기 때문이죠.
이 런타임 라이브러리가 무엇인지는 나중에 설멸하기로 하고 그냥 런타임 라이브러리라는 것이
합쳐져야 한다는 것만 알아두세요.
(5) 실행 파일 (Executable file)
목적파일은 위에서 말한 런타임 라이브러리와 합쳐져서 실행파일이 되는데,
이때 합쳐주는 프로그램을 링커라고 합니다.
링커에 의해 목적 파일은 실행파일이 되죠.
그럼 실행할수가 있게 됩니다.
4. C 프로그램의 기본적인 구조.
이정도 알았으면 이제 C언어 프로그램의 문법적인 구조를 살펴보기로 합시다.
이제부터 정말 C의 문법에 대한 공부를 들어갈탠데,
이번에 나올 C 프로그램은 기본적인 구조만 이해하시면 된겁니다.
세부적인 부분은 모르셔도 됩니다.
기본적인 구조를 알고 계셔야 다음 강좌의 이해가 쉽기 때문이죠.
(1) 자유로운 형식 C언어는 다른 언어들과는 달리 형식이 메우 자유롭습니다.
우선 예제 소스 하나를 보며 공부해보도록 하죠.
/* 파일 이름 : C1-1.C 프로그램 내용 : 화면에 메시지를 출력하는 프로그램.*/
#include
void
main()
{
printf("This is a first program.");
}
이 소스는 아주 간단한 소스 입니다.
하지만 C를 처음 대하시는 분 이라면 아주 생소하게 느껴질 것 입니다.
이 소스 내용은 아직은 이해하지 못하셔도 되니까 겁먹지 마시고 잘 봐주세요.
하여튼 그건 그렇고 아까 그 소스(C1-1.C)와 다음에 나오는 소스를 비교해 보세요.
/* 파일 이름 : C1-2.C 프로그램 내용 : 화면에 메시지를 출력하는 프로그램. */
#include void main() {printf("This is a first program.");}
이 소스들을 비교해 보세요.
주시해서 봐야 할 곳은 void...); }부분 입니다.
두 소스중 어떤 것이 보기가 쉽죠???
당연히 첫번째 소스가 더 읽기 쉬울 것 입니다.
하지만 이 두 소스는 완전히 똑같은 기능을 수행합니다.
결과를 봐볼까요??
두 개를 컴파일해서 C1-1.EXE, C1-2.EXE를 만들고 실행하면..
C:\>C1-1.EXE
This is a first program.
C:\>C1-2.EXE
This is a first program.
C:\>
똑같은 소스 이지만, 두번째 소스는 첫번째 소스를 한줄에 다 써 버린 것 입니다.
하지만 컴파일러는 똑같은 내용으로 인식하게 되죠.
여기서 말하고자 하는 것은 C언어 프로그램은 자유로운 형식을 같는다는 것 입니다.
즉 여러줄에 써야 할 것을 한줄에 써 버려도 상관 없다는 것이죠.
또한 이 말은 한줄에 써야 할 것을 여러줄에 쓸 수도 있다는 말 입니다.
더 정확히 말하자면 C언어 에서는 공백을 인식하지 않습니다.
즉 공백이 많이 있어도 그건 없는거나 마찬가지 이죠.
그러므로 첫번째 소스도 실제로 컴파일러에서는 두번째 소스처럼 인식하게 되는 것 입니다.
하지만 공백 없이 한 줄에 다 써 버리면 읽기가 힘들어 지므로,
되도록 보기 쉽게 공백을 두고 쓰는 것이 좋습니다.
(2) 대소문자 구별 C언어는 대문자와 소문자를 구별한다는 것을 기억해 두시기 바랍니다.
예를들어 Basic에서 화면에 메시지를 출력하는 명령어인 PRINT는 print라고 써도 상관 없고
Print, prinT, pRint등으로 써도 모두 같은 것으로 인식합니다.
하지만 C에선 그렇지 않습니다.
베이직의 PRINT의 기능을 하는 것으로 아까 예제 소스에서 나온 것 인데..
C에서는 printf라는 것이 있습니다.
그런데 이걸 Printf, pRintf, PRINTF등등.. 이렇게 써서는 절데 안됨니다.
모두 다른 것으로 인식하기 때문에 반드시 printf로 써 주어야 하죠.
보통 C에서는 거의 다 소문자로 되어있어요.
그리고 C언어가 지원하는 기본 어휘 그러니까..
베이직에서는 PRINT, INPUT, DIM등등의 명령어들과 같은 역할을 하는 기본적 어휘를
키워드(예약어)라고 하는데, 이것들도 모두 소문자로 되어있죠.
(3) 주석 (설명문) 주석문은 프로그램과는 아무 상관이 없어 없는것과 마찬가지 이지만,
프로그램의 내용을 설명하기위해 쓰는 글 입니다.
C에서 주석문을 쓰는 것은 간단합니다.
설명하는 글 앞에는 /*를 붙이고 뒤에는 */를 붙이면 되는 것 입니다.
예를들어.. /* 주석문 입니다 */ 이렇게 하면 주석문이 됨니다.
즉 없는 거나 마찬가지인 글이 되는 것이죠.
예제 소스를 하나 들어 보죠.
/* 파일 이름 : C1-3.C 프로그램 내용 : 주석문을 설명하기 위한 프로그램. */
void main() { int a, b, c;
/* 정수 변수 a, b, c를 선언 */
a=10;
/* a에 10을 넣는다. */
b=20;
/* b에 20을 넣는다. */
c=a+b;
/* c에 a와 b를 더하여 넣는다. */
}
여기서 /* */로 묵인 것은 모두 주석문 입니다.
즉 /* */로 묵인 것은 없어도 상관 없습니다.
그리고 주석문은 여러줄이 되어도 상관 없습니다.
/* 주석문 입니다.. 이것두 주석문 입니다.. */
이렇게 써도 상관 없다는 것 입니다.
C에서는 한줄에 쓸 것을 여러줄에 써두 된 다고 배웠는데, 위와 같이 주석문을 쓴 것두
/* 주석문 입니다..
이것두 주석문 입니다.. */
이렇게 써야 할 것을 위와 같이 쓴 것 뿐이라고 생각하시면 이해가 되실 것 입니다.
주석문을 쓰는 이유는 프로그램에 대한 설명을 써 둠으로써 읽기 쉽게 하고 오류를 찾아네거나
수정하는 작업을 쉽게 하기 위해서 입니다.
물론 간단한 프로그램의 경우 특별히 주석 없이도 충분히 읽을수가 있지만,
정말로 복잡한 프로그램에선 주석문이 큰 도움을 줄수 있죠.
주석문을 쓸 때는 공백을 최대한 이용하는 것이 좋습니다.
공백을 잘 이용하여 최대한 보기 쉽게 해야 하죠.
주석문이 필요한 이유가 프로그램을 읽기 쉽게 해서 오류를 찾거나 수정을 하는 일이 쉬워지게
하기 위해서 인데, 주석문을 보기 어렵게 쓰면 않되겠죠?
예를 들어 봅시다.
위에 나왔던 소스와 다음 소스를 비교해 보세요.
/* 파일 이름 : C1-4.C 프로그램 내용 : 주석문을 설명하기 위한 프로그램. */ void main() { int a, b, c; /* 정수 변수 a, b, c를 선언 */ a=10; /* a에 10을 넣는다. */ b=20; /* b에 20을 넣는다. */ c=a+b; /* c에 a와 b를 더하여 넣는다. */ }
C1-4.C는 주석때문에 보기가 더 힘들어 졌죠?
주석문을 이렇게 써서는 절데로 않됩니다.
이것으로 이번 강좌는 마치도록 하겠습니다.
이번 강좌에는 별 이상한 예기들만 많이 한것 같군요.
다음 강좌부터는 본격적인 C프로그래밍에 들어가도록 하죠.
'프로그래밍' 카테고리의 다른 글
6.c 언어강좌 (3) (0) | 2009.07.04 |
---|---|
5.c 언어강좌 (2) (1) | 2009.07.03 |
3.게임프로그래머 요구조건 (0) | 2009.07.03 |
2.게임프로그래머 역활 (0) | 2009.07.03 |
1.게임프로그래머 지식 (0) | 2009.07.03 |