본문 바로가기

C/C++

[C언어와 알고리즘] C언어 소개 (1)

OSS 2012-08-17 16:53:48 2161
2010



글: 정재준 (rgbi3307@nate.com ) / 커널연구회(www.kernel.bz)   2010-11-04

필자의 연재물 “C언어와 알고리즘”은 C언어를 체계적으로 학습한 후 자료구조와 알고리즘을 C언어로 이해 및 응용하도록 도와주는 내용으로 구성한다. C언어는 임베디드는 물론 많은 정보통신 분야에서 프로그래밍 언어로 사용하고 있다. 또한, 자료구조와 알고리즘은 컴퓨터 프로그래밍의 기반을 이루는 초석이다. 오늘날 많은 공학적 응용제품들은 자연과학(수학, 화학, 물리)의 토대 위에서 만들어졌다.

컴퓨터 응용 프로그램들 또한 자료구조와 알고리즘 기반에서 코딩 되었으며, C언어는 자료구조와 알고리즘을 구현하는데 유용한 컴퓨터 프로그래밍 언어의 선구자이다. 필자는 오랫동안 자료구조와 알고리즘을 학습한 내용을 C언어로 체계적으로 실습하여 그 결과를 구체적으로 확인한 내용들을 정리해왔다. 이것을 토대로 “C언어와 알고리즘” 연재물을 집필하고 있고 여기에 필자의 많은 노력이 담겨져 있다. 독자 여러분들의 많은 관심과 격려 있기를 바란다.

연재순서

1. C언어 소개
2. 형태, 연산자, 표현
3. 제어 흐름
4. 함수와 프로그램 구조
5. 포인터와 배열
6. 구조체
7. 알고리즘 소개
8. 소팅을 통한 알고리즘 분석
9. 스택(Stack) 실습
10. 큐(Queue) 실습
11. 리스트(List) 실습
12. 트리(Tree) 실습
13. 해싱(Hash) 실습
14. 알고리즘 설계 및 분석기법
15. 진보된 알고리즘 소개

C언어와 알고리즘 연재를 시작하며

필 자는 중학교 시절 8비트 컴퓨터를 처음으로 접하면서 신비한 마력과도 같은 호기심에 빠졌던 기억이 아직도 생생하다.  그 당시에는 고가였던 컴퓨터를 사고 싶어 새벽에 신문배달하는 아들의 모습이 안쓰러워 부모님은 8비트 컴퓨터를 사주셨다. 하지만, 필자는 그것을 그냥 재미있는 게임기 정도로만 사용했던 것을 지금도 후회하고 있다.

그때는 8비트 마이크로프로세서(CPU)로 애플사의 6502, 자이로그 Z80이 출시되던 시기였고, 인텔의 16비트 마이크로프로세서인 8086이 개발되어 디스크 드라이브와 같은 주변장치들을 구동하는 운영체제인 DOS(Disk Operating System)가 마이크로소프트사에 의해서 발표되어 PC시장이 형성되던 시기였다. 당시의 필자는 컴퓨터의 구성 원리를 이해하지 못하고 있었다.

이후, 대학을 다니면서 1세대 기계어(Assembly)로 마이크로프로세서를 통한 제어기술을 배우면서 미로를 찾아다니는 소형 로봇제작에 집중해 보기도 하고, C, Delphi, PHP 등으로 응용프로그래밍을 하기도 했었다.  하지만, 이때도 운영체제가 제공해 주는 개발환경과 소프트웨어 개발도구(SDK)들에 대한 활용법만 중요하게 생각하다 보니 원천 기술을 익히고자 하는 노력이 부족했다.

필 자가 현재 느끼고 있는 컴퓨팅의 기본 기술은 컴퓨터가 이해하는 자료구조와 알고리즘을 효율적으로 코딩하는 것이다. 운영체제(OS)는 각종 컴퓨터 하드웨어들을 효율적으로 제어하기 위한 자료구조의 집합체이며, 데이터베이스 관리시스템(DBMS)은 정보처리를 정확하고 빠르게 처리할 수 있도록 알고리즘들을 표준화 했다. 한세기 전에 컴퓨터와 운영체제를 먼저 개발한 나라에서는 지금도 향상된 제품을 출시하면서 원천기술이 되는 자료구조와 알고리즘들을 라이브러리화된 부품으로 공급하고 있다.

