아래는 C를 처음 배울 때 자주 볼수 있는 기본 소스입니다. 아래의 소스로 C의 전처리기, 함수, 주석, 문법 등 C에 대한 기본적인 사항들을 알아보겠습니다.

#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello! World \n");
    return 0;
}


3.1 전처리기

가장 먼저 #include <stdio.h>가 보입니다. 여기서 include 앞의 #는 C에서 전처리기를 의미합니다. stdio는 standard input output의 약자로 C의 표준 입출력 함수들이 선언되어 있는 헤더 파일입니다.

1) 컴파일러의 처리

전처리란 컴파일러가 작업을 하기 편리하도록 컴파일 전에 미리 처리되는 작업을 의미합니다. 이전에 본바와 같이 컴파일 작업이은 개발자가 작성한 소스를 읽어 가며(이 작업을 파싱이라고 합니다), 기계가 읽을 수록 번역하는 작업을 의미합니다.

이 작업을 쉽게 하기위해 컴파일러가 미리 처리 해야 할 작업들이 전처리 작업이며, 이를 구별하기 위해 "#" 를 앞에 둡니다.

C에는 #if/#endif, #line, #pragma 등 많은 전처리기가 있습니다. 나머지는 나중에 따로 자세히 알아보고, 여기서는 가장 많이 쓰이는 #include, #define만 알아보겠습니다.

#define MY_A    3
int a = MY_A;

위와 같은 a.h파일이 있다고 가정합니다.

#include "a.h"

void printA()
{
    printf("a=%d", a);
}

위와 같이 a.c 파일이 있으면 컴파일러는 컴파일전에 include란 전처리 명령을 보고, 아래와 같이 만든 후에 컴파일을 시작합니다.

int a= 3;

void printA()
{
    printf("a=%d", a);
}

컴파일러는 #include <stdio.h>를 확인하고, a.h파일을 읽어 위와 같이 만듭니다. 그 다음  또 하나의 전처리기 #define을 처리합니다. MY_A로 되어 있는 모든 곳을 3으로 변경합니다.


2) include

소스파일에서 공통으로 참고해야 될 부분을 따로 헤더 파일로 만듭니다. 보통 여러 소스파일에서 참조 될 define, 데이터 타입, 변수, 함수 프로토 타입 등을 정의해 놓습니다.

컴파일러는 소스에서 함수호출이나 변수 사용시, 반드시 그 함수의 프로토 타입이나 변수의 형(type)을 알고 있어야 합니다. 그래서 각 소스 파일(*.c, *.h)들은 사용하는 함수나 변수가 정의되어 있는 헤더 파일(*.h)을 include하여 사용합니다.

include는 <>와 ()로 사용될 수 있습니다. 일반적으로 C 표준 라이브러리 헤더 파일엔 "<>", 사용자 정의 헤더 파일에는 "()"를 사용합니다. 예를 들면 아래와 같습니다.

#include <stdio.h>
#include "my.h"

define은 아래와 같이 A를  "A"로 컴파일 시, 대치하란 의미입니다.
#define A      "A"

define에 많은 설명이 필요하므로, 다음에 자세히 사용법에 대해서 알아보겠습니다.


3.2 함수
C 소스를 보면 대부분이 함수로 이루어져 있을 만큼, 함수는 C뿐만 아니라 많은 언어에서 중요한 부분입니다. 함수는 같은 혹은 다른 소스 파일 뿐만 아니라, 경우에 따라서는 다른 실행파일에서도 호출될 수 있습니다.

C에서 함수는 아래와 같은 구조를 가지고 있습니다.

[반환값 타입] [함수명] ([인자], ...)
{
    [몸통]
}

이제 함수의 각 구성요소에 대해서 자세히 알아보겠습니다.

1) 반환값 타입

반환값 타입은 함수가 종료될 때, 함수를 호출한 곳으로 돌려주는 값의 형(type)을 의미합니다. 반환값은 return 이란 예약어로 반환값 타입과 같은 형의 데이터를 반환합니다.

어떤 함수가 값을 반환 할 필요가 없을 때는 void로 선언합니다.
void my_func();

