지난 시간에 이어 C언어를 이용한 간단한 프로그램 제작 쭉 이어 나가겠습니다.
그 전에 저번 시간에 배웠던것을 한번 떠올려 봅시다.
이전 시간에 C언어를 컴퓨터로 해석해주는 컴파일러인 '비주얼 스튜디오 시리즈'의 설치방법 에 대해 배웠습니다.
또한 C언어로 프로그램을 작성하기 위한 비주얼 스튜디오 2010 셋팅도 다 끝이 났습니다.
이제 우리는 C언어를 이용해 프로그램만 짜면 되는 것입니다.
가장 간단한 프로그램으로 C언어에서 빠질수 없는 '글자 화면 출력' 프로그램을 제작해보겠습니다.
이 후부터 C언어 간단강좌에서는 오로지 '비주얼 스튜디오 2010' 으로만 진행을 합니다.
그 외의 다른 버전으로 인한 호환성 문제, 프로그램 상호간 충돌문제에 관해서는 답변을 해드리기가
어렵습니다.
1. Hello, World! 프로그램 제작
우리는 가장 첫번째의 프로그램으로 ' Hello World!' 단어를 출력할 도스 프로그램을 제작합니다.
C언어를 배운다면 전통적으로 가장 처음으로 작성하는 프로그램이 되었습니다.
이유는 저도 잘 모르겠습니다 ^^;; 저도 대학교 들어와서 처음으로 출력했던것이
'Hello, World!' 였습니다. 처음에는 우와 신기하다고 했죠
단어를 출력할 도스프로그램을 제작한다니 감이 안잡히시나요? 바로 아래와 같이 만들 예정입니다.
이제 감이 잡히시나요?
자, 이제 한번 제작해보세요. 라고 하면 처음 C언어를 겪는분들은 엄청 당황할수 밖에 없겠죠?
그래서 일단 정답부터 공개하고 시작하겠습니다.
바로 위와 같이 코드를 작성하고 Ctrl + F5키를 누르게 되고 '이 프로젝트는 만료되었습니다' 라는 ㅁ 말을 상큼하게 무시하고 예를 눌러주면 도스창에 글자가 출력됩니다.
어떤가요? 원리가 이해가 되나요? 뭔가 알듯 하지만 살짝 아리송한가요?
그렇다면 저와 같이 저 소스 코드를 분석해보도록 합시다.
2. 'Hello, World!' 소스 코드 분석하기
가장 첫줄에 보이는
#include <stdio.h>
이 한 줄, 정말 중요합니다. C언어의 특징이기도 하며 절대 빼먹어서는 안되는 것인데
#으로 시작하는 문장, 이런것들을 ' 전처리기(preprocessor)' 라고 부릅니다.
간단하게 해석하면 미리 무언가를 처리한다는 것입니다.
#include 라는것은 include가 ~을 포함하다라는 뜻을 가지고 있으니
일단 어떤것을 포함하는것을 처리하라!! 라고 생각하시면 무방합니다.
그렇다면 위의 문장의 뜻은 무엇일까요?
해석하면 <stdio.h>를 먼저 포함시켜라
가 될것입니다.
여기서 stdio.h 같이 확장자가 .h로 이루어지는 파일을 헤더 파일(header file)이라 부릅니다.
헤더 파일은 컴파일러가 필요로 하는 정보를 가지고 있습니다.
그럼 왜 쓸데없이 stdio.h라는 헤더파일을 포함시키라고 하는 것일까요?
그것은 밑에 있는 printf 때문입니다.
여기서 좀 더 쉽게 알아가려면 함수(function)이라는 것을 알아야 합니다.
함수는 "특정한 작업을 수행하는 코드의 집합" 이라고 할수 있습니다.
우리는 지금 글자를 화면에 출력하는 프로그램을 제작합니다.
그럼 출력하는 작업을 수행하는 코드가 필요하겠죠?
그것을 바로 함수가 한다는 것입니다. 함수가 있어야 작업을 지시할수 있습니다.
int main(void) {
// 작업을 지시하는 문장
}
위의 문장은 실제로 main() 함수를 정의 하는 문장이 됩니다.
main()이라는 함수를 만들어 놓고 그 안에
출력의 기능을 수행하는 printf() 함수를 넣음으로써
main 함수는 출력의 기능을 수행하는 함수가 되었습니다.
이해가 좀 안되신다구요?
예를 들어 설명하겠습니다.
main() 이라는 빈 박스가 있다고 가정 합시다.
하지만 여기에 아무것도 들어있지 않기 때문에 그냥 빈 박스 일뿐입니다.
여기에 화장품을 넣으면 화장품 박스가 되는 것이고, 노트북을 넣으면 노트북 박스가 됩니다.
이렇듯 main() 함수에 아무것도 넣지 않으면 그냥 main 함수 그 자체 입니다.
그렇지만 그곳에 printf() 라는 출력을 수행하는 기능이 있는 함수를 넣었기 때문에 main 함수는 출력의 기능을 수행하는 함수가 되었습니다.
그럼 처음으로 돌아와서 왜 printf() 때문에 #include <stdio.h>를 써야 하는가 하면
stdio.h 라는 헤더파일 안에 printf() 함수가 쓰여져 있기 때문입니다.
사실 헤더파일 내에 들어있는 함수들 대부분을 우리는 '라이브러리 함수' 라고 부릅니다.
마치 도서관에서 필요한 책 꺼내서 읽듯이 헤더파일 내에 필요한 함수를 꺼내 쓰는겁니다.
단, printf() 라는 라이브러리 함수는 오로지 stdio.h 헤더파일에만 있기 때문에 stdio.h 헤더파일을
포함시켜주는 #include <stdio.h>를 써줘야 하는겁니다.
C언어는 결국 문법도 중요하지만 얼마나 많은 함수들을 알고 있으며, 또 함수를 써먹을줄 아느냐에 따라서 C언어의 실력이 결정나는것이라 생각합니다.
결국 이것도 언어입니다! 여러분은 언어 배울때 외우는것 하나 없이 언어 배우나요.
C언어도 조금씩의 암기는 필요합니다.
조금씩 헷갈리지 않습니까? 자꾸 보면서 반복학습 하는것 외에는 방법이 없습니다.
그럼 중간 체크를 좀 하겠습니다.
우리가 알게 된 것 까지 소스코드를 분석 하자면
stdio.h 라는 헤더파일을 포함시키기 위해 #include 전처리기를 씁니다. 왜??
바로 글자 출력을 담당해주는 printf() 라는 라이브러리 함수를 사용하기 위해서입니다.
printf() 함수에서 괄호 안에 쌍따옴표를 찍고 원하는 문장을 쓰면
printf 함수의 기능덕분에 그 문장을 그대로! 화면에 출력해줍니다.
출력은 프린터로 종이 뽑는것만이 출력이 아닙니다.
모니터에 글자를 띄우는것도 출력입니다.
이게 끝입니다.
뭔가 길게 쭉쭉 썼지만 요약하면 이게 다에요.
이제 우리에게 남은 것은
int main(void) {
}
이 부분과 return 0; 뿐입니다.
사실 main()이라는 함수는 C언어 내에서의 하나의 커다란 약속입니다. 마치 진리와 같은 것이죠.
main() 함수는 무조건 C 프로그램(프로젝트) 내에서 무조건 존재해야 하는데 단 한개만
있어야 합니다.
그 이유는 main() 함수가 함수의 시작과 끝을 담당하기 때문입니다.
지금도 어려워 죽겠는데 갑자기 이게 왠 짖는 소리냐구요?
말 그대로입니다.
모든 명령의 처리는 main() 함수내에서 이루어지며, main() 함수에서 시작해서 끝이납니다.
그렇기 때문에 main() 함수는 C언어 프로그램에서 하나의 기준점입니다.
이게 없으면 C 프로그램이 완성이 안된거나 마찬가지입니다.
여기까지 main() 함수의 역할을 알아봤고 int main(void)를 분석해봅시다.
int는 반환 자료형 이라는 의미로 int는 '정수' 즉 소수가 아닌 정수 그거 입니다.
자료형의 종류에 대해서는 나중에 따로 또 올려놓겠습니다.
반환 한다는 말은 컴퓨터한테 반환한다는 의미가 됩니다.
컴퓨터한테 정수를 반환한다? 근데 왜 하필 숫자를 반환하죠? 이거에 대해서는
후에 설명할 return 0; 와 매우 관계가 깊습니다.
main는 함수의 이름입니다.
함수의 이름이기 때문에 정해진것 없이 여러분들이 자유롭게 함수의 이름을 지정하면 됩니다.
예를 들어 나는 함수를 새로 만들것인데 그것이 두수를 저장하는 그런 함수가 될거다.
라고 가정하면 int add(void) 라고 써주셔도 되고 여튼 함수의 이름이란건 정해진 틀이 없이 자유롭게
지어주시되 몇가지 규칙만 지켜주시면 됩니다.
1. 함수의 첫글자가 숫자나 특수문자로 시작되면 안됨
2. 띄어쓰기 허가 안됨
3. 특수문자는 언더바 ( _ ) 만 허용된다.
더 예를 들어
2ad 안됩니다. add and sub 이건 띄어쓰기 있으니 안됩니다. ad&d 특수문자 안됩니다.
그렇지만 ad_d 이건 허가가 됩니다. 특수문자는 언더바만 허용되기 때문입니다.
(void)는 입력 타입입니다.
void 의 영어 뜻 자체가 비어있다. 라는 뜻이 됩니다. 그러니 입력을 아무것도 안받겠다 라는 의미 가 되겠습니다.
int main(void)는 아무것도 입력을 받지 않고 출력은 정수로 하겠다. 라는 의미입니다.
그렇다면 입력을 받는다는건 어떤것일까요?
지금부터 그걸 알기에는 너무 복잡합니다. 나중을 기약하고 다음으로 넘어가겠습니다.
자 이쯤 되면 int main(void)의 해석은 거의 끝이났습니다.
그럼 마지막으로 return 0;만 해석하면 됩니다.
return 0 .... 0을 돌려줘라 이뜻이죠?
아까전에 int 설명할때 누구한테 반환한다고 했나요? 컴퓨터한테 반환한다고 했죠?
마찬가지로 0이라는 숫자를 컴퓨터한테 돌려줍니다. 이건 뭘 의미하는 걸까요?
0이라는 의미 자체가 컴퓨터, 여기서는 프로그램을 실행시켜주는 윈도우 같은 존재를
말할겁니다.
어쨌든 윈도우에게 프로그램이 정상적으로 종료했다! 라고 알리는 겁니다.
한마디로 윈도우와 프로그램만의 신호이죠.
이렇게
#include <stdio.h>
int main(void) { printf("Hello World!"); return 0; }
의 해석은 모두 끝이납니다.
간단하게 정리하면
출력을 담당하는 printf 함수를 써야 하는데 그 함수는 stdio.h 헤더파일에 있으니 include 라는 전처리기 명령어를 통해 헤더파일 불러와라.
그 다음 우리는 컴퓨터한테 정상적으로 종료했다는것을 알려줘야 하니 0을 줘야 한다.
0은 정수이기 때문에 함수는 int(정수)형이다.
라고 원리가 돌아가게 됩니다.
이것을 완전히 이해하셨다면 C언어를 익히는데 별다른 어려움이 없을 겁니다.
이해를 못하셨다면... 계속 해서 읽어보시고 그래도 안되면 책 한권 참고 하시는것도 나쁘지 않습니다.
3. "Hello World!" 소스 코드 안에 숨겨진 규칙 찾기
C언어도 하나의 언어이기 때문에 문법같이 규칙이 존재합니다.
이것은 간단하게 정리만 하겠습니다.
1. #이 붙은 전처리기는 무조건 가장 첫줄에 시작
2. 문장이 하나 끝나면 반드시 뒤에 세미콜론 (;)을 필수적으로 붙여야 한다
3. main 함수 뒤에는 세미콜론을 붙이면 안된다. 전처리기도 붙이면 안된다.
4. 함수의 시작과 끝은 중괄호{} 로 알려야 한다.
이것이 규칙입니다.
이중에 가장 중요한것은 2번입니다.
2번은 무조건 필수입니다. 이것은 비단 C언어만이 아닌 JAVA,C#,C++ 등 프로그래밍 언어라면
거의 공통적으로 다 안고 가는 규칙입니다.
그럼 ;을 붙이지 않으면 어떤 문제가 발생할까요?
컴퓨터는 세미콜론을 붙이지 않으면
int main(void) { printf("hello,world!")return 0}
이렇게 보게 됩니다. 그래서 컴퓨터는 "응? 이게 무슨 말이야? 난 모르겠다. 오류 뿜는다!"
이렇게 되는 겁니다.
세미콜론은 문장이 끝이나면 다음줄로 넘길때 컴퓨터가 인식하게 해주는 코드 같은것입니다.
세미콜론을 뒤에 붙여줘야
int main(void) {printf("hello,world!") return 0 }
라고 이해를 합니다. 이제서야 " 아... 헬로 월드 출력하고 종료 잘했다고 알리라는군..."
하고 인식하는 겁니다.
컴퓨터는 생각보다 굉장히 멍청한 도구 입니다. 컴퓨터는 만능이 아니기 때문에
인간이 명령을 내릴때도 융통성 하나 없게 일일이 밥숟가락 떠서 먹여주다시피 다 해줘야 합니다.
그러니 이런 사소한 규칙 꼭 기억하시기 바랍니다.
여기 까지 해서 Hello world! 출력하기 편을 모두 마쳐봤습니다.
솔직히 지금 hello world 안에서 설명 못한 c언어만의 문법이라든가 규칙이 너무너무 많아서
아쉬울 따름입니다.
하지만 그것을 다 설명하게 되면 글도 너무 길어져서 가독성도 딸리고 지루할뿐 아니라
복잡해지기만 합니다. 마치 레벨 5인데 준보스 만난 느낌?
아직 설명할건 많습니다. 앞으로 천천히 이해하기 쉽도록 설명하기 위해 노력하겠습니다.
제 성의없는 강좌 봐주셔서 감사합니다. |
'Programming Languages > C' 카테고리의 다른 글
06. [C언어] 변수와 자료형 - 1 (0) | 2017.01.11 |
---|---|
05. [C언어] 입력 기능을 이용한 입출력 프로그램 제작하기 (0) | 2017.01.11 |
04. [C언어] 변수를 지정하여 연산을 이용한 프로그램 제작하기 (0) | 2017.01.11 |
02. C언어를 이용하여 프로그램을 제작해 보자 - 1 (0) | 2014.01.20 |
01. C언어의 개론 (0) | 2014.01.17 |