우리는 이 부품을 그대로 가져와 응용 제품을 만드는데 사용하고 있다.  이렇게 형성되어 있는 공급과 소비의 종속관계는 지금도 여전히 한방향으로 흘러가고 있다. 즉, 공급하는 쪽은 계속 공급하고 소비하는 쪽은 비용을 지불하며 계속 소비하고 있는 것이다. 정보기술(IT)분야에서 소프트웨어 개발시 이러한 종속관계는 한세기 동안 변화지 않고 있다. 필자는 그 이유를 정보기술분야의 원천기술인 자료구조와 알고리즘에서 찾고 있다.

자료구조와 알고리즘은 자동차 엔진에 해당한다.  자동차를 만들기 위해서는 많은 분야의 기술들을 접목시켜야 한다. 자동차 엔진, 동력전달계, 타이어, 외부 차체 디자인, 생산라인 조립, 도장, 영업기술등...  또한, 정보기술분야에서 응용 프로그래밍할 때도 많은 기술들이 융합되어야 한다. 운영체제(OS), 커널, 디바이스 드라이버, 입출력 라이브러리, 컴파일러, 개발언어, 입출력 디자인...  이러한 프로그래밍 기술들을 자동차와 비교해 보면, 운영체제와 커널은 자동차 엔진, 디바이스 드라이버와 입출력 라이브러리는 동력 전달계, 컴파일러와 개발언어는 생산라인, 입출력 디자인은 자동차 외장에 해당한다.

우리는 정보기술분야에서 자동차 엔진, 동력 전달계, 생산라인에 해당하는 핵심 부품은 수입하여 그것을 그대로 조립하는 일을 하고 있다. 즉, 우리가 제품으로 내놓고 있는 프로그램들은 부품 조립과 외장 디자인에 의한 것이지, 원천 기술을 사용한 엔진은 없다.  필자가 “C언어와 자료구조 알고리즘”에 대한 책을 집필한 이유는 원천 기술을 학습하여 훌륭한 엔진을 만들어 보기 위함이다. 정보기술분야의 연구개발 환경이 열악하다는 말을 많이 들었고, 필자 또한 이분야에서 일하면서 그것을 직접 느끼고 있으나, 이제는 그것을 극복하여 다음 세대에 더 좋은 유산을 물려주고 싶다.

필자의 “C언어와 알고리즘”은 C언어를 체계적으로 학습한 후 자료구조와 알고리즘을 C언어로 실습하여 이해 및 응용하도록 도와주는 것이다. C언어의 역사는 오래 되었고 많은 컴퓨터 프로그래밍 분야에서 사용되고 있다. 또한, 자료구조와 알고리즘은 컴퓨터 프로그래밍의 기반을 이루는 초석이다.  응용은 기반이 되는 기초지식을 토대로 이루어진다. 오늘날 많은 공학적 응용제품들은 자연과학(수학, 화학, 물리)의 토대 위에서 만들어졌다. 컴퓨터 응용 프로그램들 또한 자료구조와 알고리즘 기반에서 코딩 되었으며, C언어는 자료구조와 알고리즘을 구현하는데 유용한 컴퓨터 프로그래밍 언어의 선구자이다.

그런데, 그동안 자료구조와 알고리즘은 너무 이론적인 내용으로 기술되어 사용자들이 이해하는데 많은 어려움이 있었다. 필자는 오랫동안 자료구조와 알고리즘을 학습하면서 C언어로 체계적으로 실습하여 그 결과를 구체적으로 확인한 내용들을 정리해왔다.  이것을 토대로 “C언어와 알고리즘”은 집필되었고 필자의 많은 노력이 여기에 담겨져 있다.

C언어 소개

C 언어는 일반적인 목적(범용)의 컴퓨터 프로그래밍 언어이다. C언어는 UNIX 시스템에서 개발되었으며 UNIX와 밀접하게 연관되어있다. UNIX 시스템은 물론 UNIX에서 실행되는 대부분의 프로그램들은 C언어로 작성되었다. 그러나 C언어는 특정 운영체제나 머신에 제한받지 않고 범용으로 사용할 수 있다. C언어는 컴파일러나 운영체제를 작성할 수 있어서 시스템 프로그래밍 언어로도 취급되지만, 여러 분야에서 좋은 응용 프로그램들을 작성하는 데에도 유용하다.

 
 

Dennis Ritchie     Ken Thompson     Martin Richards

