23
Last Updated: July 21, 2008 [email protected] 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍 언어 들어가기 본 문서는 C언어를 처음 배우는 학생들을 위해 프로그래밍을 위한 기본배경 지식을 제공하고 앞으로 의 C언어 학습방향을 제시하고자 작성되었습니다. 새로운 용어도 많이 나오고 또 한편으로는 이미 다 알고 있는 내용일 수 있습니다만, 그냥 넘기지 마시고 차근차근 꼼꼼하게 곱씹어 읽어보기를 바랍니 다. 컴퓨터의 기계적인 장치를 하드웨어(hardware)라고 하고, 게임과 같이 컴퓨터에서 사용하는 프로그램을 소프트웨어(software)라고 합니다. 여기서 말하는 프로그램 컴퓨터 프로그램 이란 컴퓨터가 알아들을 있는 명령들의 모음말합니다. 컴퓨터는 여러분이 이미 알다 시피 01만을 처리할 있습니다. 01표현된 하나의 명령은 다음과 같은 형태를 집니다. 00100001 도대체 없는 01나열이지요? 이들은 멋대로 나열된 것이 아니라 컴퓨터가 이해 있도록 미리 정해둔 약속에 의해 나열되었습니다. 어떤 약속에 따라 문자를 나열하는 것을 코드화(encoding)한다고 합니다. 이렇게 코드화된 것을 코드(code)라고 합니다. 컴퓨터 바로 알아들을 있도록 만들어 놓은 위와 같은 코드를 실행코드(execution code) 또는 기계어코드(machine code)라고 합니다. , 컴퓨터가 실제로 수행할 있는 코드라는 의미 입니다. 한편, 01로만 구성된 코드를 이진코드(binary code)라고도 합니다. 그리고, 컴퓨터의 처리 단위는 컴퓨터가 한번에 처리할 있는 이진코드의 길이입니다. 위의 경우 018지요? 따라서, 코드는 8비트 컴퓨터의 실행코드라고 말할 있습니다. 이제, 컴퓨터에게 어떤 일을 시키고자 한다면 관련 실행코드를 일의 순서에 따라 차례대로 나열해 주면 됩니다. 그러나, 컴퓨터가 이해할 있는 실행코드가 얼마 되지 않더라도 사람 이를 기억하고 실수 없이 나열해 주기란 매우 어렵습니다. 제대로 나열한다고 할지라도 나중에 다시 살펴보았을 무슨 일을 하는 실행코드인지 쉽게 알아볼 없습니다.

C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 [email protected] 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

Last Updated: July 21, 2008

[email protected]

이 문서의 무단 복제를 허용하지 않습니다.

C 프로그래밍 언어 들어가기

본 문서는 C언어를 처음 배우는 학생들을 위해 프로그래밍을 위한 기본배경 지식을 제공하고 앞으로

의 C언어 학습방향을 제시하고자 작성되었습니다. 새로운 용어도 많이 나오고 또 한편으로는 이미 다

알고 있는 내용일 수 있습니다만, 그냥 넘기지 마시고 차근차근 꼼꼼하게 곱씹어 읽어보기를 바랍니

다.

컴퓨터의 기계적인 장치를 하드웨어(hardware)라고 하고, 게임과 같이 컴퓨터에서 사용하는

프로그램을 소프트웨어(software)라고 합니다. 여기서 말하는 프로그램 즉 컴퓨터 프로그램

이란 컴퓨터가 알아들을 수 있는 명령들의 모음을 말합니다. 컴퓨터는 여러분이 이미 알다

시피 0과 1만을 처리할 수 있습니다. 0과 1로 표현된 하나의 명령은 다음과 같은 형태를 가

집니다.

00100001

도대체 알 수 없는 0과 1의 나열이지요? 이들은 멋대로 나열된 것이 아니라 컴퓨터가 이해

할 수 있도록 미리 정해둔 약속에 의해 나열되었습니다. 어떤 약속에 따라 문자를 나열하는

것을 코드화(encoding)한다고 합니다. 이렇게 코드화된 것을 코드(code)라고 합니다. 컴퓨터

가 바로 알아들을 수 있도록 만들어 놓은 위와 같은 코드를 실행코드(execution code) 또는

기계어코드(machine code)라고 합니다. 즉, 컴퓨터가 실제로 수행할 수 있는 코드라는 의미

입니다.

한편, 0과 1로만 구성된 코드를 이진코드(binary code)라고도 합니다. 그리고, 컴퓨터의 처리

단위는 컴퓨터가 한번에 처리할 수 있는 이진코드의 길이입니다. 위의 경우 0과 1이 총 8개

지요? 따라서, 위 코드는 8비트 컴퓨터의 실행코드라고 말할 수 있습니다.

