
컴파일러
컴파일러, 영어로는 Compiler라고 한다.
말그대로 컴파일(Compiler)
해주는 것(-r) 그렇다면 컴파일은 무엇일까?
아마 컴퓨터 는 0과 1 밖에 없다라고
들었을 것이다 맞다. そうだ。
컴퓨터 의 두뇌라고 할 수 있는 CPU 에서는
수 많은 0 과 1들이
이리저리 돌아다니고 있을 것이다.
만약 이런 컴퓨터에 명령을
내리려면 오직 0 과 1로만
써야겠지 010101010111 이런식으로···。
이건 아마 천문학적인 노력이 필요 할것 으로 보인다.
아마 옛날에는 실제로 전선을 이리저리
연결해가면 비슷한 방식으로
명령을 내렸을 것으로 추정이 된다.
만약 우리가 프로그래밍을 0과 1로 만
한다면 혼돈의 카오스가 펼쳐질것이다.
훌륭한 과학자들 덕분에, 0과 1대신에,
그나마 사람이 사용할 수 있는 ‘언어’
로 프로그래밍 을 할 수 있다,
수 많은 과학자 들 노고에 매우 감사합니다.
다시 본론으로 돌아와서 예를 들어서 1 + 1
을 하기 위한 명령을 컴퓨터에 내린다면
01011101010101
이 되겠지만 컴퓨터 언어를 통해 간단하게
1 + 1
이렇게 표현할 수가 있을 것이다.
여기서 문제는 컴퓨터가
인간의 언어를 도무지
알아 들을 수 가 없으니,
컴퓨터가 이해할 수 있는
0..1 들로 바꿔주는 존재가
필요한데 바로 이것이 컴파일러 이다.
C언어 본격 시작해보기(?)
드리어 첫번째 프로그램을 만들어보자
에디터 화면에다 아래와 같이 입력해보자
#include <stdio.h>
int main() {
printf("Hello, World\n");
return 0;
}
한가지 알아야 할 점은,
반드시 손으로 작성해보기를 바란다.
물론 ctrl + c, Ctrl + v
하는 방법이 있기는 하지만
시간은 절약이 가능하지만
결국 머리에는 남는 것이 없게 된다.
이제, 작성이 끝났으면 컴파일을 해보자
[Running] cd "d:\FFF■■_f■■■\■■■■■■■■■■■\■\" && gcc test.c -o test && "d:\FFF■■_f■■■\■■■■■■■■■■■\■\"test
Hello, World
[Done] exited with code=0 in 2.534 seconds
성공적으로 컴파일이 되었다.
그런데, 간혹 가다 어떤 사람들은
오류가 뜨는 사람들도 있는데, 대표적으로
컴파일 오류 |
error C21143: 구문 오류: ‘;’이(가) ‘return’ 앞에 없습니다 |
컴파일 오류 |
error C2001: 상수에 줄 바꿈 문자가 있습니다.
error C2143: 구문오류: ‘)’이(가) ‘return’ 앞에 없습니다.
|
오류를 보게 되는 사람들이 존재한다.
첫 번째의 경우 printf(“Hello, World\n“)
다음에 세미 클론(;)
을 쓰지 않아서 나타나는 경우이고,
두 번째 오류는 printf 안에
큰 따옴표로 제대로 닫지 않았을 경우이다.
어딘가에 오류가 발생하면 십중 팔구
위의 소스 코드를 잘못 작성했기때문에
다시한번 확인하고 작성해보자
이제, 드리어 이렇게 완성된 프로그램을
실행할 시간이 다가왔다.
ctrl + F5 를 눌려서 프로그램을 실행하보자
정리 |
|
Hello, World 프로그램 분석하기
이제 작성한 코드가 어떤 의미를
가졌는지 살펴보도록 하자
#include <stdio.h>
int main() {
printf("Hello, World\n");
return 0;
}
#include <stdio.h>
영어를 전문적으로 한 문과(?) 분들은 대충
include 의 뜻이 ‘포함하다’ 라는 것임을
직감적으로 알 수 있을 것이다.
그렇다면 위 프로그램은 무엇을
포함하고자 하는 것일까?
바로 옆의 stdio.h 라는 파일을
포함하고자 하는 것이다.
우리는 왜, stdio.h라는 파일을 이
프로그램에 포함 시켰을까?
그이유는 아래에서 설명한다.
그 다음 부분을 살펴 보자.
int main()
이번에는 조금 생소한 단어이다.
main은 그렇다 쳐도 int 는 또 뭘까? RPG 게임을
많이 접한 분들은 지능을 뜻하는
intelligenced 의 약자라고 생각할 수도 있지만,
사실 이는 정수 를 뜻하는 integer의 약자라고 한다.
또한 그 옆의 main 은 함수를 말하는것
사실 이 문장의 뜻은 ‘정수 형을
반환하는 메인 함수’ 라는 뜻이며, 모든
C프로그램은 이 main 에서 부터 시작된다.
자세한 사설은 나중에 알아보도록하자.
{
그 다음 문장은 참으로 간단하다.
중괄호 이다. 여기서 중괄호는 main 함수의 시작을
알리게된다. 즉, 중괄호로 묶인 부분은
‘여기는 main 함수 꺼야’하는 것을 나타낸다.
C 언어에서는 main 함수 뿐만이
아니라 어떤 문장도 여는 중괄호가 있다면 반드시
이에 대응되는 닫는 중괄호(})가 와야 합니다.
여기서도 마찬가지로,
마지막 문장에서 닫는 중괄호 가 와있다.
printf("Hello, World\n");
이제, 위 프로그램에서 가장 핵심이라
볼 수 있는 부분인 printf를 살펴 보자.
printf는 화면에 괄호안의 내용을 출력
할 수 있게 해주는 일종의 함수 이다.
위의 경우 괄호 안에 있는 Hello, World!
가 화면에 출력되었습니다.
그런데, 도대체 위 함수가 어떻게 해서
화면에 글자를 추력하는 것일까?
사실, 화면에 글자를 출력하는 것은
쉬운일 일 것 같지만, 매우 복잡한 과정
을 거치는 것이다. 왜냐하면 일단 운영체제에
자신이 화면에 글자를 뿌려야
한다는 메시지를 보내야 하고, 또
운영체제는 하드웨어 (모니터) 에 이를 뿌린다는
(출력하는) 것을 이야기 해 주어야 하기 떄문이다.
하지만 우리가 위 짧은 문장을 화면에
표현하기 위해 위 모든 내용을
작성해야 한다는 것은 것은 상당히
불합리해 보인다. 따라서 우리는 위
모든 내용을 포함하고 있는 파일을
필요로 하는데, 그 것이 바로 앞서 이야기한
stdio.h입니다. (Studio 가 아니다!)
stdio는 STandard Input Output header 의
약자로, 표준 입출력 해더 이다.
이 파일에는 입출력, 즉 화면에 출력하고,
키보드로 부터 입력을 받아들이는 것을
담당하고 있다. 물론, 이 파일 하나에
모든 내용이 다 구현 되어 있는 것은 아니다.
세부적인 내용은 나중에 배우게 될 것
그러나 한가지 이상한 점은 큰 따옴표
안의 내용이 모두 출력되는데, 왜 마지막의
\n 은 출력되지 않은 것일까? 그렇다면
한 번 여러분들 께서 \n 을 지워 보고
다시 프로그램을 실행해보자
아마 다음같은 결과가 나올 것이다.