C 언어는 1972년 미국 벨연구소의 Dennis Ritchie에 의해 개발되었다. 이보다 앞서 1970년에 같은 연구소의 Ken Thompson이 최초의 UNIX 시스템인 DEC PDP-7상에서 작성한 B언어가 개발되었지만, C언어가 대중적으로 널리 알려지면서 이후의 많은 프로그래밍 언어에 영향을 주었다.  Ken Thompson과 Dennis Ritchie는 1960년대에 벨연구소에서 Multics라는 프로젝트를 함께 진행한 연구원이었다.

이 당시 Multics 프로젝트는 중단되었지만, 이것을 경험으로 하여 1969년에 Thompson과 Ritchie는 Unix 운영체제를 개발하게 되고, 여기에 사용된 언어가 Thompson의 B언어와 Ritchie의 C언어이다. 이보다 앞서서 B언어와 C언어의 중요한 개념들은 1966년 영국의 Cambridge 대학교 교수인 Martin Richards에 의해서 개발된 BCPL(Basic Combined Programming Language)이라는 컴파일러 언어에서 유래되었다. 따라서, 1966년의 BCPL언어가 1970년 B언어, 1972년 C언어에 영향을 준 셈이다. BCPL언어와 B언어는 데이터 타입이 없는(typeless) 언어였다.

반면 에, C언어는 다양한 데이터 타입(문자형, 정수형, 실수형 등)을 제공한다. 또한, 계층적으로 진보된 형태의 데이터 타입인 포인터, 배열, 구조체 등이 추가되었다. 포인터(pointer)는 머신에 의존되지 않는 머신 독립적인 주소 연산을 제공한다. 연산대상자(operand)와 연산자(operator)로 구성되는 표현(expression)은 할당이나 함수호출을 포함하여 하나의 문장을 이룬다.

C언어는 구조적인 프로그램을 작성하는데 필요한 제어흐름 명령어를 제공한다. 문장을 묶어주고, 판단제어(if-else), 가능한 경우의 집합중에서 하나를 선택(switch), 상단부에서 종료를 판단하는 반복(while, for), 하단부에서 종료를 판단하는 반복(do), 반복 탈출(break) 등이 제어문에 해당한다.  C언어 함수는 기본 데이터 타입뿐만 아니라 구조체, 포인터 등을 반환할 수 있다. 함수는 재귀적으로 호출될 수 있으나, 함수 정의는 중첩될 수 없고 소스 파일에서 유일해야 한다. 변수는 지역적으로 구분된 영역마다 여러 번 정의될 수 있다.

위에서 C언어의 역사와 특징을 간단히 언급하였다. 필자는 1988년에 ANSI C로 표준화된 내용을 토대로 C언어를 설명한다. C언어로 여행을 떠나기 전에 먼저 간단한 예제 프로그램을 통해서 C언어의 핵심적인 개념을 이해해 보자.

아 래 예제는 “The first C program” 라는 문자열을 출력하는 것이다. 아주 간단하지만 C언어로 프로그래밍 하는 방법을 이해할 수 있는 기본적인 내용을 담고 있다.  아래 내용을 편집기에 입력하고 소스파일을 만들어 컴파일, 링크하여 생성된 실행파일을 실행하여 결과를 확인해 보자.

(실습 소스) ch0101_hello.c


#include <stdio.h>

void main()

{
printf("The first C programn");
}
 


컴파일, 링크 및 실행은 컴퓨터 운영체제와 개발환경에 따라서 다소 차이가 있지만, 필자는 리눅스 환경에서 실습한 것을 설명한다.

(실행 결과) ch0101_hello.c


$ cc -c ch0101_hello.c  ← 컴파일
$ ll
-rw-rw-r    1 jungjj   jungjj    79 12월 13 08:41 ch0101_hello.c
-rw-rw-r    1 jungjj   jungjj    840 12월 13 08:49 ch0101_hello.o  ← object 코드 생성됨

$ cc -o hello ch0101_hello.o  ← 링크
$ ll
-rwxrwxr-x    1 jungjj   jungjj    11638 12월 13 08:51 hello  ← 실행파일 생성됨
-rw-rw-r    1 jungjj   jungjj    79 12월 13 08:41 ch0101_hello.c
-rw-rw-r    1 jungjj   jungjj    840 12월 13 08:49 ch0101_hello.o

$ ./hello  ← 실행
The first C program  ← 실행결과


C 프로그램은 함수와 변수로 구성된다. 함수는 문장들을 포함하고, 문장에서 실행 동작을 기술한다. 변수들은 수행되는 동안 사용하는 값들을 저장하고 있다. C 함수는 포트란의 서브루틴 및 파스칼의 프로시져와 유사하다. 위의 프로그램 예제(ch0101_hello.c)에서 main() 이라는 함수가 사용되었다. main() 함수는 아주 특별한 함수이며, 사용자 프로그램의 수행은 이 함수에서부터 시작한다.