이제, 컴퓨터에게 어떤 일을 시키고자 한다면 관련 실행코드를 일의 순서에 따라 차례대로

나열해 주면 됩니다. 그러나, 컴퓨터가 이해할 수 있는 실행코드가 얼마 되지 않더라도 사람

이 이를 기억하고 실수 없이 나열해 주기란 매우 어렵습니다. 제대로 나열한다고 할지라도

나중에 다시 살펴보았을 때 무슨 일을 하는 실행코드인지 쉽게 알아볼 수 없습니다.

Page 2: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

이러한 문제를 해결하기 위해 처음 만든 프로그램이 어셈블러(assembler) 입니다. 어셈블러

는 각 명령에 대응되는 문자기호를 기계어코드로 변경해 줍니다. 따라서, 사람은 암호와 같

은 숫자로 이루어진 실행코드를 직접 작성하지 않고, 사람이 쉽게 이해할 수 있는 문자기호

를 사용하여 비교적 쉽게 명령을 나열할 수 있습니다. 이렇게 어셈블러가 이해할 수 있는

문자기호로 작성된 코드를 어셈블코드(assemble code)라고 합니다. 위의 이진코드가 덧셈에

대한 코드였다고 가정해 봅시다. 덧셈에 대한 문자기호는 ADD입니다. 이에 대한 어셈블코

드는 아래와 같습니다.

ADD 1

이 코드의 의미는 현재 컴퓨터가 가지고 있는 값에 1을 더하라는 뜻입니다. 좀더 구체적으

로 이야기하면 다음과 같습니다. 먼저 컴퓨터의 머리에 해당하는 중앙처리장치(CPU; Central

Processing Unit)는 다시 세 부분으로 나뉩니다. 제어장치, 연산장치, 레지스터(register) 가 그

것입니다. 이중 레지스터는 어떤 값을 일시적으로 저장해 두는 장치입니다. 이러한 저장장치

는 여러 개가 존재하는데 그 중 하나가 연산장치에 의해 계산된 결과가 일시적으로 저장(기

록)되는 누산기(Accumulator; 값을 쌓아두는 장치)라는 레지스터이며 영문의 처음 두 글자를

따서 AC라고 합니다. 따라서, 위 어셈블코드는 AC에 있는 값에 1을 더하는 명령입니다. 그

리고, 이 명령은 연산장치가 담당합니다. 그럼 연산의 결과는 어디에 다시 쌓아둘까요? 예

바로 AC에 저장해 둡니다. 방금 설명한 내용을 프로그램 언어에서 널리 사용되는 수식으로

표현하면 다음과 같습니다.

AC = AC + 1

수학에서 보았던 = 기호는 왼쪽과 오른쪽이 같다라는 것을 의미합니다만, 프로그램 언어에

서는 다른 의미로 사용됩니다. 이 기호를 기준으로 오른쪽의 계산결과를 왼쪽 저장장치에

넣어라, 기록하라, 할당하라 라는 의미입니다. 예들 들어, 현재 AC에 2가 들어있었다면 다음

과 같은 절차로 계산이 이루어 집니다.

0단계) AC = AC + 1

1단계) AC = 2 + 1

2단계) AC = 3

먼저 0단계에서, AC + 1을 계산하기 위해 AC가 그 안에 들어있던 값인 2로 대치됩니다. 1단

계에서 2 + 1이 계산되어 3이 됩니다. 2단계에서 = 기호의 의미인 오른쪽의 계산결과를 왼쪽

저장장치에 넣습니다. 즉, 3을 AC에 넣습니다.

Page 3: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

여기서, 한가지 더 짚고 넘어가겠습니다. AC = AC + 1을 수식(expression)이라고 했는데, 수

식은 크게 3가지로 구성됩니다. 먼저 AC를 살펴봅시다. AC는 저장장치라고 하였습니다. 여

기에서는 처음에 2가 들어있었는데, 최종 계산이 이루어지고 나면 3으로 변경됩니다. 즉, 2가

저장될 수도 있고 3이 저장될 수 도 있습니다. 물론 다른 숫자도 가능하겠지요. 컴퓨터 장치

에서는 이처럼 값을 저장하는 장치를 레지스터라고 하였지만, 컴퓨터 프로그래밍 언어에서

이러한 기능을 수행하도록 약속해 놓은 것이 바로 변수(variable)입니다. 변수는 말 그대로

값이 변하는 수 입니다. 위 예에서는 2에서 3으로 변했죠?

자 이제 = 와 + 에 대해 알아보겠습니다. 이들은 어떤 계산을 하라고 약속된 기호로서 연

산자라고 합니다. 계산을 한자어로 연산이라고 하고 연산을 하는 녀석/놈이란 뜻으로 연산