만약 반환값이 생략되어 my_func()와 같이 함수 이름이 먼저 나오면, 컴파일러는 int형을 반환하는 것으로 간주합니다.

위의 main은 int형을 반환합니다. main은 일반적으로 아무 오류없이 끝났다는 0을 반환합니다.


2) 함수명

위의 소스에서 #include 아래에 main 함수가 있습니다. main은 C에서 미리 정의된 함수로 프로그램의 시작 지점이라고 할 수 있습니다.

함수명은 함수가 행동하는 동작에 맞고, 누구나 쉽게 유추해 볼 수 있도록 작성되어야 합니다. 함수나 변수의 이름을 붙이는 공통된 방법을 명명법이라고 하는데, 이는 프로그램 작성 시 중요합니다.


3) 인자

함수 이름 다음에는 괄호안의 목록들을 함수의 인자라고 부릅니다. 이 인자는 함수를 호출 하는 곳에서 보내 주는 데이터입니다. 인자는  앞에 타입이 오고 바로 뒤에 사용 할 인자명이 옵니다. 인자가 여러개일 경우에는 ","로 구별합니다.

값을 받을 필요가 없을 시에는 void my_func()와 같이 괄호 내를 빈 상태로 둡니다. 

int main(int argc, char* argv[])

위의 main을 보면 인자는 int형의 argc와 char 배열의 포인터 형 인자인 argv를 받습니다. 위에서도 언급한 바와 같이 main은 사용자가 호출하는 것이 아니라, 프로그램 시작시 자동으로 호출됩니다.

우선 첫번째 int형 변수 argc는 뒤에 나오는 argv의 갯수를 넘겨 줍니다. 두번째 나오는 argv는 프로그램 실행 시 넘겨지는 인자에 대한 정보를 가지고 있습니다. OS에 따라서 기본적으로 넘어오는 갯수가 1~2개로 조금씩 다를 수 있습니다.

일반적으로 argv의 첫번째에는 실행파일명이 들어 있습니다. 그 뒤로는 실행파일 실행 시 사용자가 넘겨주는 인자들이 들어 있습니다.

예를 들어 아래와 같은 코드가 있습니다. (아래 소스의 내용은 이해를 못하셔도 됩니다.)

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i;

    for(i = 0; i < argc; i++)
    {
        printf("ARGV[%d] %s\n", i, argv[i]);
    }

    return 0;
}

이 함수를 컴파일 하고, 실행파일 명이 a.out이라고 가정합니다. 프롬프트 상태에서 실행시키면 아래와 같이 출력합니다.
./a.out
ARGV[0] ./a.out
기본적으로 argc는 1이고 argv 첫번째에는 실행파일 명이 넘어 왔습니다.

이번에는 아래와 같이 a.out을 실행시킵니다.
./a.out abc def ghi
ARGV[0] ./a.out
ARGV[1] abc
ARGV[2] def
ARGV[3] ghi
실행파일명 다음에는 사용자가 입력한 인자들이 넘어 옵니다.

이와같이 main 함수의 첫번째, 두번째 인자(argc, argv)로 사용자가 실행 시 넘기는 인자를 알수가 있고, 인자를 받아 특별히 처리해야 할 경우에 사용하면 됩니다.

참고로 아래와 같이 함수의 인자를 선언할 수 있지만, 이와 같은 함수 표기법은 사용하지 않는 것이 좋습니다.
int main(argc, argv)
int argc;
char* argv[];
{
    printf("Hello!, World\n");
    return 0;
}


4) 몸통(body)

함수 명 뒤에 "{" 로 시작해서  "}"로 끝나는 부분을 함수의 몸통이라고 합니다. 여기서 함수가 수행해야 될 내용들을 작성하면 됩니다.

함수 내부는 "들여쓰기"라고 불리는 방법으로 의미와 범위에 맞게 Tab 키를 사용하여 단락들을 들여 써주면 가독성이 더욱 좋습니다.

