C 프로그래밍 입문

C 프로그래밍 입문

C 프로그래밍을 하기 전에 알아두어야 할 것들

+/-

C의 역사[1]와 특성

+/-

C언어는 1972년에 벨(Bell) 연구소의 데니스 리치(Dennis Ritche)가 개발하였으며, 켄 톰슨(Ken Tompson)이 UNIX를 개발할 때 사용한 B언어를 기초로 하여 개발된 것이다. 현재 UNIX의 운영체제와 이에 제공되는 소프트웨어의 거의 모두가 C언어로 작성되어 있다. 그 후 여러 종류의 C가 개발되었으며 ANSI(American National Standard Institute)에서 표준으로 정한 ANSI C가 1988년에 발표되었다. 데니스 리치(Dennis Ritche)가 C를 개발하기 이전에 사용되어온 C모태의 계보는 다음과 같다.

1960년 국제위원회에서 발표한 추상적이고 범용적인 언어
  • CPL (Combined Programming Language)
1963년 케임브리지(Cambridge) 및 런던(London) 대학교 팀이 발표
  • BCPL (Basic Combined Programming Language)
1967년에 케임브리지(Cambridge) 대학교의 마틴 리챠드(Mar-tin Richards)가 발표한 시스템 프로그래밍의 효율을 높인 언어
1970년 벨(Bell) 연구소의 켄 톰슨(Ken Thompson)이 개발
1972년 벨(Bell) 연구소의 데니스 리치(Dennis Ritche)가 개발하였으며 B언어에 기계어 생성 및 자료형과 구조 선언을 가능케 한 언어

C라는 언어 자체가 운영체제를 만들었던 언어를 개선해서 만들어진 데다가, C 자체도 운영체제를 만드는 언어로 개발 되기도 했다. 실제로 많은 운영체제가 C로 만들어졌기도 하다. C 가 운영체제를 만드는데 유리한 이유는 언어 자체가 사람보다는 기계쪽에 유리하게 만들어진 언어이기 때문이다. 하드웨어를 제어하거나 관리하는데 다른 언어보다 유리하다는 장점을 가지고 있는데, 실제로 어셈블리어를 공부한 적이 있는 사람은 그다지 큰 고민 없이 C 로 만들어진 프로그램을 어셈블리어로 변환할 수 있을 정도로 어셈블리어로 프로그래밍 할 때 갖게되는 많은 특성들이 C 언어에서 발견된다. C 이후에 나온 거의 모든 언어에 추가되다 싶이한 대입연산자 역시 어셈블리어로 1:1 변환이, 정확히 말해서는 어셈블리언어의 특성을 그대로 옮겨다가 만들어낸 연산자 이기도 하다.

C 언어가 어렵게 느껴진다면, 그것은 실지로 C 라는 언어가 어렵다기 보다는 다른 언어에서 대신 처리해 주는 부분을 프로그래머 스스로 해야 하기 때문에 할 일이 많기 때문 일 것이다. 어셈블리언어 역시 프로그래머들에게 어렵다는 이유로 외면을 당하고 있긴 하지만, 실상 언어 자체만 놓고보면 배우기 가장 쉬운 언어는 아마 어셈블리언어 일 것이다. C 나 어셈블리언어 모두 '어려운 것이 아니라 귀찮은 것'이다. 알고보면 가장 많은 일을 해야하는 언어 들이지만 가장 많은 일을 할 수 있는 언어이다. 가장 많은 권한을 주는 언어이자 가장 많은 책임을 지우는 언어 이기도 하다.

C 프로그래밍 환경

+/-

아래에 언급되지 않은 익숙한 환경에서의 프로그래밍 환경을 구성하고, hello_world.c 를 컴파일 하기 까지의 절차를 추가해 주셨으면 합니다.

C 언어는 프로그램을 실행할 수 있는 형태로 만들기 위해서 ‘파싱-컴파일-링크’의 세 단계를 거치게 된다. 파싱(Parsing)이란 프로그램을 문법에 따라 분해하는 작업을 말하며, 이 작업을 통해 C 언어를 실행이 가능한 형태로 번역(Compile)할 수 있는 기본 작업을 수행하게 된다. 컴파일(Compile)이란 C 언어로 되어있는 프로그램을 CPU가 처리할 수 있는 형태의 기계어(mechanical language)로 번역하는 작업을 의미한다. 마지막으로 링크(link)란 프로그램을 실행할 수 있도록 운영체제 혹은 다른 프로그래머가 미리 만들어둔 프로그램-보통 ‘라이브러리’라고 부른다.-과 연결해서 프로그램을 실행하는데 반드시 필요한 다른 요소를 사용 할 수 있도록 하는 작업을 말한다. 이렇게 ‘파서-컴파일러-링커’를 통틀어 ‘컴파일러’라고 부르며 C 혹은 다른 고수준 언어(High Level Language)로 작성되어 있는 프로그램을 컴퓨터가 실행할 수 있는 형태로 번역해주는 프로그램을 지칭한다.