자라고 이름 지어 졌습니다. + 연산자는 덧셈을 하는 역할이었죠? 이미 수학에서 정한 약속

이랑 같아 혼동될 걱정이 없습니다. 그러나, = 연산자는요? 수학에서 정한 약속이랑 다르죠?

연산자를 기준으로 오른쪽의 계산결과를 왼쪽 저장장치에 넣어라 라는 역할이었습니다. 참

고로, 연산자의 왼쪽, 오른쪽에서 쪽이라는 말 대신 항, 영어로는 오퍼랜드(operand)라는 말

을 씁니다. 연산자에 대한 영어표현은 오퍼레이터(operator)입니다. 마지막으로 수식에서 사

용된 1에 대해 생각해 봅시다. 1은 그냥 1이지요? 이게 2가 되고 3이 되나요? 아닙니다. 1은

그냥 1이지 절대 변하지 않습니다. 이렇게 변하는 않는 값을 상수라고 합니다. 상은 한자어

로 항상 또는 변하지 않는 이란 뜻을 가지고 있습니다. 자! 이제 정리해 봅시다. 수식은 계

산이 가능하도록 변수, 상수, 연산자로 구성되어 있습니다.

이제 컴파일러(complier)라는 프로그램에 대해 설명하고 합니다. 위 예에서 AC = AC + 1 이

어셈블 코드 ADD 1 보다 이해하기 쉽나요? 예 그렇습니다. AC = AC + 1은 연산자에 대한

역할만 알고 있다면 쉽게 이해할 수 있습니다. 이와 같이 수식을 포함하여 사람이 이해하기

쉬운 코드로 프로그램을 작성한다면 무척 편리하겠지요? 대신 이렇게 작성된 코드, 이것을

소스코드(source code)라고 하는데 이는 컴퓨터가 전혀 이해할 수 없습니다. 따라서, 사람이

이해하기 쉬운 소스코드를 컴퓨터가 이해할 수 있는 기계어 또는 실행코드로 변환해 주는

작업이 필요합니다. 컴파일러는 이러한 작업에 관여합니다. 주의할 것은 컴파일러가 소스코

드를 곧바로 기계어 코드로까지 변환해 주지는 않는다는 점입니다. 같은 기능을 수행하더라

도 기계어 코드는 컴퓨터의 종류에 따라 제각기 달리 작성되어야 합니다. 서로 다른 종류의

CPU는 명령의 개수와 명령의 형태가 다르기 때문입니다. 마치, 똑 같은 일을 한국사람과

미국사람에게 시킬 때 한국 사람에겐 국어로 미국사람에겐 영어로 말해줘야 하듯이 말입니

다. 최종 기계어코드를 만드는 것은 각각의 컴퓨터에 맞게 만들어진 링커(linker)라는 프로그

램이 담당합니다. 따라서, 컴파일러는 링커가 작업을 용이하게 할 수 있는 형태로까지만 만

들어 줍니다. 이러한 코드를 목적코드(object code)라고 합니다. 컴파일러는 소스코드를 분석

하여 잘못 사용된 명령이 없는지를 검사합니다. 만약 잘못 사용된 명령이 있으면 목적코드

를 만들지 않습니다.

Page 4: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

이제 프로그램 작성단계에 대해 설명합니다. 컴퓨터 프로그램을 작성하기 위해 사용되는 언

어를 프로그래밍 언어라고 합니다. 용도에 따라 다양한 프로그래밍 언어가 개발되었습니다.

그 중 가장 널리 사용될 수 있는 즉, 범용성이 큰 언어가 C라는 언어입니다. 이 언어의 문

법에 맞추어 소스코드를 작성하면 이 소스코드를 분석할 수 있는 C 컴파일러가 이를 목적

코드로 만들고, 다시 링커가 실행코드를 만듭니다. 여기서, 실행코드는 일반적으로 얘기하는

프로그램입니다. 워드 프로그램, 게임 프로그램 이런 식으로 말이죠. 그리고, 각각의 코드는

파일로 컴퓨터에 저장합니다. 컴퓨터 파일은 다음과 같은 형식을 가집니다.

파일이름.확장자

확장자는 파일의 종류를 구분하는데 주로 사용됩니다. C언어로 작성한 소스코드는 확장자로

C를 붙여 구분합니다. 일반적인 목적코드의 확장자는 OBJ이고 윈도우 계열에서 실행코드의

확장자는 EXE를 가집니다.

소스코드를 목적코드로 변환하는 프로그램은 컴파일러, 목적코드를 소스코드로 변환하는 프

로그램은 링커라고 하였습니다. 그럼 소스코드는 어떻게 작성할까요? 소스코드는 사람이 알

아볼 수 있는 형태입니다. 보통의 문서편집기에서 작성하면 됩니다. 메모장 같은 프로그램