이전 하고 차이점이 보이는가?
분명히 이전에는
Press anykey to continue 가
한 줄 개행되어 나타났는데
이번에는 연이어 나타났다.
(윈도우 한글판 사용자의 경우 )
(‘아무키나 누르세요’가 나올 것이다)
そうだ, 알았다. 바로 \n은
키보드 상의 엔터, 즉 개행 문자 였던 것
(참고로 \를Escape character 라고합니다)
참고적으로 알아야 할 사실은
한국 키보드의 경우 \로 나타나지만
외국 대부분의 키보드에서는 \
대신에 역슬래시(\)를 사용합니다. 따라서,
보통 C언어 서적을 보면 \n 이라
나타난 것이 있는데 이는 \n 과
똑같은 것이다.
마지막으로 중요한 점은,
모든 문장이 끝나는
부분에 세미콜론(;)을
찍어 주어야 된다는 것
물론, 함수의 선언 부분(즉, int main())
뒤에나 헤더파일 선언 부분
(#include <stdio.h>)
뒤에는 ; 을 붙이면 안되지만,
위와 같이 printf(·····) 나, 아래 줄의
return 0 와 같은 문장들에게는
꼭 끝에 세미콜론을 붙여아한다.
만약 붙이지 않는다면 이전 에는
보았던 오류들이 나오게 된다.
return 0;
영어로 읽어 보면 대충 뜻을 짐작하셨지만,
0 을 반환(return)한다는 뜻 이다.
0을 왜 반환 할까? 그리고 그 것을
반환한다면 ‘누구’ 한테 반환하는 것인가?
쉽게 말해 운영체제에게로 반환합니다.
(정확히 말하면 이 프로그램을 호출한 프로그램)
그런데 왜 하필이면 0일까?
1이면 안되고 왜 2 이면 안될까?
사실은 0을 반환한다는 것은 컴
퓨터에게 프로그램이 무사히 종료되었음 을
알리는 것, 반면에 1을 반환한다면
컴퓨터에게 프로그램이 무사히 종료되지 않았다
오류가 발생했다. 를 알리는 것
}
마지막으로 이렇게 꼭 중괄호로 닫아주어야지,
그렇지 않을 경우 파일의 끝이
없다는 오류가 발생하게 된다.
와우! 이쯤 되면 위 프로그램을 빠삭하게 분석
해 보았다고 할 수 있다.
주석(Comment)넣기
마지막으로 모든 프로그래밍 언어에 기본으로 있는 기능이자,
그 만큼 중요한 기능인 주석 넣기에 대해 알아보자.
주석이라 하면, 코멘트, 즉 자신의 코드에
대해 설명을 해주는 것이다.
아마 위의 대여섯 줄 짜리 코드에
뭐가 설명할 필요가 있겠어? 라고
생각할 수 있지만, 실제로 ‘쓸만한’
프로그램을 만들게 되면 코드의 길이가
수천줄을 넘어가는 것은 예삿일이 된다.
물론 그런 파일들이 여러개 모여서
프로그램을 만들게 되는 것이다
그렇게 된다면 코멘트 없이는
이 코드가 도대체 무슨 역할을 하는지도 잘 모르고,
남이 쓴 코드가 어떤일을 하고, 어떻게 돌아가는지
이해가 잘 안되는 경우가 많다.
더욱 심각한 사실은 자신이 쓴 코드가
무슨 역할을 하고 어떻게 동작되는지 이처럼,
이런 기분 나쁜 일 을 미연 에 방지 하기위해
이 코드가 무슨 역할을 하고 어떻게
동작되는지 간단하게 나마 설명해
주는 것이 필요하지. 그런 것을바로 주석 이라 한다.
우리가 코드를 이해하기 위해 필요한 것이지,
컴퓨터에는 아무런 도움이 되지
않는 것이므로 컴파일러는 이 주석을
완전히 무시해 버립니다.
마치 우리만이 볼 수 있는 것 처럼,
그렇기 떄문에 주석에 무슨 짓을해도
전혀 상관이 없다.
기본적으로 C 언어 에서는
두 가지 형태의 주석을 지원한다
/**
* 이렇게
* 여러 줄을
* 걸처서 직성이
* 가능한 주석과
*/
// 한 줄에서만 작성이 가능한 주석을 말한다.
마치 컴파일러가 철저히
무시 한다는 것을 반영하기라도
한 것인지. 주석은 초록색을 표시 됩니다.
보통 한 줄에 쓸 수 있는
주석은 //로 나타내고,
주석이 조금 이라도
길어지면 /*와 */를 이용합니다.
한 번, 위 Hello, World! 프로그램에 자기
나름대로 주석을 넣어 설명을 해보자
정리 |
• #include <stdio.h> 란 stdio.h라는 파일을 포함하라는 뜻입니다. • main 함수는 프로그램이 시작되는 함수 입니다. • printf는 화면에 내용을 출력해주는 함수 입니다. • //와 /* */는 주석으로 컴파일러가 무시하지만, 프로그램머를 위해 남겨 놓은 코멘트 입니다. |
주석(Comment)
우리가 프로그래밍을 하다 보면
소스 코드가 상당히 길어 지게 된다.
우리가 앞서 한 Hello, World!
출력 예제는 소스 코드가
겨우 몇 줄에 불과하였지만
실제론 소스 코드의 길이가 수천줄에서
수만 줄 가까지 된다. 예를 들어서
우리가 지금 사용하는 Windows XP의
소스 코드가 몇 줄 정도 될 지 추측해보자.
한, 십만줄? 50만줄? Nope. 정확한
자료는 아니지만
대략 4000만 줄 이상 된다고 한다.
이런 크기로 프로그램을 작성하다
보면 이 소스 코드가 무엇을 뜻하고
또 무슨 일을 하는지 동의 정보를
소스 코드 내에 나타내야 할 필요성
이 있게 됩니다. 즉, 컴파일러가
완전히 무시하고 오직
사람의 편의를 위해서만
존재하는 것이 바로 주석 입니다.
종종 지금 코드를 쓰고 있는 시점에서
내용을 잘 안다고 주석을 생략하는 경우
가 있습니다. 하지만 주석 없는
코드를 1 달 뒤에 다시 본다면
분명히 아니 이게 지금 뭐하는 코드지?
라고 생각하실 것입니다.
반면 주석이 잘 작성되어 있는 코드는
몇 년 뒤에서 다시 읽는다 해도
(주석을 잘 달아놨다는 가정 하에)
쉽게 이해할 수 있습니다.
C 언어에서 주석은
두가지 방법으로 넣을 수 있습니다.
/* 주석이 들어가는 부분 */
// 주석이 들어가는 부분
일단 전자의 경우 /* 와 */로 묶인
내부의 모든 내용들이
주석으로 처리된다. 즉,
/*
이 부분은 내가 아무리 작성을 해도 컴파일러가 무시
ᄆᄂᄋ러ᅡᄆ니ᅥᄅ먼리;ᅡᄂᄆ어림나러 무시
ᄆ아ᅥᄅ민럼ᄂᄅ ᄆᄂᄋ럼니러
ᄆᄂ라미너럼나러ᅵᄆ너라ᅵᅥᄋ
printf("Hello, World"); <- 이 것도 당연히 무시
*/
와 같이 난리를처도 /* 와 */
로 묶인 부분은 무시됩니다.
아래 예제를 보면
이해가 더욱 잘 될 것입니다.
#include <stdio.h>
int main() {
/*
printf("Hello, World!\n");
printf("Hi, Comuter \n");
*/
printf("Hi, Computer \n");
return 0;
}
위와 같은 소스코드를 컴파일 하였을 떄,
[실행 결과]
[Running] cd "d:\FFF■■_f■■■\■■■■■■■■■■■\■\" && gcc test.c -o test && "d:\FFF■■_f■■■\■■■■■■■■■■■\■\"test
Hi, Computer
[Done] exited with code=0 in 0.713 seconds
와 같이 Hi, Computer 을 출력하는
부분만 남을 것을 볼 수 있습니다.
이는 앞서 말했듯이 /* 와 */로 묶인
부분이 전부다 주석으로 처리되어서
컴파일러가 철저하게
무시하였기 때문 입니ㅏ다.
반면의 //형태의 주석의 경우 //가
쳐진 줄 만이 주석을 ㅗ처리가 됩다. 즉,
// Hello, World! 를 출력한다.
printf("Hello, World!");
로 하면 아래
printf 부분 잘 실행된다.
하지만
위 주석은 역시 무시된다.
아래 예제 를 보면 확실히 알 수 있다.
#include <stdio.h>
int main() {
// printf("Hello, World! \n");
printf("Hi, Human \n");
printf("Hi, Computer \n");
return 0;
}
성공적으로 컴파일 하였다면
[Running] cd "d:\FFF■■_f■■■\■■■■■■■■■■■\■\" && gcc test.c -o test && "d:\FFF■■_f■■■\■■■■■■■■■■■\■\"test
Hi, Human
Hi, Computer
[Done] exited with code=0 in 0.346 seconds
와 같이 주석으로 감싸진 부분을 제외하고는
나머지 부분이 잘 출력되었음을 알 수 있다.
정리 |
• 항상 주석을 다는 습관을 기릅니다. • 주석을 잘 달지 않는다면 나중에 자기가 쓴 코드도 못알아보게 됩니다. |