아래는 두 개의 정수를 받아 앞에 수가 크면 1, 뒤에 수가 크면 2, 같으면 0을 반환하는 함수입니다. 이해는 할 필요가 없고 전체적인 모양만 보시면 됩니다. 왼쪽은 Tab을 이용하여 들여쓰기를 한 경우고 아래는 하지 않은 경우입니다. 내용을 모르더라도 왼쪽의 경우가 눈에 더 쉽게 들어 옵니다.
사용자 삽입 이미지 사용자 삽입 이미지

위를 보면 마지막에 세미콜론(;)의 모습이 자주 보입니다. C 변수나 함수 선언이 끝나거나, 단락이 끝나면  ";"를 사용합니다. 흔히 세미콜론으로 막는다. 라는 표현을 씁니다.

C 컴파일러는 코드상의 공백, 탭, 개행문자(엔터)를 무시합니다. 아래의 네 가지 코드 모두 컴파일러는 동일하게 봅니다. 하지만 사람이 볼 때 쉽게 볼 수 있도록 코딩을 해야 하며, 그런 의미에서 3번과 4번이 무난해 보입니다.

for(i = 0;i<3; ++){printf("%d", i);}

for(i = 0; i < 3; i++) { printf("%d", i); }

for(i = 0; i < 3; i++) {
    printf("%d", i);
}


for(i = 0; i < 3; i++)
{
   printf("%d", i);
}


3.3 주석

주석은 프로그램시 참고해야 될 내용이나 중요한 사항이 있을 경우 개발자가 기록하는 내용으로, 컴파일 및 프로그램 수행에는 전혀 영향을 미치지 않습니다.

C에서 주석을 사용할 경우에는 "/*" 와 "*/"의 사이에 위치 하며, 아래와 같이 사용합니다.
/* 주석입니다. */

아래와 같이 주석내에 주석은 사용할 수 없습니다.
/*
/*
이 부분은 오류가 납니다.
*/
*/

1) 주석의 사용

사용자 삽입 이미지

주석은 위와 같이 자유롭게 사용할 수 있습니다. 소스파일, 함수, 변수에 대한 설명, 주의 사항, 파일 수정 히스토리, 저작권 등 필요에 따라 소스에 추가 할 수 있습니다.

주석을 사용하는 이유는 먼 훗날 다시 소스를 봐야할 경우나, 본인 이외에 다른 개발자가 소스를 손대야 할 경우에 소스 이해에 많은 도움을 줄 수 있습니다.

주석은 타이핑을 해야하는 약간의 노력이 필요하지만, 소스를 볼 때의 편리성에 비하면 작은 노력으로 큰  것을 얻습니다. 필요한 곳에 항상 주석을 붙이는 습관을 들이시기 바랍니다.


2) 코드에 사용

주석은 설명 외에 코드 사이에 주석 처리를 하여 테스트 및 디버깅 시에도 사용할 수 있습니다. 아래는 테스트시 필요에 의해 무조건 1을 반환해야 하는 상황이라 가정하고, 원 코드를 주석처리 해 놓았습니다. 테스트가 끝나면 주석을 제거하고 밑에 라인을 삭제합니다.

int plusNumber(int a, int b)
{
    / *return (a + b); */
    return 1;
}



3) 단일 라인 주석

C++에는 한 줄 주석을 달 수있는 "//"가 추가 되었습니다. 하지만 그 사용의 편리함으로 인해 대부분의 C 컴파일러가 "//" 주석을 지원합니다. 순수 C코드라면 호환성을 위해서 사용하지 않는 것이 좋으나, 필요하거나 편하면 사용해도 무방할 것 같습니다.

"//" 주석은 이름 그대로 "//" 뒤부터 한 라인만 주석처리 됩니다. 간단한 주석이 필요할 때 사용하시면 됩니다.

// a와 b를 더한 값을 반환
int plusNumber(int a, int b)
{
    / *return (a + b); */
    return 1;  // 임시로 테스트
}

'프로그래밍 강좌 > C 언어 기초' 카테고리의 다른 글

6. 제어문  (0) 2007.06.14
5. 연산자  (0) 2007.06.13
4. 변수  (2) 2007.06.12
2. 소스코드, 컴파일, 링크  (6) 2007.06.04
1. C언어 공부를 위한 준비  (9) 2007.06.03
AND