말이죠. 실제로 문서편집기 따로, 컴파일러 따로, 링커 따로 가지고 프로그램을 작성하면 그

과정이 번거롭습니다. 따라서, 이들을 하나로 통합한 프로그램이 있는데, 이를 통합개발환경

(IDE; Intergrated Development Environment) 이라고 부릅니다. 대표적인 통합개발환경으로

는 비주얼 스튜디오(Visual Studio)라는 프로그램이 있습니다. 이 프로그램을 이용하면 편리

하게 프로그램을 작성할 수 있습니다. 소스코드 작성과 저장, 컴파일러 기능, 링커 기능을

한자리에서 이용할 수 있습니다.

[노트] 위에서 굵은 줄로 표시된 용어를 다시 한번 살펴보면서 지금까지의 내용을 정리해 보

세요.

프로그램 작성

자! 이제 프로그램을 작성해 보겠습니다. 프로그래밍을 하기 위한 최소한의 규칙을 알아봅

니다. 컴퓨터는 계산을 잘 한다고 하니 계산을 한번 시켜보겠습니다.

다음과 같이 1+2를 메모장에 입력하세요. 여기서는 메모장을 소스코드를 입력하기 위한 편

집기로 사용하겠습니다. 물론 통합개발환경에서 바로 할 수도 있지만, 일단은 소스코드 편집,

컴파일, 링킹 과정을 살펴보기 위해 이것의 사용은 잠시 미루겠습니다.

Page 5: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

이 소스코드는 D 드라이브의 C 디렉토리(폴더)에 저장되어 있다고 합시다.

D:\C\a.c

이 소스코드에 대해 컴파일과 링크를 시켜보겠습니다. 윈도우 시작메뉴에서 실행메뉴를 실

행시키면 다음과 같은 화면이 나옵니다.

여기서, cmd 라고 입력하고 확인 버튼을 눌러 콘솔 창을 하나 띄웁니다. 그리고, 다음 화면

과 같이 디스크를 d로 변경하고, 이어서 디렉토리를 c로 변경한 후 dir 명령을 통해 디렉토

리의 파일을 출력하도록 합니다. a.c 파일을 확인할 수 있습니다.

Page 6: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

자 컴파일을 해보겠습니다. 여기서 사용할 컴파일러는 마이크로 소프트사가 제공하는

C/C++ 컴파일러입니다. 이 프로그램의 이름은 CL.EXE 입니다. 비주얼 스튜디오를 설치할

때 함께 설치됩니다. 이 컴파일러 프로그램은 다음 디렉토리에 있습니다.

C:\Program Files\Microsoft Visual Studio\VC98\Bin

이미 비주얼 스튜디오를 설치할 때 경로가 등록되어 있어 현재 디렉토리에서 바로 실행시킬

수 있습니다. 다음과 같이 명령을 주면 컴파일이 됩니다.

컴파일러는 편집기에 저장된 명령을 차례대로 한 줄씩 차례대로 분석합니다. 그러나, 오류가

발생하죠? 에러 메시지에서 “a.c(1)”의 괄호 안의 숫자는 에러가 발생한 소스코드의 줄 번호

입니다. “syntax error”는 에러의 종류로써 문법오류가 발생했다는 의미입니다. 즉, 2+1은 규

칙에 맞지 않는 코드라는 말입니다. 지금부터 아주 기본적인 규칙을 몇 가지 말씀 드리겠습

니다.

하나의 명령은 하나의 명령문장, 줄여서 명령문으로 이루어 집니다. 명령문은 수식 뒤에 ;

Page 7: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

(세미콜론)을 붙여서 만듭니다.

이 규칙에 의하면 코드는 다음과 같이 수정되어야 합니다.

1 + 2;

그러나, 이 역시 컴파일 에러가 발생합니다. 다음과 같은 규칙을 더 적용해야 합니다.

일련의 일을 수행하기 위한 명령들은 하나로 묶어줍니다. 이때 명령들을 묶기 위한 기호로

{ }을 사용합니다. 이렇게 묶여진 것을 블록이라고 합니다. 블록은 여러 개의 문장으로 구성

될 수 있습니다.

이 규칙을 적용하면 코드는 다음과 같이 수정되어야 합니다.

{ 1 + 2; }

그러나, 이 역시 다음과 같은 컴파일 에러를 발생합니다.

이전과는 다른 에러 메시지가 발생했습니다. “missing function header?” 메시지는 함수

(function)의 이름(header)이 빠진 것 아니냐라는 말입니다. 실제로 에러를 없애기 위해서는

다음과 같은 규칙을 더 적용해야 합니다.

각 블록은 이름을 가질 수 있습니다. 부여 방법의 다음과 같습니다. 그리고 이렇게 이름이부