따라서 모든 C언어 프로그램은 반드시 하나의 main() 함수를 가지고 있다. 첫번째 행에 있는 #include <stdio.h>는 표준 입출력 라이브러리에 대한 정보를 포함하도록 컴파일러에게 알려주는 역할을 한다. 이것은 보통 C 소스의 시작행에 기술한다. 매개변수는 함수들간에 데이터를 주고받는 방법중에 하나이며 함수명칭의 바로 뒤에 오는 괄호 ()안에 기술한다. 위의 예제에서 main 함수의 ()는 비어 있으므로 main 함수로 전달되는 매개변수가 없다. 함수 안의 문장들은 중괄호 {}로 묶여진다. main 함수 안에는 아래의 문장이 있다.

printf("The first C programn ");

문 장은 세미콜론(;)으로 끝난다. 이 문장은 printf라는 함수를 호출하면서 매개변수로 문자열인"The first C program"을 전달한다. printf는 <stdio.h> 헤더파일에 정의되어 있는 라이브러리 함수이며 매개변수로 전달받은 문자열을 출력장치인 화면에 출력한다. 따라서 위의 프로그램을 실행하면 화면에 "The first C program"이 출력되는 것이다.

이로써 가장 간단한 C언어 프로그램을 실습해 보았다. 위의 내용은 아주 기본적이지만 중요한 요소들이 담겨져 있으므로 잘 기억하여 앞으로 전개되는 다양한 C언어의 개념들을 익히고 실습하는 초석이 되도록 한다.

참고로 위에서 사용한 printf() 함수는 데이터 결과값을 출력하는데 자주 사용하므로, printf 함수의 문법을 요약하면 아래와 같다.
printf(“format”, data..);  //data에 저장되어 있는 값들을 “format” 형식으로 출력한다.

또한, 필자가 C언어 프로그래밍 실습용으로 사용한 컴퓨터(머신) 종류와 리눅스 버전 및 C언어 컴파일러 버전은 아래와 같다.
$ uname -a    머신 종류 및 리눅스 버전
Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux

$ cc -version    C언어 Compiler 버전
cc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -version    GNU C언어 Compiler 버전
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C언어 코딩 이해

아 래는 C언어 코드의 윤곽을 먼저 알아보고, 코드를 효율적으로 작성하기 위한 예제를 설명한 것이다. 아직까지 C언어에 대해서 모두 설명하지 않은 상태이므로 문법적으로 이해되지 않는 부분이 있더라도 그냥 넘겨주기 바란다. 단지, C언어 코드의 전체적인 흐름 파악에 촛점을 맞춰주면 좋겠다.

아래의 C언어 코드는 화씨(F)를 섭씨(C)로 변환하여 결과를 표시하는 것이다. 프로그램 코드는 크게 세부분(입력·처리·출력)으로 나누어 진다는 것을 알아두자. main() 함수 내부의 변수 선언, 초기값 할당, 변환값 계산, 결과출력 중심으로 코드흐름을 이해한다.

(실습 소스) ch0102_loop01.c


#include <stdio.h>  //표준입출력 라이브러리 헤더파일

main()
{
    float fahr, celsius;
    float lower, upper, step;

    lower = 0;    //하한값
    upper = 300;    //상한값
    step = 20;    //증가단위값
    fahr = lower;

    while (fahr <= upper) {
    celsius = (5.0/9.0) * (fahr-32.0);  //화씨를 섭씨로 계산
    printf("%3.0f %6.1fn", fahr, celsius);  //결과값 출력
    fahr = fahr + step;  //증가
    }
}


(실행 결과) ch0201_loop01.c


$ cc -o ch0201 ch0201_loop01.c   컴파일 및 링크
$ ./var01  실행
0    -17  실행결과
20    -6
40    4
60    15
80    26
100    37
120    48
140    60
160    71
180    82
200    93
220    104
240    115
260    126
280    137
300    148


위의 코드를 아래와 같이 단 3개의 문장만으로 줄일 수 있다. 또한, for 루프의 제어변수를 int로 사용했다는 점에서 여러가지 이점이 있다.


#include <stdio.h>

main()
{
    int fahr;
    for (fahr = 0; fahr <= 300; fahr += 20)
    printf("%3d %6.1fn", fahr, (5.0/9.0)*(fahr-32));
}