이번에는 C언어를 이용하여 실행할 수 있는 파일을 만드는 관정에 대해서 알아보겠습니다. 일반적으로 아래와 같은 과정으로 작성한 소스 파일이 실행파일로 만들어집니다.
사용자 삽입 이미지
지금부터 위의 내용에 대하여 알아 보겠습니다.


2.1 소스코드 작성

1) 소스 코드?

코드는 프로그래밍 언어에 따라 작성된 내용을 의미합니다. 일반적으로 많이 사용되는 코딩이란 말은 코드를 작성하는 작업을 말하며, 에디터에서 소스 파일을 작성하는 것을 의미합니다.

소스란 재료라는 본래 의미와 마찬가지로 컴파일을 하여 실행파일을 만들어 내기 위해 필요한 소스(재료)란 의미입니다. 최종 목적 파일을 만들기 위해 필요한 모든 파일들을 소스파일이라 하고, 일반적인 소스 파일은 C 코드가 들어 있는 파일을 의미합니다.

C에서 헤더파일은 *.h, 소스파일 *.c의 확장자를 갖습니다.


2) 통합 개발 툴

많은 개발툴들이 IDE(Integrated Development Environment)라고 불리우는 통합 개발 환경을 제공합니다. 이는 컴파일러, 링커, 에디터, 디버그, UI 에디터, 메뉴얼 등 개발에 필요한 도구들을 모아 놓은 개발툴입니다. 맥에서는 Xcode, 윈도우에서는 VisualStudio 등이 있습니다.

사용자 삽입 이미지
일반적으로는 개별 텍스트 에디터를 사용하는것 보다, IDE에서 제공하는 에디터를 사용하는 것이 가장 편리합니다.

좌측 이미지는 맥의 대표적인 개발환경인 Xcode의 모습이며, 개발에 편리를 주는 많은 기능을 내장하고 있습니다.




3) 디버깅

디버깅이란 프로그램 실행 시 나오는 각종 오류들을 제거하는 작업을 의미합니다. 이를 위해 많은 개발환경에서 디버거란 디버깅을 도와주는 편리한 툴들을 제공합니다.

아래는 Xcode에서 디버거를 실행중인 모습니다.  코드를 한 줄씩 또는 브레이크 포인트라고 불리우는 위치까지 실행시켜 가면서 각종 변수 값들과 메모리를 등을 확인할 수 있습니다.
사용자 삽입 이미지

사용하는 툴의 디버거 사용방법을 반드시 알아두어야, 원인을 찾기 어려운 오류를 추적하고 제거하는 시간을 단축할 수 있습니다.


2.2 컴파일
컴파일이란 작성한 소스파일을 이진파일로 바꾸어 주는 작업을 의미합니다. 쉽게 이야기 하면 사람이 작성하고 편집할 수 있는 소스 파일을 컴퓨터가 이해할 수 있도록 바꾸어 주는 작업을 말합니다.

1) 목적파일

C 컴파일러는 *.c 소스 코드를 컴파일 하여, 목적파일(object file)이라 불리우는 *.o, *.obj 등의 컴파일된 파일을 생성합니다. 이 파일들은 바로 실행을 할 수 없지만, 컴파일 다음 작업인 링크에 사용되어 실행 파일을 만듭니다.

아래 좌측은 소스 파일이며, 사람이 이해가 가능합니다. 우측은 컴파일한 목적파일로 짐작이 가는 문자들이 있지만 사람이 이해할 수 없습니다. 반대로 기계는 우측의 목적파일이 이해(처리)하기 쉽습니다.
사용자 삽입 이미지 사용자 삽입 이미지


2) 디버그 모드와 릴리즈 모드

사용자 삽입 이미지
대부분의 IDE들은 빌드 시 디버그 모드와 릴리즈 모드를 선택할 수 있습니다.

디버그 모드는 개발에 편리를 주기 위해서 많은 디버깅에 편리한 코드들이 들어갑니다. 그렇기 때문에 릴리즈 모드에 비해 실행파일도 크고 속도도 느리지만,  디버깅 작업을 하기에는 편합니다.

릴리즈 모드는 디버깅에 필요한 모듈을 제외되고 컴파일되기 때문에, 디버깅 모드에 비해서 실행파일 크기가 작고 속도가 빠릅니다.