여 된 블록을 함수라고 합니다.

블록이름 () { }

이 규칙을 적용하면 코드는 다음과 같이 수정되어야 합니다. 여기서 함수이름은 func 라고

하였습니다.

Page 8: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

func() { 2 + 1; }

그러나, 이 역시 다음과 같은 컴파일 에러를 발생합니다.

사실 CL.EXE는 컴파일과 링킹을 동시에 수행합니다. 프로그램의 이름이 이를 말해 줍니다.

함수의 이름을 부여하자 컴파일은 이상 없이 수행되었습니다. 실제로 dir을 통해 디렉토리

를 확인해 보면 a.obj 파일이 생성되었음을 확인할 수 있습니다.

사실 링커는 운영체제가 제공합니다. 운영체제가 제공하는 링커의 이름은 LINK.EXE입니다.

다음과 같이 LINK.EXE를 실행하면 CL.EXE에서 보았던 동일한 에러 메시지를 출력합니다.

Link.exe a.obj

Page 9: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

이 에러 메시지는 프로그램의 시작지점(entry point)이 정의되지 않았다는 말이다. C 프로그

램은 여러 개의 함수로 구성될 수 있는데, 프로그램 시작 시 어느 함수부터 실행할지를 지

정해 주어야 합니다. 여기서는 함수가 하나밖에 없지만 그래도 반드시 시작 함수를 지정해

주어야 합니다. 이를 위한 규칙은 다음과 같이 제정되었습니다.

프로그램은 하나 이상의 함수로 구성되고, 프로그램을 시작하는 함수로써 그 이름이 main

인 함수를 반드시 포함해야 합니다.

main() { }

따라서, 함수이름을 func에서 main으로 수정해야 합니다. 최종 완성된 소스코드는 다음과

같습니다. 보기 좋게 하기 위해 다음과 같이 편집합니다. C 컴파일러는 하나 이상의 공백은

하나로 처리하기 때문에 상관없습니다.

main()

{

2 + 1;

}

이제 CL.EXE를 통해 컴파일과 링킹을 수행하면 a.obj와 a.exe가 생성됩니다. 작성한 프로그

램을 실행시키는 방법은 a.exe또는 a를 입력하면 됩니다. 다음 화면을 보세요. 실제로 프로

그램을 실행시키면 허무하게도 아무것도 나타나지 않습니다.

Page 10: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

프로그램은 2+1을 계산하여 3을 도출해 내었지만, 우리는 알 수 없습니다. 어떻게 할까요?

바로 계산된 결과는 기록해 두었다가 그 값을 보이라고 명령을 내리면 되겠죠? 계산된 결과

를 기록하기 위한 것은 변수라고 앞에서 설명하였습니다. C 언어에서 변수를 사용하기 위해

서는 다음과 같이 합니다.

main()

{

int a;

a = 2 + 1;

}

변수선언

int a; 라는 문장은 변수를 선언하는 문장입니다. 줄여서 선언문이라고 합니다. a라는 기록장

치 (CPU에서 이와 같은 기능을 하는 것이 레지스터였죠)를 하나 만드는 것이라고 보면 됩

니다.

C 언어에서는 변수를 사용하기 전에 반드시 변수를 먼저 선언해 주어야 합니다.

문자코드

이제 a라는 변수에 3이 기록되어 있습니다. 이를 확인하는 방법은 변수 a에 기록된 값 (줄

여서 a값)을 화면에 출력하라는 명령문을 그 다음 줄에 작성해 주면 됩니다.

printf("%d", a);

Page 11: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

다소 복잡해 보입니다. 이렇게 어려운 형태를 가져야 하는 이유는 다음과 같습니다.

2 + 1의 계산결과 3은 숫자입니다. 3이라는 숫자를 화면에 출력할 때는 3의 모양을 가진 점

을 찍어야 합니다. 3의 모양을 가진 점으로 구성된 것은 숫자 3이 아니라 문자 3입니다. 컴

퓨터는 숫자만 가질 수 있는데, 이러한 문자는 어떻게 표현할 수 있을까요?

바로, 숫자와 문자를 대응시켜 놓은 문자표를 만듭니다. 즉, 1은 A 2는 B 이런 식으로 밀이

죠. 이때 서로 다른 문자표를 사용하면 문제가 생깁니다. 문자표를 통일해 놓은 것이 ASCII

입니다. ASCII 코드 표에서 65 = A, 66 = B, 48=0, 49=1 이런 식 약속되어 입니다.

화면에 찍히는 모양은 아스키 코드에 대응시켜 미리 만들어 놓은 글자가 됩니다. C언어에는

주어진 아스키 코드에 대응되는 글자를 출력하는 명령이 제공됩니다. 바로, putchar() 입니다.