그 런데, 3개의 문장으로 줄이긴 했지만, 코드의 가독성(판독성) 및 유지보수성은 떨어진다. 이것을 높이는 방법은 어떤 것들이 있을까? 코드의 판독성 및 유지보수성을 높이기 위해서 아래와 같이 #define으로 미리 정의하는 방법이 있다.


#include <stdio.h>

#define LOWER 0
#define UPPER 300
#define STEP  20

main()
{
    int fahr;
    for (fahr = LOWER; fahr <= UPPER; fahr += STEP)
    printf("%3d %6.1fn", fahr, (5.0/9.0)*(fahr-32));
}


아 래 실습 소스는 C언어의 표준 입출력 함수인 getchar()를 통하여 입력받은 문자를 putchar()로 출력하는 것이다. 문자 입출력은 while 루프안에서 계속 반복된다. 입력 문자로 EOF(Ctrl+Z)가 입력되면 루프 반복이 중단되고 프로그램이 종료된다.

(실습 소스) ch0103_char_io01.c
/*
author:    Jung,JaeJoon (rgbi3307@nate.com , http://www.kernel.bz/ )
comments:   문자 입출력
*/

#include <stdio.h>

//getchar()로 입력받은 문자를 putchar()을 통하여 출력
main()
{
   int c;

   c = getchar();
   while (c != EOF) {    //EOF==^Z
    putchar(c);
    c = getchar();
   }
}


(실행 결과) ch0103_char_io01.c


$ cc -o ch0103 ch0103_char_io01.c    컴파일 및 링크
$ ./ch0103    실행
A    입력문자
A    출력문자
B
B
C
C
    ^Z 입력 (루프 종료)
[1]+  Stopped    ./ch0103


아래는 위의 소스 코드를 좀더 간략하게 수정한 것이다. 실행 결과는 동일하다. 문자를 입력하는 c=getchar() 문장을 while의 조건식으로 표현할 수 있다는 것을 알아두자.

(실습 소스) ch0103_char_io02.c


/*
author:    Jung,JaeJoon (rgbi3307@nate.com , http://www.kernel.bz/ )
comments:   문자 입출력
*/

#include <stdio.h>

main()
{
   int c;

   while ((c = getchar()) != EOF)
    putchar(c);
}


아 래의 소스 코드는 getchar()로 입력 받은 문자가 어떤 종류인지 판단하여 그것의 개수를 카운트(회수)하는 프로그램이다. 문자 종류는 if-else 문장을 사용하여 숫자(0~9), 화이트스페이스(공백, 개행문자, 탭), 기타 다른문자로 구분한다. 숫자의 종류를 카운트하기 위해서 ndigit[10]이라는 배열을 사용했고, 아스키문자로 배열 인덱스를 계산하고 있음을 기억해 두자. 자세한 내용들은 이후에 자세히 설명되므로 지금 당장 이해되지 않더라도 C언어 소스 코드의 흐름을 파악하는데 초점을 맞춰주기 바란다.

(실습 소스) ch0104_char_count.c


/*
author: Jung,JaeJoon (rgbi3307@nate.com , http://www.kernel.bz/ )
comments: 입력된 문자종류 카운트

*/

#include <stdio.h>

main()
{
   int c, i, nwhite, nother;
   int ndigit[10];

   nwhite = nother = 0;
   for (i = 0; i < 10; ++i)
    ndigit[i] = 0;

   while ((c = getchar()) != ‘‘~‘‘)  //’~’문자가 입력되면 루프 종료
    if (c >= ‘‘0‘‘ && c <= ‘‘9‘‘)
    ++ndigit[c-‘‘0‘‘];    //숫자카운트(아스키 문자로 배열인덱스 계산)
    else if (c == ‘‘ ‘‘ || c == ‘‘n‘‘ || c == ‘‘t‘‘)
    ++nwhite;    //화이트스페이스(공백, 개행, 탭) 카운트
    else
    ++nother;    //기타문자카운트

   printf("digits =");
   for (i = 0; i < 10; ++i)
    printf(" %d", ndigit[i]);
   printf(", white space = %d, other = %dn", nwhite, nother);

}


(실행 결과) ch0104_char_count.c

$ cc -o ch0104 ch0104_char_count.c    컴파일 및 링크
$ ./ch0104  실행
This is the char 0123451239 counting program~
digits = 1 2 2 2 1 1 0 0 0 1, white space = 6, other = 28
 


아래는 사용자 정의 함수의 선언과 정의 및 사용을 보여주는 소스이다. 함수는 다음과 같이 선언한다.