개발시에는 편리를 위해 디버깅 모드로 작업을 하고, 최종 배포시에는 릴리즈 모드로 컴파일 하여 배포 합니다.


3) 오류(error)와 경고(warning)

컴파일을 하다 보면 오타와 잘못된 문법으로 인해 오류와 경고를 만나게 됩니다. 오류는 잘못된 코딩으로 인해 컴파일을 할 수 없는 경우를 의미합니다. 경고는 컴파일은 되지만 문제가 일어날 소지가 있을 경우에 나오는 메시지입니다.

사용자 삽입 이미지
좌측을 보면 오류 하나와, 경고 하나가 나오고 컴파일이 중지 되었습니다.

printf 함수 뒤에 있는 C 문법에 어긋난 hi로 인해 오류가 났습니다. 경고는 int a;라고 변수를 선언은 해놓고 사용은 하지 않았다는 경고입니다.



컴파일을 하기 위해선 경고가 있어도 가능하기 때문에 처음 프로그래밍을 시작하는 분들은 경고를 무시하는 경우가 있는데, 경고도 무조건 제거하여야 합니다. 경고를 제거하는 것은 예기치 못한 동작에 대한 위험을 줄이고, 안쓰는 변수 제거 및 확인, 정확한 형 변환 등 올바른 코딩습관을 가지게 해줍니다.

2.3. 링크
실행파일을 만들기 위해서는 컴파일 뒤에 링크 라는 작업이 필요합니다. 링크는 컴파일된 목적파일과 필요한 라이브러리를 이용해, 해당 시스템에서 실행할 수 있는 파일을 만듭니다.

일반적으로 링크는 아래와 같은 작업을 수행합니다.
사용자 삽입 이미지


1) 라이브러리

이전 소스와 같이 printf를 사용하면, 이 함수는 어딘가 반드시 구현되어 있어야 합니다. printf는 C 표준 라이브러리에 포함되어 있으며, 실행파일에 이 라이브러리도 포함되어야 실행시 printf를  호출하여 사용할 수 있습니다.

라이브러리는 자주 사용되는 함수, 모듈들을 미리 컴파일 시켜 놓은 목적파일의 집합체로 생각하시면 됩니다. C 함수들은 C 표준 라이브러리에 들어 있습니다.

라이브러리는 사용자도 만들 수 있으며, 자주 사용되는 코드들을 용도 별로 모아 라이브러리를 구축해 놓으면 다음 개발 시에 관련 파일의 복사나 재 컴파일 등의 작업 없이 편리하게 사용할 수 있습니다.


2) 라이브러리의  종류

여기서 한가지를 보면 항상 라이브러리가 실행파일에 포함된다는 것 입니다. 이는 실행파일 크기가 증가 한다는 이야기이고, 프로그램 실행 시 메모리도 많이 사용하게 된다는 의미입니다.

실행파일에 포함되는 라이브러리를 정적(static) 라이브러리라고 합니다. 같은 정적 라이브러리를 사용하는 프로그램이 많을수록 하드웨어, 메모리 같은 시스템 낭비를 초래 합니다. 그래서 나온 것이 공유(shared), 런타임(runtime) 라이브러리를 사용하는 것 입니다.

여러 실행파일들은 라이브러리에 대한 정보만 가지고 있고, 한 라이브러리를 같이 사용하기 때문에 위의 하드웨어나 시스템자원 사용에 있어 이익을 가지고 옵니다. 아래의 그림을 보면 공유 라이브러리를 사용하는 것이 정적 라이브러리 사용에 있어서 파일용량이나 메모리를 절약할 수 있음을 보여 줍니다.
사용자 삽입 이미지


3) 오류(error)

컴파일과 마찬가지로 링크도 오류과 경고를 알려 줍니다. 오류가 발생하면 실행파일은 생성되지 않습니다. 컴파일과 마찬가지로 링크도 모든 오류과 경고를 확인하고 제거하여야 합니다.

일반적으로 링크 오류는 소스코드에서 사용한 변수나 함수들을 링크시에 다른 목적파일 또는 라이브러리에서 실제 구현된 변수나 함수를 찾을 수 없을 경우 발생합니다.