예들 들어, putchar(65); 를 하면 A가 출력됩니다. 따라서 문자 3을 출력하기 위해서는

puchar(51); 수행해야 합니다.

51이란 아스키 값을 기억할 수 없으므로 다음과 같이 간단하게 계산을 통해 얻어낼 수 있습

니다.

Page 12: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

3 + '0'

위 계산 프로그램에서 결과를 확인하기 위하여 putchar()를 이용한 코드는 다음과 같습니다.

main() {

int a;

a = 2 + 1;

a = a + '0';

putchar(a);

}

printf("%d", a); 는 편리하게도 이러한 과정을 한번에 처리해 줍니다. 여기서 d는 10진수

(decimal)라는 뜻입니다. 즉, a 변수 값을 10진수 숫자 문자로 변환해서 출력하라는 것입니다.

라이브러리

putchar(), printf() 와 같은 명령문을 함수라고 합니다. 소괄로를 가지고 있고, 소괄로 안에

적절한 값을 넣을 수 있습니다. 소괄로로 보면 지금 작성하고 있는 main()도 함수입니다.

main() 이라는 함수의 역할을 나열하고 있는 것입니다. 그렇다면, putchar(), printf() 의 역할

은 (동작방식은) 어디에 나열되어 있을까요? 이와 같이 미리 만들어져 제공되는 함수를 라

이브러리 함수라고 합니다. 이 라이브러리 함수를 사용하려면 소스코드의 맨 위에 다음 코

드를 넣어줍니다.

"#include <stdio.h>"

이때 다른 문장과는 달리 세미콜론은 붙이지 않습니다. 라이브러리는 하나만 있는 것이 아

니라 여러 개가 있는데, 하나의 라이브러리는 여러 개의 함수를 제공합니다. 예들 들어,

atoi() 라는 함수를 사용하려면 stdlib.h 를 포함해야 합니다. 이러한 것은 차차 배웁니다. io

관련된 라이브러리 외의 것은 여러분이 직접 작성할 수 있습니다.

통합개발환경: 비주얼 스튜디오

이번에는 비주얼 스튜디오를 사용하여 소스코드 작성, 컴파일, 디버깅을 한자리에서 처리해

봅니다. 먼저 비주얼 스튜디오를 실행시킵니다.

Page 13: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

File 메뉴에서 New를 클릭하여 다음 화면을 띄웁니다.

여기서는 작성하고자 하는 프로그램을 관리하는 프로젝트의 종류를 결정합니다. 화면왼쪽에

서 Win32 Console Application을 선택합니다. 프로젝트 생성위치(Location)은 “D:”로 입력합

니다. 그리고 나서 프로젝트 이름(Project name)에 “C”를 입력합니다. 그러면, 프로젝트 생성

Page 14: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

위치가 “D:”에서 “D:\C”으로 자동 변경됩니다. 입력이 완료되면 OK버튼을 눌러 다음 화면

으로 넘어갑니다.

여기서는 작성할 프로그램의 기본 틀을 결정합니다. 설명을 위해 맨 위의 An empty project

를 선택합니다. 이후 과정은 특별한 사항이 없으므로 바로 Finish 버튼을 누릅니다. 그러면,

다음 화면과 같이 생성한 프로젝트의 정보를 요약해 줍니다.

Page 15: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

여기서 OK 버튼을 누르면 다음과 같은 화면이 나옵니다.

그리고 이와 동시에 프로젝트와 관련해서 D:\C 디렉토리에 다음 파일들이 생성됩니다.

Page 16: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

\Debug

C.dsp

C.dsw

C.ncb

Debug 디렉토리는 이 프로젝트에서 컴파일과 링킹을 시켰을 때 생성되는 목적파일과 실행

파일을 저장합니다. C.dsw는 프로젝트 파일로 비주얼 스튜디오에서 사용합니다.

이번에는 소스코드를 입력할 파일을 프로젝트에 추가해 보겠습니다. Project – Add To Project

– New 메뉴를 클릭합니다. 그러면 프로젝트에 추가시킬 파일의 종료와 파일명을 입력할 수

있는 다음 화면이 나옵니다.

여기서, 파일의 종류는 C++ Source File을 선택합니다. 파일의 이름은 여러분이 원하는 이름

을 입력하면 됩니다. 여기서는 “A” 라고 입력하였습니다. OK 버튼을 누르면 다음과 같이

A.C 파일이 열리면서 편집가능 상태가 됩니다.

Page 17: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

비주얼 스튜디오 윈도우의 타이틀에 있는 [A.CPP]는 현재 편집을 선택된 파일을 표시합니

다. 화면의 오른쪽에 다음과 같이 소스코드를 입력합니다.