같은 컴퓨터에서 동작하는 프로그램이라고 해도 운영체제와 맞는 컴파일러가 필요하며 자신의 상황과 조건에 맞는 컴파일러를 선택해야 한다. MS Windows에서 사용할 수 있는 컴파일러로는 Visual C++이나 Turbo C를 사용하거나, 윈도우 버전의 gcc를 사용할 수 있을 것이다. 또한 유닉스 환경이라면 유닉스 벤더가 제공하는 cc (C Compiler)를 사용하거나, GNU에서 제공하는 프리 소프트웨어인 gcc를 사용할 수 있을 것이다. Mac OS X의 경우 xcode라는 개발툴을 제공하며, Objective-C 가 그 근간이긴 하지만, 기본적으로 C 컴파일도 가능하고, gcc 베이스 이므로 유닉스나 리눅스 환경에서 컴파일을 해본 사람이라면 적응하는데 어려움을 느끼진 않을 것이다.

또한 프로그램이 여러 개의 파일로 나뉘어 있는 경우에는 Makefile을 사용하여 여러 개의 파일을 컴파일하고 링크하는 것을 쉽게 할 수 있을 것이다.


Linux와 GCC 에서의 프로그래밍

+/-

MS Windows 에서의 프로그래밍

+/-
CygWin을 이용한 GCC 컴파일러 사용
+/-

다운로드: http://cygwin.com/setup.html

Visual C++ Express를 이용한 컴파일
+/-

다운로드: http://www.microsoft.com/express/Downloads/

Dev-C++를 이용한 컴파일
+/-

Dev-C++는 무료(Free) 통합개발환경(Integrated Development Environment)로써 Bloodsheds.net에서 다운받아 사용할 수 있다.

다운로드: http://www.bloodshed.net/download.html

C 기본 연습

+/-

여러가지 출력 방법

+/-

C 문법

+/-
  1. 주석달기
  2. 들여쓰기


  1. 키워드
  2. C에서 사용되는 문자들
    1. 확장문자 (Escape Character)
    2. Trigraph sequence
  3. 미리 지정된 특수한 식별자

데이터 다루기

+/-
  1. C 관점에서의 변수 혹은 상수와 데이터 타입
  2. 변수의 유효범위와 저장 위치
    1. auto
    2. register
    3. static
    4. 전역변수(global variable)
    5. 여러 파일에서 통용되는 전역변수
    6. volatile
  3. 변수의 값을 다루는 방법에 따른 분류
    1. 부정형 데이터
    2. 부동소수형 데이터
    3. 정수형 데이터
      1. 고정폭 정수 타입
      2. 조금 어려운 이야기 -- 바이트 오더 혹은 엔디언
    4. 문자형 데이터
    5. 데이터 배열
      1. 단순 배열
      2. 다차배열
      3. 문자 배열
    6. 구조체와 유니온 데이터
      1. 구조체 (Structure)
      2. 유니온 (Union)
    7. 나열형 데이터
  4. 포인터
    1. 기본 포인터
    2. 배열 포인터
    3. 구조체 포인터
    4. 함수 포인터
    5. 확장된 포인터 개념
    6. 특별한 데이터 타입
  5. 데이터 타입 정의 방법
  6. 데이터 타입 정리 표
  7. 데이터 타입 연습

연산자

+/-
  1. C 관점에서의 연산자
  2. 산술 연산자
  3. 비교 연산자
  4. 논리 연산자
  5. 비트 연산자
  6. 대입 연산자
  7. 단항 연산자
  8. 삼항 연산자
  9. 타입 캐스팅
  10. 나머지 연산자
  11. 저장방법의 지정
  12. 연산식과 연산자 우선순위
  1. 함수에 대하여
  2. C에서의 함수 작성법
    1. 일반적인 방법
    2. 재귀 함수
    3. 정적 함수
  3. C 함수의 사용
  4. C 표준 라이브러리에서의 함수
  5. 가변 길이의 매개변수 리스트
  1. 조건분기 제어
  2. 반복 제어
  3. 기타 제어문

각주

+/-
  1. 어떤 컴퓨터 언어를 배우는 첫 부분에는 항상 그 언어가 어떤 과정을 거쳐서 만들어졌는지를 이야기 합니다. 사실 필요 없어 보이는 내용을 굳이 다루는 이유는, 컴퓨터 언어가 목적을 분명하게 갖고 만들어지기 때문입니다. 다시 말해서 해당 언어가 만들어진 이유와 과정을 보면 어떤 경우에 사용하면 좋을 언어인지를 조금 더 잘 정의할 수 있기 때문에 다루는 것 입니다. 비록 최근의 언어들은 말 그대로 범용의 목적을 가지고 만들어 지긴 하지만, 그래도 역시 해당 언어가 더 유리한 부분과 불리한 부분은 있기 마련입니다.