사용자 삽입 이미지
좌측은 컴파일까지는 성공하였으나 링크 시 오류가 발생한 경우 입니다.

extern이란 예약어로 컴파일러는 something이란 변수가 어디선가 선언되어 있다고 예측하고 컴파일을 완료 합니다.

링크 시에는 something이 선언되어 있는 곳을 찾을 수 없기 때문에 오류를 내고 링크를 중지합니다.

관련 목적파일, 라이브러리를 링크 옵션에 포함시켰는지, 선언은 되었는데 구현은 되지 않았는지, 이름과 타입이 동일하진 여부를 확인하셔야 됩니다. (선언과 구현은 나중에 설명하겠습니다.)
이상 프로그래밍과 관련된 몇가지 자주 쓰이는 용어들을 살펴 보았습니다.  다음 장 부터 본격적으로 C 언어에 대한 설명을 시작하겠습니다.


'프로그래밍 강좌 > C 언어 기초' 카테고리의 다른 글

6. 제어문  (0) 2007.06.14
5. 연산자  (0) 2007.06.13
4. 변수  (2) 2007.06.12
3. C 기초문법  (0) 2007.06.05
1. C언어 공부를 위한 준비  (9) 2007.06.03
AND

시작하면서...
처음엔 잘 모르시는 분들도 쉽게 따라 해 볼 수 있도록 튜토리얼을 만들어 볼려고 했습니다. 그런데  포스트를 계속 올리다 보니, C에 관해 질문해 오시는 분들도 많고 주위에서도 따라 해보기는 하는데 이해를 전혀 할 수 없다는 이야기를 들었습니다.

이런 이유로 프로그래밍이나 C언어에 관한 지식이 없으면 용어나 소스코드 작성 시 이해가 힘들기 때문에, 간단하게 이곳의 튜토리얼을 이해할 수 있는 정도의 C언어 강좌를 시작해 볼려고 합니다.

대상은 처음 C언어를 공부하시는 분들이며, 최대한 쉽게 설명해 보겠습니다.
 
1.1 C 언어의 역사와 특징
C는 1972년 Unix를 만들기 위해 Dennis Ritchie에 의해 만들어 졌습니다. 나온지 오래된 언어로 이 후 나온 언어들에 비해 불편한 점과 객체지향 프로그래밍을 구현하는데 어려움이 있지만, 아직까지 많이 사용되는 언어입니다.  

C는 오래된 역사와 시스템 프로그래밍과 같은 로우레벨 작업이 가능하고, 컴파일 되어 빠른 실행 파일을 작성할 수 있기 때문에 많은 플랫폼에서 사용되고 있습니다. 또한 게임 부터 각종 어플리케이션, 하드웨어 제어등 다양한 분야에서 사용됩니다.

현재 많이 쓰이는 C++, Objective-C, PHP등의 언어들이 C를 기본으로 하고 있고, C 문법은 거의 FM이라고 할수 있어 C를 기본으로 익히면 필요에 따른 프로그램 언어들을 배우기가 매우 용이 합니다.

이런 이유로 C는 처음 프로그램을 배우는 입문자에게 아직도 많이 권해 지고 있는 언어 입니다. 보다 자세한 C의 역사와 특징은 많은 곳에 언급되어 있으니 이곳에서는 이정도로 생략하겠습니다.


1.2 C 언어 공부하기
이곳에서는 간단하게 튜토리얼을 이해할 수 있을 정도의 기본적인 C 강좌를 할 것입니다. 체계적으로 C를 배우기 위해서는 관련서적을 구입하여 보실 것을 권장합니다.

1) 추천 서적

C와 관련하여 많은 서적이 있으니, 서점에서 직접 확인하여 보기 편하고 각자에게 맞는 서적을 구입하시면 됩니다. 일반적으로 많이 보는 C 관련 서적을 2개와 프로그래밍에 필요한 시스템에 관련된 기본 지식을 얻을 수 있는 책을 추천 합니다.

사용자 삽입 이미지
열혈강의 C 프로그래밍
윤성우 지음 / 프리렉