저장버튼을 이용해 이 코드를 저장합니다. 그리고, 컴파일과 링크를 시킵니다. 프로젝트를

Page 18: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

생성한 후 처음으로 컴파일을 시키고자 할 때는 먼저 빌드(build)를 시키도록 되어 있습니다.

Build – Build C.exe 메뉴를 클릭합니다. 이후부터는 Build – Compile 메뉴를 클릭하여 개별

파일을 컴파일 할 수 있습니다.

빌드 창에 컴파일과 링킹과정에 대한 메시지를 보여줍니다. 여기서 main 함수에 대한 경고

(warning) 메시지가 출력되었으나 컴파일과 링킹과정에는 문제가 없습니다. 이 경고 메시지

까지 없애주고자 한다면 다음과 같이 코드를 수정합니다. 이 코드에 대해서는 나중에 설명

합니다.

Page 19: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

코드를 수정하고 Build – Compile, Build – Build를 클릭하거나, 이들을 한꺼번에 처리하는

Build – Rebuild All 메뉴를 클릭합니다. 아무 문제없이 컴파일과 링킹이 수행되면 Debug 디

렉토리에 A.OBJ 및 A.EXE가 생성됩니다. 참고로, 컴파일, 빌드, 실행은 메뉴 대신 다음 툴

을 사용하면 편리합니다. 왼쪽부터 컴파일, 링크, 실행입니다.

생성된 실행파일을 실행하기 위해서는 콘솔에서 A를 입력하거나, 탐색기에서 이를 더블 클

릭하면 됩니다만, 여기서는 비주얼 스튜디오에서 바로 확인하도록 하겠습니다. Build –

Execute를 클릭합니다. 그러면 다음과 같이 프로그램을 실행시키는 콘솔 창이 하나 뜹니다.

Page 20: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

프로그램 수행결과인 3이 출력되고 바로 뒤이어 비주얼 스튜디오가 생성한 Press any key to

continue 라는 메시지가 출력됩니다. 여기서 아무 키나 누르면 이 창은 사라집니다.

마지막으로 프로젝트에 파일이 여러 개인 경우 원하는 파일을 열기 위해서는 다음과 같이

합니다.

Page 21: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

화면의 왼쪽에서 FileView 탭을 클릭하면 위와 같이 프로젝트에 포함된 파일을 나열할 수

있습니다. 이때 원하는 파일명을 더블 클릭하면 오른쪽 화면에 해당 파일이 열립니다.

C 프로그래밍에 대하여 (부연설명박스)

C 프로그래밍은 함수로 구성된다고 하였습니다. 함수는 블록에 이름을 부여한 것입니다. 블

록은 문장들로 구성됩니다. 문장은 수식에 세미콜론을 붙여 만듭니다. 수식은 변수, 상수, 연

산자의 의미 있는 조합입니다.

변수, 상수, 연산자 수식 문장 블록 함수 (소스코드) 프로그램

프로그램 언어에는 수식에 세미콜론을 붙여 만든 수식문 뿐 아니라 조건에 따라 서로 다른

문장을 처리할 수 있는 조건문, 문장들을 반복 처리할 수 있는 반복문이 있습니다. 이들 중

프로그램의 핵심은 역시 수식문입니다. 조건문, 반복문은 너무나 간단해서 한번만 보면 그

사용규칙을 알 수 있습니다. 그러나, 수식문은 변수, 상수, 연산자에 대한 추가적인 지식을

요구합니다. 이제 여러분은 제대로 된 수식문을 작성하기 위해 변수, 상수, 연산자에 대해

살펴보아야 합니다.

프로그램의 핵심은 수식문입니다. 왜냐하면 프로그램은 어떤 변수 값을 프로그래머가 원하는

값으로 변경해 나가는 과정이기 때문입니다. 다음 예를 보겠습니다.

여러분이 창고A에 있는 상자 100개를 창고B로 모두 옮기는 일을 한다고 가정해 봅시다. 상

자 옮기는 작업은 다음과 같은 과정을 거칠 것입니다.

1단계: 창고A에서 창고B로 상자를 하나 옮긴다.

2단계: 창고B에 상자가 100개가 되었는지 검사한다.

3단계: 100개이면 일을 멈추고, 그렇지 않으면 다시 1단계를 반복한다.

이 일을 일반적인 프로그램 언어의 형식, 즉 유사코드(pseudo code)로 표현하면 다음과 같습

니다.

B = 0; // 창고B에 상자가 하나도 없음을 표현

START: B = B + 1; // 창고B로 상자를 하나 옮겨놓는 것 표현

IF (B == 100) // 창고B에 상자가 100개인지를 검사하여

STOP; // 참이면 프로그램 종료

ELSE

Page 22: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

GOTO START; // 거짓이면 START 지점부터 다시 수행