반환되는_데이터_타입  함수명(입력되는_데이터_타입);
int power(int m, int n);

위에서 int는 반환되는 데이터 타입이고 power는 사용자 정의 함수명, (int m, int n)은 함수로 입력되는 데이터 타입(매개 변수)이다. 이렇게 함수의 원형을 선언한 후, 다음과 같이 함수의 본체를 정의한다.

int power(int base, int n)
{
    int i,  p;

    p = 1;
    for (i = 1; i <= n; ++i)
    p = p * base;
    return p;
}

power 함수는 매개변수로 m(base), n을 입력받은후 m(base)를 n번 곱한 결과(m의 n승)를 산출하는 역할을 한다. 아래의 소스를 실행하면 2의10승과 -3의10승이 단계적으로 출력됨을 확인할 수 있다.

(실습 소스) ch0105_function.c


/*
author: Jung,JaeJoon (rgbi3307@nate.com , http://www.kernel.bz/ )
comments:    함수 선언과 정의
*/

#include <stdio.h>

//함수선언
int power(int m, int n);

main()
{
    int i;

    for (i = 0; i < 10; ++i)
    printf("%d %d %dn", i, power(2,i), power(-3,i));

return 0;
}

//함수정의: base을 n만큼 곱함
int power(int base, int n)
{
    int i,  p;

    p = 1;
    for (i = 1; i <= n; ++i)
    p = p * base;
    return p;
}


(실행 결과) ch0105_function.c


$ cc -o ch0105 ch0105_function.c    컴파일 및 링크
$ ./ch0105    실행
0 1 1
1 2 -3
2 4 9
3 8 -27
4 16 81
5 32 -243
6 64 729
7 128 -2187
8 256 6561
9 512 -19683



맺음말

필 자는 "C언어와 알고리즘" 연재를 시작하면서 "기본에 충실"이라는 말을 되새기고 있다. 기본에 충실하여 기본 원리를 파악하고 있으면 어떠한 환경에도 응용할 수 있는 자신감이 생긴다. 요즘들어 새로운 방식의 정보통신기기가 출시 되고 있고, 임베디드 환경이 많이 부각되고 있다. 이러한 환경일수록 C언어와 알고리즘에 대해서 충실하면 좀더 창조적인 작업을 할 수 있다.

필자는 첫번째 연재에서 C언어의 창시자와 역사 및 C언어의 특징에 대해서 알아보고, C언어 소스 코드의 흐름을 전체적으로 파악할 수 있도록 기술하였다. 앞으로 C언어의 문법을 체계적으로 설명하여 다양한 알고리즘들을 실습할 수 있도록 연재할 계획이다. 독자 여러분들의 많은 관심과 격려 있기를 바란다.


필 / 자 / 소 / 개

(정 재준) 필자는 학창시절 마이크로프로세서 제어 기술을 배웠고, 10여년동안 쌓아온 IT관련 개발 경험을 바탕으로 “오라클실무활용SQL튜닝(혜지원)” 책을 집필하고, “월간임베디드월드” 잡지에 다수의 글을 기고하였다.  서울대병원 전산실에서 데이터베이스 관련 일을 하면서 학창시절부터 꾸준히 해온 리눅스 연구도 계속하고 있다.  특히, 스탠포드대학교의 John L. Hennessy 교수의 저서 “Computer Organization and Design” 책을 읽고 깊은 감명을 받았으며, 컴퓨터구조와 자료구조 및 알고리즘 효율성 연구를 통한 기술서적 집필에 노력하고 있다.  또한, 온라인 상에서 커널연구회 (http://www.kernel.bz/ )라는 웹사이트를 운영하며 관련기술들을 공유하고 있다.


※ 본 내용은 (주)테크월드(http://www.embeddedworld.co.kr)의 저작권 동의에 의해 공유되고 있습니다.
Copyright ⓒ
Techworld, Inc. 무단전재 및 재배포 금지

공개SW 기술팁 - 번호, 제목, 조회수, 작성
번호 제목 작성 조회수
5 [C언어와 알고리즘] 포인터와 배열 (5) 2012-08-17 2828
4 [C언어와 알고리즘] 함수와 프로그램 구조 (4) 2012-08-17 2681
3 [C언어와 알고리즘] 제어 흐름 (3) 2012-08-17 2063
2 [C언어와 알고리즘] C언어 형태, 연산자, 표현 (2) 2012-08-17 4499
1 [C언어와 알고리즘] C언어 소개 (1) 2012-08-17 2161
맨 위로
맨 위로