후배가 C를 배우고 싶다고 하여, 몇 년전 친구에게 요새 초보자가 보기에 괜찮은 C 서적이 뭐가 있는지 물어 보니 이 책을 추천해 주었습니다. 쉽게 설명되어 있어 C언어 공부를 시작하는 사람들이 보기에 가장 적당하다고 합니다.


사용자 삽입 이미지
C언어 프로그래밍
Brian W. Kernighan, Dennis M. Ritchie/대영사

1978년 나온 C의 바이블이라고 불리우는 The C Programming Language의 번역본 입니다. C를 배우기 위해 거의 필수적으로 봐야 할 서적이라고 할 수 있습니다. 하지만 바이블인 만큼 내용이 너무 교과서적(?)이라 위의 서적과 같이 병행하면서 보시면 좋습니다.


사용자 삽입 이미지
성공과 실패를 결정하는 1%의 프로그래밍 원리
HISAO YAZAWA(번역:예승철)/성안당

이전에 Inside the IBM PC라는 컴퓨터 시스템에 관련된 책이 있었습니다. 절판되지 않았다면 그 책을 추천했을 것이지만, 그와 비슷하고 심도는 조금 낮아진 것 같은 이 책도 적극 추천 합니다. C를 공부하기 전, 또는 공부하면서 이런 류의 책을 보시면 훨씬 이해가 쉽습니다.

위의 도서 이미지는 kangcom.com 에서 가지고 왔으며, 링크는 kangcom.com의 해당 도서로 링크되어 있습니다.


2) 보는 방법

책을 보실 때는 아래의 사항을 지키시면서 보시는게 좋습니다.

1. 백견불여일타
소스 코드는 백번 보는 것보다 직접 쳐보는 것이 더욱 효과적입니다. 책에 나오는 예제들은 무조건 직접 쳐보는 것이 좋습니다.

머리로 이해 하는 것도 중요하지만, 기본 문법과 자주 쓰이는 함수들이 습관화 되고 손에 익을 때 까지 가능한 한 많이 쳐보는 것이 좋습니다. 직접 타이핑을 하다 보면 오타가 나오고 컴파일을 위해 오류를 수정해야 하는데, 이 작업을 반복하면 반복할 수록 컴파일 전에 오류를 내는 습관을 줄일 수 있습니다.
 
2. 최소 2번이상 읽기
바이블로 여겨지는 책은 반드시 3번 정도 다시 읽어 보아야 합니다. 아는만큼 보인다고, 처음에 대충 이해를 하거나 잘 못 이해하고 넘어 갔던 부분들도 몇 번 다시 읽게 되면 작자가 설명하고자 하는 정확한 의미를 알 수 있습니다.

3. 꼼꼼하게 읽기
모든 책이 마찬가지 겠지만 대충 아는 것 같다고 그냥 넘겨 보면  안됩니다. 한 줄이지만 중요한 내용이 나올 수도 있고, 아는 내용이더라도 복습하는 의미로 꼼꼼하게 책을 읽는 것이 좋습니다. 빨리 책을 끝내는 것 보다 최대한 이해하도록 하고, 소스 코드 같은 경우에는 변경해 가면서 응용해 보는 것이 좋습니다. 


1.3 C 컴파일 환경 만들기
C 뿐만 아니라 다른 언어도 책만 보는 것 보다, 직접 타이핑을 해보고 컴파일을 하는 것이 더욱 이해가 용이합니다. C 코드를 테스트 해 볼수 있는 환경을 만들기 위하여, 맥/리눅스/윈도우에서 필요한 툴들을 알아보겠습니다.

1. Mac OS X

맥 OSX에서는 GCC, VI를 이용하여 C 소스코드를 작성하고 컴파일 할 수 있습니다. 간편하게 XCode를 이용할 수도 있습니다. Xcode는 이곳의 튜토리얼 1.1 Xcode 구하기에서 다운로드 및 설치에 대해 참고하실 수 있습니다.

Xcode를 이용하는 방법은 다음과 같습니다. 메뉴에서 File/New Project를 클릭합니다. 아래와 같이 Command Line Utility 항목에서 Standard Tool을 선택 하고 Next를 클릭한 후, 적당한 프로젝트명을 입력합니다.
사용자 삽입 이미지