프로그램의 시작단계에 변수 B의 값은 0 이었습니다. 그러나, 프로그램이 종료되었을 때는

100 이 됩니다. 이것으로 볼 때 프로그래밍은 다음과 같이 설명할 수 있습니다.

프로그래밍은 수식문, 조건문, 반복문을 의미 있게 조합하여 변수 값을 원하는 값으로 바꾸

는 과정이다.

물론 이때 B의 초기값을 키보드를 통해 입력 받거나, 프로그램 수행 중에 B의 값을 출력할

수도 있습니다. 그러나, 이러한 입출력 기능은 프로그램의 핵심이 될 수는 없습니다. 사견이

지만 이러한 이유로 C 언어를 처음 배울 때 입출력 문장 습득에 에너지를 쏟을 필요는 없

다고 생각합니다. 같은 이유로, 즉 콘솔에서 출력되는 것이 화려하지 못하다고 해서 C 언어

를 무시해서는 안됩니다. 화려한 출력은 기껏해야 계산된 결과를 표현하는 것에 불과하니까

요.

다음과 같이 프로그래밍을 추상적으로도 정의할 수 있습니다.

프로그래밍은 현실세계를 컴퓨터에서 흉내 내는 과정이다.

이때, 필요한 도구가 바로 수식문, 반복문, 조건문입니다. 이들 문장만 제공되면 현실세계를

컴퓨터에서 표현할 수 있습니다. 사실 모든 프로그램 언어는 이들 세가지 문장을 제공합니

다. C 언어는 수식문에 관한 문법이 비교적 까다롭습니다. 이것이 바로 C 언어를 배우기 어

렵게 합니다. 그러나, 반대로 얘기하면 수식문에 관한 문법만 이해하면 C 언어를 터득할 수

있습니다.

C 언어 학습에 대해 한 가지 더 말씀 드리겠습니다. C 언어는 대표적인 구조적 프로그래밍

언어입니다. C 언어에서 구조적 프로그래밍을 지원하는 문법은 바로 함수입니다. 따라서, 여

러분이 앞으로 배우는 수식관련 문법은 항상 함수와 연계해서 함께 공부해야 합니다. 예들

들어보겠습니다. 다음과 같이 하나의 이름으로 여러 개의 변수를 생성할 수 있는 문법으로

배열(array) (수식문 관련 문법 중 하나)이란 것이 있습니다.

main() {

int a[3]; /* 배열변수 a 선언 */

a[0] = 1; /* 배열변수 a의 첫 번째 변수에 1을 대입 */

a[1] = 2; /* 배열변수 a의 두 번째 변수에 2를 대입 */

a[2] = 3; /* 배열변수 a의 세 번째 변수에 3을 대입 */

Page 23: C 프로그래밍 언어 들어가기cvpr.kumoh.ac.kr/nonezero/c.pdfLast Updated: July 21, 2008 nonezerok@gmail.com 이 문서의 무단 복제를 허용하지 않습니다. C 프로그래밍

printf(“%d“, a[0]); /* 배열변수 a의 첫 번째 변수 사용 */

printf(“%d”, a[1]);

printf(“%d”, a[2]);

}

배열변수라는 새로운 변수형태가 있을 때 위와 같이 사용하는 것, 즉 배열변수의 선언과 배

열변수의 사용방법 습득에 그쳐서는 안됩니다. 다음과 같이 이를 함수와 연계해서 사용하는

방법도 함께 알아두어야 합니다.

show(int a[3]) {

printf(“%d“, a[0]);

printf(“%d”, a[1]);

printf(“%d”, a[2]);

}

main() {

int a[3]; /* 배열변수 a 선언 */

a[0] = 1; /* 배열변수 a의 첫 번째 변수에 1을 대입 */

a[1] = 2; /* 배열변수 a의 두 번째 변수에 2를 대입 */

a[2] = 3; /* 배열변수 a의 세 번째 변수에 3을 대입 */

show( a ); /* 배열변수 이름만 괄호 안에 넣었음에 주목 */

}

위 소스코드를 이 자리에서 명확하게 이해할 수는 없습니다. 다만, 실행결과는 둘 다 123으

로 쉽게 유추할 수 있습니다. 지금은 이 정도만 알아도 됩니다. 사실 배열변수가 들어간 위

코드를 명확하게 이해하기 위해서는 배열에 대해 그리고 함수에 대해 알아야 할 부분들이

몇 가지 있습니다. 앞으로 이런 부분들을 공부하면 됩니다.

이상으로 C언어 입문자를 위한 배경설명을 마칩니다. 이 문서가 C 언어를 처음으로 공부하

는 학생이 학습방향을 잡는데 조금이라도 도움이 되었기를 바랍니다.