Chapter 1 C언어의 세계로

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-01/Chapter-01-C-%EC%96%B8%EC%96%B4%EC%9D%98-%EC%84%B8%EA%B3%84.gif

컴파일러

파일러, 영어로는 Compiler라고 한다.

말그대로 컴파일(Compiler)

해주는 것(-r) 그렇다면 컴파일은 무엇일까?

아마 컴퓨터 는 0과 1 밖에 없다라고

들었을 것이다 맞다. そうだ。

컴퓨터 의 두뇌라고 할 수 있는 CPU 에서는

수 많은 0 과 1들이

이리저리 돌아다니고 있을 것이다.

만약 이런 컴퓨터에 명령을

내리려면 오직 0 과 1로만

써야겠지 010101010111 이런식으로···。

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-01/image.png

C언어는 노력으로 배우 거나 충당 가능하지만,

이건 아마 천문학적인 노력이 필요 할것 으로 보인다.

아마 옛날에는 실제로 전선을 이리저리

연결해가면 비슷한 방식으로

명령을 내렸을 것으로 추정이 된다.

만약 우리가 프로그래밍을 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’ 앞에 없습니다
or
컴파일 오류
error C2001: 상수에 줄 바꿈 문자가 있습니다.

error C2143: 구문오류: ‘)’이(가) ‘return’ 앞에 없습니다.

 

오류를 보게 되는 사람들이 존재한다.

첫 번째의 경우 printf(“Hello, World\n)

다음에 세미 클론(;)

을 쓰지 않아서 나타나는 경우이고,

두 번째 오류는 printf 안에

큰 따옴표로 제대로 닫지 않았을 경우이다.

어딘가에 오류가 발생하면 십중 팔구

위의 소스 코드를 잘못 작성했기때문에

다시한번 확인하고 작성해보자

이제, 드리어 이렇게 완성된 프로그램을

실행할 시간이 다가왔다.

ctrl + F5 를 눌려서 프로그램을 실행하보자

정리
  •  C언어는 (요새 나오는 언어들에 비해) 어려워 보일 수 있지만, C 언어를 배움으로써 얻을 수 있는 것들이 많을 것이다. 여러분 들은 좋은 선택을 한 것이다.
  • 컴퓨터는 0과 1밖에 모르기 때문에 컴퓨터에게 명령을 내리기 위해서는컴파일 이라는 과정을 통해서 사용자가 입력한 코드를 변환해야 한다. 이르 수행하는 프로그램을 컴파일러 라고 한다.
  • 비주얼 스튜디오르 설치하였고, 해당 IDE의 컴파일러로 코드를 컴파일 하였다.
  • 여러분 인생 첫 프로그램을 작성을 하였다

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 을 지워 보고

다시 프로그램을 실행해보자

아마 다음같은 결과가 나올 것이다.

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-01/imagex.png

이전 하고 차이점이 보이는가?

분명히 이전에는

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

와 같이 주석으로 감싸진 부분을 제외하고는

나머지 부분이 잘 출력되었음을 알 수 있다.

  정리

   • 항상 주석을 다는 습관을 기릅니다.

   • 주석을 잘 달지 않는다면 나중에 자기가 쓴 코드도 못알아보게 됩니다.

 

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/Art%20of%20Web%20Hacking/Chapter10/007.png