위의 작업이 완료되면 Xcode에서 main.c를 열고 아래와 같이 책이나 이곳에 나오는 C 코드를 입력하고 테스트 해 보실 수 있습니다.
사용자 삽입 이미지

Xcode이외에 직접 gcc를 이용할 수 있습니다. 아래 2. Linux의 내용은 맥 OS X에서도 똑같이 적용이 가능합니다.


2. Linux

리눅스에는 GCC라는 C/C++ 컴파일러가 있습니다. 어떻게 보면 IDE (프로그램 통합 개발 환경)없이 리눅스 프롬프트 모드에서 직접 컴파일러나 링커를 실행 시키고 make를 이용하는 가장 원초적인 환경에서 작업 하는 것이 기본적인 이해에 좋습니다.

Linux(unix)는 C와 밀접한 관계에 있으므로, 대부분 C 컴파일러와 개발툴들이 포함되어 있습니다. 만약 사용하는 리눅스에 gcc가 설치되어 있지 않을 경우에는, 사용하는 리눅스 패키지에 있는 설치 툴들을 이용해 gcc 또는 developement, build 등으로 되어 있는 패키지를 인스톨 하시거나, 직접 다운로드 받아 설치하셔야 합니다.

에디터로는 vi, emacs등을 사용하실 수 있습니다. 아래는 맥의 BSD 유닉스 환경(아래의 모습은 리눅스와 완전 동일 합니다.)에서  hello, world를 편집하고 컴파일, 실행해 본 화면입니다.
사용자 삽입 이미지

사용자 삽입 이미지


3. MS Windows

윈도우즈 환경에선 대표적인 Visual C++이나 VS 2005가 있지만, 무료이고 용량도 작은 DEV-C++ 공개 컴파일러를 추천합니다.

VC의 경우에는 초보자가 공부를 위해 사용하기에 환경이 지나치게 복잡하고, 책들의 예제와는 다른 환경이나 메시지가 나올 수 있습니다. 예를 들면 strcpy 함수를 사용하면 strcpy_s로 사용하라고 경고 메시지를 내보냅니다. (경고는 끌 수 있습니다)

MS측에선 C 런타임 라이브러리의 안정성을 높이기 위해서 만들었다고는 하지만, 혼돈이 있을 수 있습니다. C언어 공부를 위해선 Dev-C++을 사용하는 것이 더 좋습니다. Dev-C++는  http://www.bloodshed.net/dev/devcpp.html 에서 다운 받으실 수 있습니다.

테스트를 위해선 설치를 하고 실행시킨 후, 메뉴에서 파일/새로만들기/프로젝트를 클릭합니다. 새로운 프로젝트에서 Console Application을 선택하고, 적당한 프로젝트 명을 입력하고 C를 선택한 후에 확인 버튼을 클릭합니다.
사용자 삽입 이미지

아래는 편집 화면이고 컴파일 후에 실행하여 결과를 확인할 수 있습니다.
사용자 삽입 이미지

위와 같이 소스를 작성 하면 컴파일 후 실행하면, 프롬프트 창이 너무 빨리 사라져 결과를 알 수 없습니다. 원래 main.c는 return 0; 위에 system("PAUSE"); 라는 라인이 자동으로 추가되어 있었는데, 이곳에서는 소스를 똑같이 보이기 위해 삭제했습니다.

실제 사용시에는 system("PAUSE"); 라인 위에 소스를 입력하시면, 결과를 확인할 수 있습니다.
이상 C를 공부하는데 필요한 내용과 어플리케이션에 관해 알아 보았습니다. 다음 장에서는 C 프로그램을 위한 기본적인 내용과 용어에 관해 설명하겠습니다.

'프로그래밍 강좌 > C 언어 기초' 카테고리의 다른 글

6. 제어문  (0) 2007.06.14
5. 연산자  (0) 2007.06.13
4. 변수  (2) 2007.06.12
3. C 기초문법  (0) 2007.06.05
2. 소스코드, 컴파일, 링크  (6) 2007.06.04
AND