모던 C 언어 프로그래밍 : IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

82
  • date post

    22-Jul-2016
  • Category

    Documents

  • view

    366
  • download

    6

description

하나이 시세이 지음 | 김범준 옮김 | 프로그래밍 & 프랙티스 시리즈_009 | ISBN: 9788998139681 | 25,000원 | 2014년 10월 29일 발행 | 316쪽

Transcript of 모던 C 언어 프로그래밍 : IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

모던 C 언어 프로그래밍:

IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

지은이 하나이 시세이

옮긴이 김범준

펴낸이 박찬규 엮은이 이대엽 디자인 북누리 표지디자인 아로와 & 아로와나

펴낸곳 위키북스 전화 031-955-3658, 3659 팩스 031-955-3660

주소 경기도 파주시 문발로 115 세종출판벤처타운 311호

가격 25,000 페이지 316 책규격 188 x 240mm

초판 발행 2014년 10월 30일

ISBN 978-89-98139-68-1 (13000)

등록번호 제406-2006-000036호 등록일자 2006년 05월 19일

홈페이지 wikibook.co.kr 전자우편 [email protected]

モダンC言語プログラミング

©Shisei Hanai 2013

Edited by ASCII MEDIA WORKS

First published in 2013 by KADOKAWA CORPORATION,Tokyo.

Korean translation rights arranged with KADOKAWA CORPORATION,Tokyo,through KCC.

이 책의 한국어판 저작권은 KCC를 통한 저작권사와의 독점 계약으로 위키북스가 소유합니다.

신 저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다.

이 책의 내용에 대한 추가 지원과 문의는 위키북스 출판사 홈페이지 wikibook.co.kr이나

이메일 [email protected]을 이용해 주세요.

모던 C 언어 프로그래밍:

IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

이 도서의 국립중앙도서관 출판예정도서목록(CIP)은

서지정보유통지원시스템 홈페이지(http://seoji.nl.go.kr)와

국가자료공동목록시스템(http://www.nl.go.kr/kolisnet)에서 이용하실 수 있습니다.

(CIP제어번호: CIP2014029581)

4

컴퓨터는 단순한 처리에 대해서는 인간의 능력을 훨씬 능가하는 속도로, 그리고 실수 없이 수행

할 수 있습니다. “애플리케이션 개발의 자동화”에 대해 이야기하자면 오래지 않은 과거에는 애

플리케이션 코드를 자동으로 생성하는 것을 의미했습니다. 가까운 미래에는 개발의 초기 단계

에서 설계서만 작성하면 코드의 구현을 모든 컴퓨터가 자동으로 수행한다는 꿈같은 이야기입니

다. 일부 사람들은 코드의 구현이란 “단순한 작업”이라고 믿어 의심치 않았습니다. 코드를 생성

하는 “공장”과 같은 존재가 인간이 작성한 설계서를 읽어가며 차례차례로 애플리케이션을 만들

어간다는 것입니다. 실제로 그런 일이 가능해진다면 애플리케이션 개발 방식은 크게 변했을 것

입니다. UML 시퀀스 다이어그램(처리의 흐름을 표현한 그림)을 사용하면 코드가 자동으로 생

성되는 도구가 인기를 끌었던 적도 있었습니다.

그러나 시퀀스 다이어그램을 작성하는 작업이 코드를 작성하는 작업보다 훨씬 번거롭다는 현

실을 사람들이 얼마 지나지 않아 깨닫게 됩니다. 프로그램으로 자동으로 변환할 수 있을 정도

의 섬세함과 정확도를 가진 설계서를 작성하는 작업은 프로그래밍 자체보다 훨씬 노력이 많이

듭니다. 실제로 애매한 요구사항을 코드로 구현하는 작업이라는 것은 절대로 간단한 것이 아

닙니다.

그럼 애플리케이션 개발의 자동화라는 것은 완전히 꿈같은 이야기일까요? 그렇지 않습니다. 개

발 작업의 과정 중에는 “단순 작업”이 얼마든지 포함돼 있습니다. “염색 가게의 흰옷”, “허약한

의사” 등의 속담을 이야기할 필요도 없이 애플리케이션 개발 현장이라는 곳은 의외로 전산화(자

동화)되지 않은 곳이 많습니다. 그러나 최근 들어 이러한 상황이 급변하고 있습니다. 애플리케

이션의 컴파일, 링크, 테스트 및 단말기에 설치하는 등의 작업을 자동화하는 기술이 지금 엄청

난 속도로 보급되고 있습니다. 말 그대로 애플리케이션 개발 공장이라고 할 수 있겠지요. 인간

이 코드를 작성, 혹은 수정하면 순식간에 빌드 및, 테스트가 자동으로 이뤄져 단말기에 설치되

기까지 합니다. 서버 측 애플리케이션을 개발하는 현장에서는 이제 이러한 방식이 상식으로 자

리 잡았고, 현장에 따라서는 하루에 100번 이상 새로운 애플리케이션이 새로 설치되고 있다고

합니다(GitHub는 2012년 8월 23일, 하루에만 175회의 디플로이를 실시했다고 합니다(https://

github.com/blog/1241-deploying-at-github).

서문

5

그 배경에는 엄청난 속도로 변화하지 않으면 살아남을 수 없다는 상황이 자리 잡고 있습니다.

이처럼 서버 애플리케이션이 치열한 경쟁에 노출돼 있기 때문에 조금이라도 정체된다면 순식간

에 경쟁에서 뒤처지게 됩니다. 한편, 이처럼 무서운 기세로 애플리케이션을 변경하면서도 품질

을 희생시킬 수는 없습니다. 여러분이 평소 사용하는 구글의 지메일이나 아마존 같은 서버 애플

리케이션의 품질을 떠올려 보십시오. 예전에 비해 품질이 떨어졌다는 느낌은 거의 받지 못할 것

입니다. 그 이유는 품질이 나쁘거나 혹은 조금이라도 반응이 느리거나 약간 사용하기 어렵다는

이유만으로 즉시 경쟁에서 밀려나며 시장에서 도태돼 버리기 때문입니다.

한편으로 임베디드 기기의 개발은 어떨까요? 물론 하루에 몇 번이나 새로운 애플리케이션(펌웨

어)를 배포하는 일은 없겠지만 요구되는 개발 속도는 해마다 빨라지고 있지는 않나요? 물론 품

질에 대한 요구는 서버 애플리케이션 이상일 것입니다(어쨌든, 임베디드 시스템은 개발 분야에

따라 버그가 사람의 목숨을 위협할 가능성도 있습니다). 즉, 상황은 서버 측 애플리케이션 개발

과 크게 다르지 않습니다. 그렇다면 서버 측에서 훈련되어 온 개발 방식은 임베디드 시스템에도

반드시 도움될 것입니다. 그렇긴 하지만 서버 측 애플리케이션과 임베디드 시스템 등에서 사용

하는 툴, 컴파일러를 비롯한 다양한 환경에는 서로 차이가 있습니다. 따라서 그 발상만을 그대

로 가져와봤자 적용되지 않는 경우가 많을 것입니다.

이 책은 서버 측에서 일반화돼 있는 설계 기법과 툴의 활용법, 개발 방법을 C 언어를 이용해 임

베디드 시스템 애플리케이션 개발에 적용할 수 있게 하나하나 설명할 것입니다. 이러한 내용에

관심이 있는 분들은 물론이거니와 옛날부터 사용해온 방법이 가장 좋고 새로운 방식 따위는 필

요 없다고 생각하는 분들도 꼭 한번 읽어주셨으면 합니다. 단순히 싫어서 사용하지 않는 것과

실제로 사용해본 후에 사용하지 않겠다고 판단하는 것에는 하늘과 땅만큼의 차이가 있습니다.

이 책에서 임베디드 시스템에 관한 내용을 다루고 있기는 하지만 위에서 언급한 사항은 임베디

드 업계 이외의 C 언어 프로그램을 개발하는 데도 어느 정도 적용될 것이라고 생각합니다. 임베

디드 업계 이외의 분야에서 활동하고 있는 프로그래머 분들도 꼭 읽어주셨으면 합니다.

마지막으로, 책 내용에 관해 자세한 검증 및 평가를 해주신 편집부의 가와사키 님, 제 아내 미키

코에게 이 자리를 빌려 감사의 말씀을 전합니다.

2013년 8월 하나이 시세이

서문

6

01

02

개요

1.1 지금, C의 열기가 뜨겁다!........................................................................................................................................11

1.2 C를 이용한 임베디드 시스템 개발의 특징..................................................................................................14

1.3 이 책의 목표.....................................................................................................................................................................16

1.3.1 C와 통합 개발 환경 .............................................................................................................................................16

1.3.2 C와 디자인 패턴 ...................................................................................................................................................18

1.3.3 C와 익스트림 프로그래밍....................................................................................................................................18

1.3.4 C와 모던 개발 스타일..........................................................................................................................................22

1.4 정리.........................................................................................................................................................................................24

개발 환경 구축

2.1 개요........................................................................................................................................................................................26

2.2 리눅스 도입......................................................................................................................................................................26

2.3 윈도우 PC용 환경 만들기......................................................................................................................................27

2.3.1 버추얼박스 설치....................................................................................................................................................28

2.4 리눅스 PC용 환경 구축하기.................................................................................................................................34

2.4.1 도입하기 전에........................................................................................................................................................34

2.4.2 설치 디스크 만들기..............................................................................................................................................35

2.4.3 주분투 설치............................................................................................................................................................40

2.5 이클립스 설치하기.......................................................................................................................................................47

2.5.1 자바 설치하기........................................................................................................................................................47

2.5.2 이클립스 설치하기................................................................................................................................................49

2.5.3 기타 툴 설치...........................................................................................................................................................52

7

03

2.6 이클립스의 기본 사용법..........................................................................................................................................53

2.6.1 Hello, world..........................................................................................................................................................53

2.6.2 리뷰..........................................................................................................................................................................58

2.6.3 프로젝트와 워크스페이스 그리고 퍼스펙티브..............................................................................................58

2.7 이클립스의 기능............................................................................................................................................................61

2.7.1 비주얼 디버거.........................................................................................................................................................61

2.7.2 탐색...........................................................................................................................................................................69

2.7.3 컨텐트 어시스트.....................................................................................................................................................73

2.7.4 매크로 확인.............................................................................................................................................................75

2.7.5 로컬 히스토리.........................................................................................................................................................76

2.7.6 TODO 주석.............................................................................................................................................................78

2.7.7 외부 에디터와의 연계...........................................................................................................................................78

2.8 정리..........................................................................................................................................................................................81

C 언어와 객체 지향

3.1 개요........................................................................................................................................................................................82

3.2 C의 모듈화와 객체 지향..........................................................................................................................................83

3.2.1 C와 모듈화.............................................................................................................................................................83

3.2.2 구조체를 이용한 자료 구조와 로직의 분리....................................................................................................85

3.2.3 C를 이용한 객체 지향.........................................................................................................................................90

3.2.4 객체 지향과 다형성...........................................................................................................................................101

3.2.5 상속.......................................................................................................................................................................102

3.2.6 캡슐화...................................................................................................................................................................105

3.2.7 가상 함수 테이블...............................................................................................................................................107

3.2.8 비가상 함수.........................................................................................................................................................109

3.3 정리.....................................................................................................................................................................................111

8

04

05

C 언어와 디자인 패턴

4.1 스테이트 패턴(State).............................................................................................................................................113

4.1.1 상태 다이어그램.................................................................................................................................................114

4.1.2 상태 변화표..........................................................................................................................................................119

4.1.3 객체 지향 스테이트 패턴..................................................................................................................................119

4.1.4 여러 개의 상태 집합이 관련된 경우..............................................................................................................123

4.1.5 스테이트 패턴과 메모리 관리.........................................................................................................................124

4.2 템플릿 메서드 패턴(Template)......................................................................................................................125

4.2.1 int 형이 아닌 값을 반환...................................................................................................................................130

4.2.2 그 외의 자원을 다룬다.....................................................................................................................................131

4.2.3 컨텍스트...............................................................................................................................................................139

4.3 옵저버 패턴(Observer).......................................................................................................................................146

4.4 책임 연쇄 패턴(Chain of Responsibility)..............................................................................................159

4.5 비지터 패턴(Visitor)...............................................................................................................................................162

4.5.1 객체에 type id를 갖게 하고 싶어지면 노란불 신호.................................................................................165

4.6 정리.....................................................................................................................................................................................169

C 언어와 리팩터링

5.1 개요.....................................................................................................................................................................................171

5.2 테스트 주도 개발.......................................................................................................................................................172

5.2.1 구글 테스트.........................................................................................................................................................173

9

06

5.3 TDD 입문편...................................................................................................................................................................174

5.3.1 이클립스 설정.....................................................................................................................................................174

5.3.2 첫 테스트 주도 개발..........................................................................................................................................179

5.3.3 static 함수 테스트.............................................................................................................................................185

5.4 리팩터링..........................................................................................................................................................................188

5.4.1 외부 인터페이스.................................................................................................................................................189

5.4.2 리팩터링과 투자.................................................................................................................................................190

5.5 TDD 실전편...................................................................................................................................................................190

5.5.1 몬스터 메서드.....................................................................................................................................................191

5.5.2 C 언어에 의한 모크화 방법.............................................................................................................................203

5.5.3 리팩터링을 완료한다........................................................................................................................................226

5.5.4 커버리지 확인.....................................................................................................................................................230

5.6 정리.....................................................................................................................................................................................234

지속적인 통합과 배포

6.1 개요.....................................................................................................................................................................................236

6.2 지속적인 통합의 전제.............................................................................................................................................237

6.2.1 소프트웨어 형상 관리(Software Configuration Management)........................................................237

6.2.2 빌드 툴..................................................................................................................................................................238

6.2.3 버그 추적 시스템(BTS)....................................................................................................................................239

6.3 CI 서버의 도입 ...........................................................................................................................................................239

6.3.1 젠킨스 플러그인 추가.......................................................................................................................................241

6.4 CI 입문..............................................................................................................................................................................243

6.4.1 CI로 자동화할 대상...........................................................................................................................................243

10

A

6.4.2 SCons 빌드 스크립트 입문............................................................................................................................244

6.4.3 gcovr 설치..........................................................................................................................................................246

6.4.4 빌드 실행.............................................................................................................................................................247

6.4.5 SCM에 등록........................................................................................................................................................250

6.4.6 젠킨스 Job 생성................................................................................................................................................252

6.5 메모리 파괴 버그와의 전쟁................................................................................................................................267

6.5.1 설치.......................................................................................................................................................................267

6.5.2 Valgrind 실행....................................................................................................................................................267

6.5.3 Valgrind에서 검출된 에러..............................................................................................................................268

6.5.4 Valgrind로 검출되는 메모리 에러의 특징과 대책....................................................................................273

6.5.5 젠킨스에서 Valgrind 사용하기.....................................................................................................................274

6.6 CI 실전..............................................................................................................................................................................282

6.6.1 마이크로칩용 툴.................................................................................................................................................283

6.6.2 빌드의 내용.........................................................................................................................................................284

6.6.3 빌드 파일을 분할...............................................................................................................................................289

6.6.4 빌드 서버를 독립시킨다...................................................................................................................................296

6.6.5 자동 빌드를 계획한다.......................................................................................................................................304

6.7 정리.....................................................................................................................................................................................306

부록 예제 프로그램

A.1 주의사항.........................................................................................................................................................................308

A.2 C99 사양의 활성화................................................................................................................................................308

A.3 예제 프로그램을 이클립스로 가져오기.....................................................................................................309

A.3.1 예제 프로그램이 저장된 zip 파일 압축 풀기.............................................................................................309

A.3.2 이클립스에 빈 프로젝트 생성........................................................................................................................309

1. 개요 11

C 언어(이후 C로 표기)가 태어난 것은 1972년이므로 탄생한 지 실로 40년 가까이 지났습니다. 필자가

C와 처음 만난 것은 지금으로부터 30년 전의 일입니다. 그 무렵, 개인이 사용할 수 있는 일반적인

컴퓨터는 “마이컴”이라 불렸으며, 프로그래밍 언어로는 대부분 BASIC 인터프리터밖에 사용할 수 없

었습니다. C 컴파일러라고는 상용 제품밖에 없었고, 개인(특히 학생)으로서는 선뜻 구매하기가 쉽지

않았습니다. 하지만 그런 상황은 크게 바뀌었고, 지금은 C를 포함한 많은 프로그래밍 언어가 오픈소스

로 공개됐습니다.

C의 특징으로 저수준 처리를 구현할 수 있다는 의미로 “고급 어셈블러”라는 조롱 섞인 별명이 C의 특징

을 잘 설명해줍니다. 구조체, 포인터, 배열, 지역변수 등은 실제 메모리 상의 표현과 일대일로 연관돼 있

어서 기계어와의 친화성이 매우 높다고 할 수 있습니다. 실제로 많은 C 컴파일러는 소스에 어셈블리어

를 직접 작성할 수 있는 기능을 제공하며, 임베디드 컴퓨팅용 C 컴파일러는 보편적으로 하드웨어 인터

럽트를 직접 처리하는 로직을 구현할 수 있는 기능을 갖추고 있습니다.

1.1 지금, C의 열기가 뜨겁다!

포스트 C를 목표로 한 다양한 프로그래밍 언어가 나왔습니다. C++ 언어(이후 C++로 표기)는 그 첫

번째 주자라고 할 수 있습니다. 필자가 C++를 사용하기 시작한 것은 20년 정도 전의 일이며, 그 당시에

는 C가 언젠가 C++로 대체되고 C++에 흡수돼 버릴 것이라고 생각했습니다. 그런데 얼마 전 TIOBE1

1 http://www.tiobe.com/content/paperinfo/tpci/index.html

1개요

12 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

통계에서는 C가 1위를 차지했습니다. TIOBE는 엔지니어가 사용하고 있는 프로그래밍 언어의 점유율

을 정기적으로 집계하는 사이트인데, C의 순위 변동2을 살펴보면 꽤 흥미로운 결과를 확인할 수 있습니

다. 2002년에 20% 이상이었던 점유율이 점차 감소 추세를 보였다가 2008년에는 13% 정도로 하락했지

만, 거기서 반전해 다시 20%를 넘으려 하고 있습니다. 한편 C++3는 2002년부터 점유율이 줄고 있는

추세 속에서 한때 17% 정도를 나타내던 점유율이 최근 10%를 밑돌고 있습니다(그림 1-1).

도대체 무슨 일이 일어나고 있는 것일까요? PC 쪽만 보면 이것은 이상한 현상입니다. 극히 일부를 제외

하면 C와 C++는 호환성이 높고, C에서 가능한 일은 모두 C++에서도 가능합니다. 따라서 일부러 C++

를 피하는 이유는 발견할 수 없습니다. 물론, C++의 사양이 복잡하기 때문에 사용을 꺼리는 측면은 있

겠지만, 복잡한 기능은 사용하지 않으면 되는데 말이지요.

한발 물러서서 좀 더 넓은 분야를 살펴봅시다. 최근 PC의 매출이 주춤해지고 스마트폰과 태블릿의 매출

이 늘고 있다는 소식을 자주 듣습니다. 혹은 하이브리드 자동차 등이 등장해 자동차의 내부 구조가 복잡

해졌고, 한 대의 차에 다수의 작은 컴퓨터가 내장된다는 이야기를 들어 본 적이 있을 것입니다. 컴퓨터

가 그 능력을 발휘하고 있는 세계는 PC 분야에서만이 아닙니다.

[그림 1-1] TIOBE에서 발표한 C/C++의 점유율의 변화(출처:http://www.tiobe.com/content/paperinfo/tpci/index.html)

2 http://www.tiobe.com/content/paperinfo/tpci/C.html

3 http://www.tiobe.com/index.php/paperinfo/tpci/C__.html

1. 개요 13

임베디드 시스템 분야의 뉴스 사이트를 보면 2009년부터 2011년 사이에 임베디드 시스템 분야의 CPU

는 매년 10% 가량 매출이 증가하고 있다고 합니다(Embedded News4, PCM0075 ). 임베디드 컴퓨팅

업계에서 유명한 업체 중 하나인 마이크로칩(Microchip ) 사는 2011년 9월에 자사의 임베디드 기기용

CPU의 출하 개수가 100억 개에 달했다고 보고하며, 90억 개에서 100억 개에 도달하는 데 10개월밖에

걸리지 않았다고 말합니다6.

필자는 이러한 임베디드 시스템 분야의 발전과 C의 점유율 증가에는 밀접한 관련이 있다고 생각합니다.

임베디드 시스템은 매우 폭넓은 분야지만 가령 마이크로칩 사의 PIC18F14K50이라는 임베디드 시스템

용 칩7의 경우를 살펴보겠습니다. 이 칩은 8비트 기반의 CPU를 내장한 하나의 마이크로 컴퓨터이며,

내부에 USB 컨트롤러도 내장하고 있어 쉽게 USB 장치를 만들 수 있습니다(그림 1-2).

Device

Program.Memory Data.Memory

I/O.(1)10-bit.

A/D.

(ch).(2)

ECCP.

(PWM)

MSSP

EUSART

Comp.

Timers

8/16

-bit

USBFlash

(bytes)

#.Single-Word

Instructions

SRAM.

(bytes)

EEPROM.

(bytes)SPI

Master

I2C.TM

PIC18F13K50/.

PIC18LF13K508K 4096 512.(3) 256 15 11 1 Y Y 1 2 1/3 Y

PIC18F14K50

PIC18LF14K5016K 8192 768.(3) 256 15 11 1 Y Y 1 2 1/3. Y

[그림 1-2] USB 기능을 탑재한 내장 칩의 사양 (출처 http://ww1.microchip.com/downloads/en/DeviceDoc/41350E.pdf)

전 세계의 많은 USB 장치가 이러한 소형 마이크로 컴퓨터로 제작되고 있습니다. 이 마이크로 컨트롤러

의 경우 제조사가 제공하고 있는 언어는 C와 어셈블러밖에 없고, C++는 사용할 수 없습니다. 프로그램

메모리는 16KB밖에 없고, RAM이라고 해도 768바이트밖에 없습니다. 약간의 고기능 함수(예를 들어,

sprintf )를 링크하려고 하면 그 즉시 메모리가 부족해져서 링크 오류가 발생합니다. 이 같은 상황에서는

C++를 지원한다고 해도 스트림 I/O나 템플릿도 사용하지 못할 것이며, C++를 사용했을 때의 장점은

거의 없습니다. 예전에는 이러한 시스템에 들어가는 임베디드 칩의 성능이 낮아 어셈블러로 프로그램을

작성하는 것이 일반적이었습니다. 그러나 최근에는 매우 성능이 좋아졌기 때문에 대부분의 애플리케이

션을 C로 작성해도 성능 측면에서 전혀 문제없는 수준에 이르렀습니다(필자와 비슷한 세대에 속한 분

이라면 요즘 생산되는 임베디드 시스템용 칩의 데이터시트를 봤을 때 예전의 8비트 마이크로 컨트롤러

4 http://www.embeddednews.co.uk/ArticleItem.aspx?Cont_Title=Smartphones+boost+microcontroller+shipments+with+Arm+seeing+ma-

jor+growth

5 http://www.pcb007.com/pages/zone.cgi?a=58069

6 http://www.techrockies.com/microchip-billion-pic-microcontrollers-shipped/s-0038192.htmlp

7 http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en533924

14 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

와 메모리 용량은 동일한 수준인데도 속도는 몇 백배 빨라졌다는 것에 무척이나 놀랄 것입니다). 그리

고 이에 따라 임베디드 기기가 제공하는 기능 또한 점차 고도화되고 있습니다. 필자는 이것이 C의 수요

를 늘리고 있는 이유가 아닐까 생각합니다.

1.2 C를 이용한 임베디드 시스템 개발의 특징

C을 이용한 임베디드 개발에는 아래에 설명하듯이 독특한 어려움이 있습니다.

하드웨어를 제어하는 프로그램은 테스트하기 어려운 경우가 많습니다. 보통 ICE ( in-circuit

emulator )를 사용해 코드의 동작을 추적할 수 있지만, 가령 코드가 경계값에서도 올바르게 작동하는지

여부를 테스트하려면 이러한 값을 하드웨어가 반환값으로 반환하게끔 준비해야 합니다. 또한 하드웨어

가 오류나 결함을 일으켰을 때의 동작 방식을 확인하기 위한 테스트는 실제 하드웨어를 대상으로 수행

하기 어렵습니다.

임베디드 시스템을 제어하는 프로그램은 대부분 사용할 수 있는 자원이 한정돼 있습니다. 프로그램은

하드웨어가 요구하는 응답 속도에 부응하기 위해 일반적으로 인터럽트를 사용해 하드웨어의 상태 변화

에 즉시 반응합니다. 경우에 따라서는 전용의 듀얼 포트 메모리 및 DMA (Direct Memory Access ) 메

커니즘을 사용해 데이터 전송을 고속화합니다. 탑재된 메모리의 용량도 한정돼 있는 경우가 많아 프로

그램은 가능한 한 짧게 작성하고 작업 메모리의 사용을 억제해야 하며, 스택 영역도 한정돼 있기 때문에

지역 변수의 수나 함수 호출의 깊이에도 주의해야 합니다. 이러한 제약이 있기에 임베디드 프로그램은

때때로 유지보수의 용이성을 희생해 성능과 메모리 사용량을 우선시할 수밖에 없는 경우가 많습니다.

일반적으로 임베디드 시스템 기기는 서버 프로그램과는 달리 대량으로 배포됩니다. 이는 유지보수에 독

특한 어려움을 불러옵니다. 기기의 수가 많아지면 그만큼 재현하기 어려운 버그가 발생하기 쉬워집니

다. 1,000대를 배포한 기기가 하루에 한 번 어딘가에 장애를 일으킬 경우, 그것을 테스트 환경에서 1대

의 기기를 가지고 재현하려면 확률적으로는 1,000일 걸린다는 계산이 나옵니다. 운 좋게 버그를 발견할

수 있었다고 해도 수정된 프로그램을 여러 장소에 보내서 적용해야 할 것입니다. 임베디드 기기의 사용

자는 일반적으로 IT 전문가가 아니기 때문에 그것을 적용하는 작업은 손쉽게 수행할 수 있어야 합니다.

PC나 서버에서는 다기능 OS (운영체제)가 이용되는 것이 일반적입니다. 임베디드 시스템에서도 일정

규모 이상의 경우에는 ITRON 및 임베디드 리눅스가 사용되지만 그 이하인 경우에는 이러한 임베디드

1. 개요 15

용 OS를 사용할 수 없습니다. 따라서 보통은 운영체제에서 제공하는 기본적인 기능(예: 파일 시스템)

도 직접 구현해야 합니다.

C는 다른 대부분의 프로그래밍 언어와 달리 많은 사항을 프로그래머의 실력에 의존합니다. 예를 들어,

지역 변수로 확보한 배열의 인덱스가 잘못되면 함수의 반환 주소가 저장된 메모리의 내용이 망가집니

다. 힙 영역에 메모리를 확보한 후 그것을 잊지 않고 해제해야 하며, 해당 메모리 영역을 가리키고 있던

포인터를 해제했다면 그 후에 그 포인터를 사용하지 않도록 조심해야 합니다. 이 책을 손에 들고 있다는

사실은 여러분이 C 프로그래머라는 것을 의미하며, 위에 열거한 상황에 대해서도 잘 알고 있을 것입니

다. 예전과 달리, 요즘 출시되는 PC용 운영체제라면 메모리 보호 메커니즘이 있어서 이런 버그가 있을

경우 어느 정도는 문제를 해결할 수 있을 것입니다. 그러나 임베디드 시스템을 개발할 때는 메모리 보호

메커니즘을 갖추지 않은 시스템이 많아서 사소한 프로그래밍 실수도 분석하기 힘든 장애로 이어집니다.

게다가 임베디드 시스템 기기는 데이터 센터에 소중하게 설치된 서버와 달리 다양한 외적 요인의 영향

을 받습니다. 정전기, 진동, 온도를 비롯해 도난방지장치에서 나오는 강력한 전파, 바닥을 드러내기 시

작한 배터리에 의한 불안정한 전원 전압 등 열거하자면 얼마든지 많습니다. 서버 애플리케이션에서 장

애가 발생하면 로그나 메모리 덤프를 구해서 분석할 수 있지만 임베디드 시스템에서 이러한 구조를 이

용할 수 있는 것은 일부에 한정됩니다.

일반적으로 기업용 시스템은 수년에서 많게는 10년 이상 사용합니다. 한편 임베디드 기기는 천차만별이

기는 하지만 개중에 수명이 매우 짧은 것도 있습니다. 수명이 긴 시스템을 개발하는 데는 특유의 어려움

이 있지만, 다른 한편으로 짧은 경우에도 나름의 어려움이 있습니다. 그 중 하나는 개발 비용입니다. 지

극히 당연한 이야기지만 제품은 해당 제품의 수명 중에 발생한 매출에서 개발 비용을 회수해야 합니다.

수명이 짧다면 제품에 투입할 수 있는 비용도 적어집니다(물론 판매 수량 및 수익률에 따라 다르지만

네트워크가 연결돼 있기만 하면 배포할 수 있는 소프트웨어와는 달리 유통이 필요한 임베디드 기기는

기간이 제한되면 출하할 수 있는 수량도 자동적으로 제한됩니다). 한정된 개발 비용으로 고품질 소프트

웨어를 개발하기란 어려운 일입니다. 또한 이러한 비용 문제 때문에 최근에는 개발의 전부 혹은 일부를

비교적 임금이 저렴한 나라에 아웃소싱하는 경우가 많아지고 있습니다. 외부에서 개발된 코드의 품질을

보장하려면 어떻게 해야 할까요? 혹은 외부에서 개발된 코드에 버그가 있다면 과연 직접 수정할 수 있

을까요? 이것은 순수하게 기술적인 문제가 아니므로 해결책을 한두 가지로 간단하게 설명할 수 없을 것

입니다.

16 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

소프트웨어뿐만 아니라 하드웨어도 버그는 있기 마련입니다. PC용 CPU조차 에라타(errata )라는 버그

가 발견되는 경우가 있습니다. 일단 양산을 시작한 하드웨어의 수정은 새로 만드는 일과 마찬가지라서

수정하거나 회수하는 데 막대한 비용이 발생하므로 현실적이지 않습니다. 지극히 치명적인 버그를 제외

하고는 소프트웨어로 하드웨어의 버그를 해결해야 합니다. 제품의 수명이 긴 경우 사용된 부품의 일부

가 먼저 생산이 중지돼버렸다면 대체품으로 전환해야 하고, 부품의 사양이 생산공정 단위에서 일부 변

경될 수도 있습니다. 이를 피하기 위해 일반적으로 부품을 일정량 확보해두고는 있습니다만 수요량 예

측도 어렵고 이 업계에서는 보통 부품의 가격이 시간이 지남에 따라 하락하는 경우가 많기 때문에 미리

확보하면 원재료 비용이 많아지는 데다 보관할 장소를 확보하는 데 비용이 발생하므로 확보할 수 있는

양에도 한계가 있습니다. 결국 모든 요구사항은 소프트웨어 쪽으로 몰리게 됩니다.

따라서 임베디드 시스템 개발에는 다양한 어려움이 있음을 알 수 있습니다. 오류 없이 동작하는 것이 당

연하다고 여겨지는 자동차, 가전제품, 오디오 비디오 기기 등은 이러한 어려운 상황 속에서 많은 기술자

들의 끊임없는 노력에 의해 만들어지고 있다고 할 수 있습니다.

1.3 이 책의 목표

과연 자신이 작성한 코드는 어떤 상황에서도 제대로 작동할 것인가? 임베디드 시스템 프로그래머라면

누구나 마음속에 불안감을 가지고 있을 것입니다. 이전 절에서 언급한 임베디드 시스템 특유의 난해함

속에는 순수하게 기술적으로 해결할 수 없는 부분도 있지만 개중에는 도구 및 개발 방법으로 해결할 수

있는 것도 있습니다. 이 책에서는 이러한 도구 및 개발 방법을 소개합니다.

1.3.1 C와 통합 개발 환경

이제는 많은 언어에서 통합 개발 환경(IDE; Integrated Development Environment )을 이용해 개발

하는 것을 당연하게 생각합니다. 실제로 위에서 설명한 마이크로칩 사에서도 넷빈즈(NetBeans )라는

자바용 IDE를 기반으로 한 PIC용 IDE를 제공합니다(그림 1-3).

그러나 C의 경우 실제 현장에서는 상황이 매우 다른 듯합니다. 필자는 얼마 전 어떤 개발사의 임베디드

기기 개발 현장을 볼 기회가 있었는데 대부분의 기술자가 텍스트 편집기 및 명령 프롬프트를 이용해 개

발 작업을 수행하고 있었습니다.

1. 개요 17

[그림 1-3] 마이크로칩 사의 MPLAB X IDE (출처:http://www.microchip.com/pagehandler/en-us/family/mplabx/)

그림 1-4에 전통적인 C를 이용한 임베디드 개발 환경의 구성을 나타냈습니다8. 마스터 소스코드는 서

버에 저장되고, 개발 담당자는 서버에서 소스코드를 꺼내어(체크아웃), 자신의 PC에서 텍스트 편집기

를 이용해 수정합니다. 소스코드를 변경하고 나면 자신의 PC에서 컴파일과 링크 작업을 수행하고 타깃

기기에 전송합니다. 작업 환경이 좋은 곳이라면 디버깅 작업을 위한 ICE를 각 개발자에게 할당할 수 있

겠지만 그렇지 않다면 로그에 의존하는, 이른바 printf로 값을 확인하면서 디버깅하거나, 칩 제조 업체

에서 제공하는 타깃 기기의 시뮬레이터를 사용합니다. 어쨌든 임베디드 기기의 디버깅은 PC 상에서 비

주얼 디버거를 이용한 디버깅과 비교하자면 수작업에 가깝고, 지독한 버그 때문에 며칠 동안 발목이 잡

히는 일이 흔히 일어납니다.

사람들은 때때로 IDE가 좋은지 편집기가 좋은지에 관한 논의를 하지만 필자는 두 가지 특성을 모두 이

해한 후에 상황에 따라 적합한 도구를 적절히 사용하면 될 뿐이라고 생각하며, 둘 중 하나밖에 사용하지

않는 것은 아쉽게 생각합니다. 예를 들어 디버깅, 코드 탐색, 매크로 확장의 분석, 리팩터링과 같은 작업

8 임베디드 시스템에 익숙하지 않은 분들에게 보충 설명을 하자면 그림에 나타난 “프로그래머”라는 것은 사람을 의미하는 것이 아니라 타깃 기기에 프로그램을 전송

하는 장치를 말합니다.

18 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

에 대해서는 IDE가 더 유리할 것입니다. 이 책에서는 C/C++용 이클립스(Eclipse )의 설치 및 사용법

을 간단히 설명하고 이 책 전반에 걸쳐 이클립스를 이용해 개발하는 방법을 설명하겠습니다.

ch01 : 2013/9/30 (11:16)

서버

소스코드 소스코드커밋

에디터컴파일러/링커

바이너리프로그래머

전송

타깃 기기

담당자의 PC

[그림 1-4] 전통적인 C의 개발 환경

1.3.2 C와 디자인 패턴

예전에는 디자인 패턴이라고 하면 프로젝트를 수행하는 과정에서 상위 단계에서 적용한 추상적인 디자

인 패턴을 일컫는 경우가 많았습니다. 하지만 에리히 감마, 리처드 헬름, 랄프 존슨, 존 블라시디스, 이

렇게 4명(이른바 GoF )에 의한 디자인 패턴이 등장하고 나서는 더 구현적 성향이 강한 디자인 패턴을

일컫는 경우가 많아져서, 지금은 단순히 디자인 패턴이라 하면 이 GoF 디자인 패턴을 가리키게 됐습

니다. GoF 디자인 패턴은 객체 지향 언어를 기반으로 하고 있으며, 시중에 나와있는 책에서도 자바나

C++를 이용한 예제를 설명한 것이 대부분입니다. 따라서 C 프로그래머 중에는 혹시 C에서는 디자인

패턴을 활용할 수 없다고 생각하거나 혹은 애초에 C 이외의 언어는 잘 모르기 때문에 책을 읽어도 잘 모

르겠다고 하는 경우가 있을지도 모릅니다. 하지만 디자인 패턴은 C에서도 활용 가능하고 매우 유용한

것입니다. 이 책에서는 디자인 패턴 중에서 특히 C로 임베디드 시스템을 개발할 때 유용한 패턴을 발췌

해 그 활용법을 살펴보겠습니다.

1.3.3 C와 익스트림 프로그래밍

켄트 벡 등이 제창한 익스트림 프로그래밍은 개발 방법의 하나로 기존 개발 방법의 상식을 차례차례 뒤

집어버렸다는 점에서 많은 충격을 주었습니다. 그 중에서도 가장 중요한 아이디어는 변화를 받아들이고

단기간 내에 부가가치가 높은 소프트웨어를 구축한다는 점에 있습니다. 익스트림 프로그래밍 중에는 개

발 작업 전반에 관한 몇몇 실천 지침이 알려져 있습니다만 이 책에서는 프로그래밍 언어와 관련이 깊은

실천 지침에 관해 설명합니다.

1. 개요 19

C와 TDD(테스트 주도 개발)

구현에 앞서 제작하려는 기능을 확인하는 단위 테스트(unit test )를 작성하고, 그 테스트에 통과하도록

최소한의 구현을 반복하는 것이 TDD의 발상입니다. 언뜻 보기에 테스트를 작성하는 작업에 이전보다

좀 더 많은 시간과 노력이 소요될 것처럼 보입니다. 그러나 항상 테스트 가능한 상태가 가져다 주는 품

질 향상, 그리고 변화에 대한 대응 속도 향상 등의 혜택 덕분에 TDD가 총 개발 공수에 이점으로 작용한

다는 것을 실제로 활용해 보면 바로 확인할 수 있습니다. TDD를 수행하는 경우 다음과 같은 지원 도구

의 선정이 중요합니다.

● 단위 테스트 툴

테스트.대상에게.입력을.주어.그.결과를.검증하는.틀을.제공하고.테스트.결과를.보고한다.

● 커버리지 측정 툴

단위.테스트가.개발자가.지정한.코드.부분을.제대로.테스트하고.있는지.검증하는.것은.테스트.작업의.중요한.측면.중.

하나다..커버리지.측정.툴은.테스트.과정에서.실제로.실행된.코드.부분들을.집계함으로써.테스트의.커버리지를.산출

한다..따라서.프로그래머는.테스트가.불충분한.부분을.쉽게.식별할.수.있다.

● 목업 도구

일반적으로.소프트웨어의.구성.요소는.다른.구성.요소와.상호작용한다..어떤.구성.요소를.테스트할.때.상호작용을.하

는.상대방의.구성.요소가.외부에.의존(예를.들어,.하드웨어에.직접.접근하거나.통신하는.등)하고.있다면.테스트하기.

어려워진다..그래서.상호작용하는.상대를.위해.목(Mock)이라고.하는.‘가짜’를.준비해.상호작용에서.교환되는.데이터가.

올바른지에.대해서만.검사한다..이.목을.생성하는.툴이.바로.목업.툴이다.

이 책에서는 C로 프로그램을 작성할 때 도움이 되는, 필자가 추천하는 단위 테스트 툴 및 커버리지 측정

툴의 사용법을 설명합니다. 아쉽게도 C 언어용 목업 툴로는 적당한 것이 없기 때문에 개발자가 직접 기

존의 C 함수를 목업하는 방법에 대해 몇 가지 예를 들어 설명하겠습니다.

C와 리팩터링

리팩터링이라는 말은 프로그램의 체질을 개선하는 작업을 의미하지만 현재는 일반적으로 프로그램의

외부 인터페이스를 변경하지 않고 내부를 개선하는 것을 의미하는 경우가 많습니다. 리팩터링할 때 중

요시되는 것은 미리 단위 테스트를 작성한다는 점입니다. 이렇게 함으로써 리팩터링 작업이 프로그램의

기능을 망가뜨리지 않는다는 것을 보장합니다. 개발 초기부터 지속적으로 리팩터링을 실시해왔다면 이

렇게 하기가 어렵지 않겠지만(이미 리팩터링을 실시하고 있으므로 단위 테스트도 이미 갖춰져 있을 것

입니다), 자동화된 테스트 기능이 없는 코드에 대해 리팩터링을 수행하는 것은 매우 어려운 작업입니

20 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

다. 특히 수백 줄의 함수(몬스터 메서드)나 실행 도중 하드웨어에 접근하는 함수 등에 대해서는 단위

테스트를 작성하기 어렵습니다. 또한 리팩터링 기법은 객체 지향 언어를 위한 것이 많고 C에서 사용하

는 경우에는 적절히 바꿀 필요가 있습니다. 이 책에서는 이처럼 교과서적으로는 수행될 수 없는 C 애플

리케이션의 리팩터링에 대해 설명하겠습니다.

C와 지속적인 통합

인텔 창업자 중 한 사람인 무어가 제창한 이른바 ‘무어의 법칙’에 따라 컴퓨터의 성능은 18개월마다 2배

로 증가해왔습니다. 컴퓨터의 성능 향상은 개발 방법에도 적지 않은 영향을 주고 있습니다. 필자의 대

학 시절, 포트란(FORTRAN )을 이용한 실습수업이 있었습니다. 그때 교수님이 학생들에게 여러 번 주

의를 주었던 내용이 “무한 루프를 절대로 사용하지 말라”였습니다. 당시의 컴퓨터(호스트 컴퓨터)는 사

용한 자원에 대해 요금이 부과되도록 설정돼 있었고, 자신이 실행한 프로그램이 컴퓨터 자원을 얼마나

사용했는지 보고했습니다. 당시의 시스템에는 무한 루프를 사용할 경우 그것을 감지해 강제로 종료하

는 기능이 추가돼 있었지만 한 번이라도 무한 루프를 실행했다면 보고서의 “CPU time”란에 1,000ms (1

초)라는 숫자가 새겨졌습니다. 정확한 금액은 기억할 수 없지만 1초 동안 CPU를 사용하면 수천 엔(수

만 원)의 요금이 부과됐다고 기억하고 있습니다.

지금은 어떨까요? 당시의 컴퓨터보다 1,000배 이상 빠른 컴퓨터를 개인이 원하는 대로 사용할 수 있으

며, 비디오 인코딩 같이 CPU를 많이 사용하는 작업을 아무리 실행해도 그것에 대해 요금이 청구되는

일은 없습니다.

이것은 개발 방법에 적잖은 영향을 주고 있습니다. 예전에는 컴퓨터를 사용하는 것 자체에 상세한 요금

이 부가됐었습니다. 화면을 통한 코드 편집, 컴파일, 링크, 테스트 모두 컴퓨터의 리소스(CPU, 메모리,

HDD )를 소비하며 그러한 작업에 대해 과금이 이뤄졌습니다. 따라서 가능한 한 이러한 작업을 적게 사

용하도록 제한할 필요가 있었습니다. 말하자면 인간의 노동력보다 컴퓨터의 리소스가 더 비쌌던 시대였

습니다. 그러한 시대에는 컴퓨터에 프로그램을 입력하기 전에 확실하게 설계하고, 종이에 코드를 써서

여러 번 검토함으로써 버그를 제거해야 했습니다(이를 탁상 디버깅이라고 불렀습니다). 테스트한 후에

는 언제, 무슨 검사를 했는지를 기록하고 한 번 만든 프로그램은 가능한 한 변경하지 않아야 했습니다.

단지 필요에 의해 변경한 후에는 거기서부터 영향을 받을지도 모른다고 생각되는 부분만을 테스트해야

했습니다. 그것이 그 당시의 상식이었습니다.

1. 개요 21

그림 1-5는 코딩 용지라는 것인데, 젊은 사람들에게는 믿어지지 않겠지만 예전에는 이 종이에 코드를

작성한 후 마지막으로 컴퓨터에 입력했습니다.

[그림 1-5] 코딩 용지(출처:http://www003.upp.so-net.ne.jp/elroy/tsuzuri/computer.html)

그러나 지금처럼 컴퓨터 리소스를 물 쓰듯 사용할 수 있는 시대라면 상식도 바뀝니다. 코드를 문자로 입

력하는 즉시 컴파일해서 테스트를 수행하고 애플리케이션이 손상되지 않았는지 확인합니다. 이것이 지

속적인 통합(CI; Continuous Integration )의 개념입니다. 이러한 일련의 빌드 작업을 수행하는 서버

를 “CI 서버”라고 합니다.

기업용 소프트웨어 개발에서 지속적인 통합은 상식으로 자리 잡았지만 임베디드 시스템 개발에서도 지

속적인 통합은 유효합니다. 이 책에서는 자바에서 일반적으로 사용되는 CI 서버인 젠킨스(Jenkins )를

C 애플리케이션 개발에 활용하는 방법을 소개합니다.

22 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

1.3.4 C와 모던 개발 스타일

이 책에서는 위에서 언급한 기술들을 조합한 모던 개발 스타일에 관해 설명합니다.

그림 1-6에서는 CI 서버를 이용한 개발의 개괄적인 내용을 보여줍니다. IDE는 컴파일러, 링커, 디버거,

단위 테스트 툴을 통합했고, 개발자는 IDE를 사용해 개발을 진행합니다. 나중에 언급하겠지만 프로그

램에서 타깃 기기의 하드웨어 제어에 관련된 부분을 적절히 분리함으로써 단위 테스트에서 발견된 버그

는 PC 상에서 비주얼 디버거를 사용해 디버깅할 수 있게 됩니다. 개발자는 필요할 때 언제라도 리팩터

링을 실시해 코드의 구조를 개선합니다. 단위 테스트가 있기 때문에 코드를 변경하더라도 망가지지 않

았다는 사실을 즉시 확인할 수 있습니다.

ch01 : 2013/9/30 (11:16)

서버

담당자의 PC

소스코드

소스코드

바이너리

바이너리프로그래머

빌드 레포트

IDE

CI 서버

스모

크 테

스트

기능

테스

성능

테스

프로그래머

타깃 기기

타깃 기기

컴파일러

/링커

컴파일러

/링커

컴파일 및 링크 결과

테스트 결과커버리지

단위 테스트

도구

단위 테스트

도구

테스트 결과

커밋

[그림 1-6] C를 이용한 모던 개발 스타일

개발자가 소스코드의 변경 사항을 서버에 커밋하면 서버는 그것을 계기로 빌드를 수행합니다. 빌드 작

업 중에는 일단 소스코드의 컴파일과 링크 작업을 수행합니다. 또한 단위 테스트를 수행해 이번 소스코

드의 변경이 애플리케이션의 동작에 악영향을 끼치지는 않는지 확인합니다. 마지막으로, 가능하다면 타

1. 개요 23

깃 장비에 전송하고 일련의 테스트 작업을 수행합니다. 스모크 테스트(smoke test )란 타깃 기기가 제

대로 작동하고 있는지 확인하기 위한 최소한의 테스트를 말하며, 프로그램의 타깃 기기로의 전송/배치

작업이 성공했는지 확인하기 위해 수행하는 것입니다. 기능 테스트는 타깃 기기의 기능을 테스트합니

다. 성능 테스트는 타깃 기기의 성능이 규정된 수치로 나타나는지를 확인합니다. 스모크 테스트 이후의

테스트 작업에서 타깃 기기의 종류에 따라서는 자동 실행이 어려운 경우도 있지만 네트워크 기능을 갖

춘 타깃 기기라면 네트워크를 통해 자동으로 실행되게 한다면 언제든지 편리하게 품질을 확인할 수 있

습니다.

그림 1-7은 CI 서버 중 하나인 젠킨스(http://jenkins-ci.org/) 관리 화면의 예입니다. 많은 CI 서버

는 이처럼 웹으로 빌드 상태를 확인할 수 있게 돼 있습니다.

[그림 1-7] CI 서버 관리 화면(젠킨스)

지금까지 소개한 개발 스타일에는 다음과 같은 이점이 있습니다.

● 단위 테스트에 의한 품질 및 생산성의 향상

타깃.기기의.하드웨어나.플랫폼에.독립적인.로직을.분리해.단위.테스트로.하여금.해당.로직의.동작.방식을.검증하게.

함으로써.이러한.로직의.품질을.향상시킬.수.있다..또한.고난도의.로직.부분을.이렇게.해두면.버그가.있어도.PC.상에

서.비주얼.디버거로.분석할.수.있다.

24 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

● 리팩터링에 의한 코드의 구조 개선

단위.테스트를.가능하게.하고,.리팩터링을.언제든지.진행할.수.있게.함으로써.코드의.구조가.개선된다..따라서.그.코

드를.작성한.사람.이외의.담당자도.단시간에.내용을.이해할.수.있게.되고,.또한.코드가.정리된.함수의.집합이.되므로.

재사용하기가.수월해진다.

● 피드백을 즉시 얻을 수 있다

코드를.커밋하면.컴파일.및.링크가.가능한지,.테스트를.통과할.수.있는지와.같은.내용이.즉시.검증된다..CI.서버에서는.

빌드의.계기가.된.커밋을.확인할.수.있기.때문에.빌드가.망가진.경우.어떤.변경사항으로.빌드가.망가졌는지.바로.알.

수.있다..빌드.실패를.이메일이나.RSS로.통지하는.기능이.있기.때문에.빌드가.깨진.사실을.금방.알.수.있다.

● 정식 빌드를 확정할 수 있다

이.내용은.지속적인.통합을.사용하지.않아도.자신의.PC에서.빌드해보면.알.수.있는.내용이다..관련.없는.소스나.라

이브러리가.섞여들어와.그것을.암묵적으로.빌드하고.테스트하는.경우가.있다(예를.들어.add/commit을.잊어버리거나.

update를.잊어버린.경우)..이.경우.자신의.PC에서는.빌드할.수.있지만.그것이.커밋되어.다른.사람의.PC에.배포된.순

간.그들의.환경에서는.빌드가.불가능해진다..“내.PC에서는.컴파일되는데...”.현상은.지속적인.통합을.적용하지.않은.

개발.환경에서.일반적으로.발생하는.결함이며.개발.인원이.많다면.이는.여러.사람의.업무를.방해하는.요소가.된다..지

속적인.통합을.활용하고.있다면.CI.서버의.빌드가.정식.빌드가.되며.빌드의.일관성은.모두.여기에.통일된다..비록.자

신의.PC에서는.빌드된다.하더라도.CI.서버에서.빌드할.수.없다면.결함을.의미하며.이를.수정해야.한다.

● 항상 작동 가능한 소프트웨어를 얻을 수 있다

CI를.사용하지.않는.대부분의.경우.리포지토리의.소스코드는.컴파일조차.잘.수행되지.않는.상태인.경우가.많고,.통합.

테스트까지.진행돼서야.갑자기.해결하기.어려운.버그가.곳곳에서.발견된다..이것은.다른.사람의.코드와.통합했을.때.

부조화가.발생해.버그가.많이.발견되는.것이.원인이다..이러한.버그는.여러.사람이.코드를.수정하는.데.그.원인이.있

기.때문에.해결하려면.시간과.공수가.필요한.경우가.많다..게다가.그.원인에.해당하는.코드는.훨씬.이전에.수정된.경

우도.많아.문제.해결이.더욱.어려워진다..CI를.활용하는.경우.코드가.조금이라도.변경되면.재컴파일과.테스트가.자

동으로.실행되므로.이러한.통합과.관련된.버그도.금방.찾아낼.수.있어서.리포지토리의.내용은.항상.작동.가능한.상

태로.유지된다.

● 보고서 기능에 의해 상황, 이력을 언제든지 확인할 수 있다

CI.서버는.빌드.결과를.요약해서.보고하는.기능이.있기.때문에.언제든지.소스코드의.수정과.그에.의해.수행된.빌드의.

작업.상황.기록을.확인할.수.있다.

1.4 정리

1장에서는 C를 이용한 임베디드 시스템 개발의 특징을 간단하게 언급했고, 이후에 이 책에서 설명할 내

용을 간단히 소개했습니다.

1. 개요 25

C를 이용한 임베디드 시스템 개발에는 다음과 같은 특징이 있습니다.

● 테스트하기 어렵다

● 타깃 기기에서 애플리케이션이 사용할 수 있는 자원이 한정돼 있다

● 대량으로 배포되기에 유지보수가 어렵다

● OS가 없는 환경도 있다

● 프로그래머가 주의해야 할 일과 관리해야 할 일이 많다

● 제품 수명이 매우 짧은 경우가 있다

● 타깃 기기의 하드웨어 자체에 버그가 있는 경우도 있으며, 이때는 일반적으로 소프트웨어에서 해결해야 한다

2장부터는 다음과 같은 내용을 통해 전통적인 개발 방식과는 다른 모던 개발 스타일에 관해 소개하겠습

니다.

● C 개발에 IDE 활용하기

● C에서 디자인 패턴 사용하기

● C 프로그램의 개발을 테스트 주도 개발 형식으로 수행

● C 프로그램 리팩터링하기

● C 프로그램 개발에 지속적인 통합을 적용

이를 통해 다음과 같은 효과를 얻을 수 있습니다.

● 디버깅이 용이해지므로 품질, 생산성이 향상된다

● 단위 테스트에 의해 품질, 생산성이 향상된다

● 리팩터링에 의해 코드의 구조 개선이 가능해진다

● 피드백을 즉시 얻을 수 있다

● 소프트웨어가 항상 “작동” 상태로 유지된다

● 정식 빌드를 확정할 수 있다

● 보고서 기능을 통해 이력을 언제든지 확인할 수 있다

참고 문헌

[1].『엔터프라이즈.애플리케이션.아키텍처.패턴』,.피어슨에듀케이션코리아(PTG),.2003

26 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

2.1 개요

2장에서는 개발 환경 구축에 대해 설명합니다. 개발 툴이 준비돼 있다는 점, 그리고 최근 임베디드 시스

템이 OS로 사용되는 경우도 많다는 점 등의 이유로 이 책에서는 리눅스를 사용합니다. 그러나 윈도우

PC에서도 시험할 수 있게 가상 머신으로 리눅스 환경을 구성하는 방법도 설명합니다.

또한 이 장에서는 리눅스에 익숙하지 않은 분들을 위해 가능한 한 상세하게 설명하겠지만 지면상 어쩔

수 없이 생략하는 부분도 있습니다. 리눅스에서 작업하는 중에 잘 모르는 부분이 있으면 다른 리눅스 입

문서를 참조하기 바랍니다.

이 책에서는 전체적으로 C 애플리케이션 개발을 위해 통합 개발 환경(IDE; Integrated Development

Environment )을 사용합니다. 아울러 운영체제를 설치한 후 IDE를 설치하는 방법에 대해서도 설명합

니다.

2.2 리눅스 도입

이 책에서는 데스크톱용 리눅스 배포판으로 인기를 얻고 있는 우분투의 파생 버전 중, 주분투

(Xubuntu )를 사용합니다. 주분투는 Xfce라는 데스크톱 환경1을 사용하고 가볍다는 특징이 있어서 개

발 장비처럼 무거운 툴을 사용하는 데 좋습니다. 기본적으로 툴 등은 패키지 관리자를 통해 설치하기 때

문에 데비안 계열의 리눅스 배포판이라면 이 책에서 소개하는 절차를 거의 그대로 이용할 수 있습니다.

1 사용자 데스크톱 환경을 제공하는 소프트웨어를 의미합니다.

2개발 환경 구축

2. 개발 환경 구축 27

이후에는 윈도우 상에서 가상 머신에 주분투를 설치하는 방법과 PC에 직접 주분투를 설치하는 방법을

설명합니다. 가상 머신을 사용하는 경우 32비트 버전의 윈도우라면 주분투도 32비트 버전을 구하기 바

랍니다. 반면 메모리가 충분하다면(4GB 이상) 주분투 64비트 버전을 사용하는 편이 메모리를 효율적

으로 활용할 수 있습니다. 그러나 64비트 버전은 32비트 버전보다 필요 이상으로 메모리를 사용하기 때

문에 메모리가 4GB 이상 장착돼 있지 않은 경우에는 32비트 버전을 선택하는 편이 좀 더 쾌적합니다.

주분투는 http://xubuntu.org/에서 내려받을 수 있습니다. 하단의 “Get Xubuntu” 링크를 클릭한 다

음, 아래에 있는 “Mirror downloads”에서 “United States”를 클릭합니다. 이 책에서는 12.04 LTS를

기준으로 설명하므로 이전 버전을 내려받기 위해 12.04 디렉터리가 나올 때까지 “Parent Directory” 링

크를 클릭합니다(또는 http://mirror.anl.gov/pub/ubuntu-iso/CDs-Xubuntu/12.04/release/에

서 바로 확인할 수 있습니다). 12.04 디렉터리 링크가 표시되면 해당 링크를 클릭한 다음, 32비트라면

“xubuntu-12.04.4-desktop-i386.iso” 파일의 링크를, 64비트라면 “xubuntu-12.04.4-desktop-

amd64.iso” 파일의 링크를 클릭해 확장자가 iso인 파일을 다운로드할 수 있습니다.2

어떤 버전을 사용해야 할까?

우분투.배포판은.1년에.2번씩.새.버전이.출시됩니다..출시된.지.얼마.안.된.버전은.버그가.남아.있는.경우가.많으며,.

어느.정도.경험이.없으면.해결하기.어려운.버그.때문에.고생할.수도.있습니다..그러나.너무.오래된.버전이라면.유지

보수되지.않는다는.단점이.있습니다..해당.OS에.익숙해지기.전에는.최신.버전이.출시된.후.몇.달이.지나서.패치된.

것을.사용하는.편이.무난할.것입니다..이.책에서.사용할.ISO.이미지는.패치가.적용된.것으로.교체되고.있고(집필.시

점에서는.12.04.2였습니다),.설치.후에는.패키지.관리자가.패치.여부를.정기적으로.모니터링하고.알려주므로.오래된.

ISO.이미지를.사용하더라도.나중에.쉽게.패치를.적용할.수.있습니다.

2.3 윈도우 PC용 환경 만들기

윈도우 환경을 최대한 그대로 두고 싶은 경우에는 가상 머신(이후 VM이라 함)을 사용해 리눅스를 가동

합니다. 여기서는 버추얼박스(VirtualBox )라는 VM을 사용합니다. 또한 윈도우 상에 가상 환경을 만

들려면 최소 3GB 메모리가 탑재된 PC가 필요합니다. 윈도우 비스타 이상에서는 OS 자체가 사용하는

메모리의 양이 증가했으므로 윈도우 비스타를 32비트 PC에서 사용하고 있는 환경에서는 쾌적하게 실행

2 LTS는 Long Term Support의 약자로 출시 후 5년간의 보안 업데이트가 보장된 버전입니다. LTS는 2년에 한 번 출시됩니다. 이에 비해 [Latest release : ~]의 아래

에서 배포되는 것은 반년에 한 번 최신 버전이 출시되고 보안 업데이트가 실시되는 기간도 1년 반으로 짧아졌습니다. 이 책을 집필하는 시점에서 LTS의 최신 버전

은 12.04 LTS(2012년 4월 버전)이었기 때문에 이 책에서는 12.04 LTS를 사용합니다.

28 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

하기가 어렵습니다. 가능하면 64비트 윈도우를 준비하고 4GB 이상의 메모리를 탑재하는 것이 좋습니

다.

2.3.1 버추얼박스 설치

버추얼박스는 오라클(Oracle )에서 제공하는 오픈소스(이후 OSS로 표기) VM입니다. 최신 버전

을 내려받으려면 영문 사이트를 방문하는 것이 좋습니다(https://www.virtualbox.org/wiki/

Downloads ). 집필 시점에서 최신 버전은 4.3.16입니다. “VirtualBox 4.3.x for Windows hosts” 옆

에 있는 “x86/amd64” 링크를 클릭해 실행 파일을 다운로드합니다. 다운로드가 완료되면 파일을 실행

하고, 일반적인 방법으로 설치하면 됩니다.

설치가 끝나면 버추얼박스를 실행합니다. 맨 먼저 VM을 생성하기 위해 왼쪽의 “새로 만들기(N )” 버튼

을 클릭합니다(그림 2-1).

[그림 2-1] VM 새로 만들기

2. 개발 환경 구축 29

“이름 및 운영 체제” 화면에서 이름을 입력하고(이름은 임의로 지정할 수 있습니다. 여기서는

“XubuntuVM”이라고 하겠습니다), “종류”와 “버전” 부분에 각각, “Linux”와 “Ubuntu”를 지정하고

“다음(N )”을 클릭합니다(그림 2-2).

[그림 2-2] VM의 이름을 지정

“메모리 크기” 화면에서 메모리의 용량으로 2GB (2048MB )를 할당합니다(그림 2-3).

[그림 2-3] 메모리 할당

다음으로 가상 드라이브를 만듭니다. 먼저, 가상 드라이브를 생성할 것인지에 관한 질문이 표시되는데,

여기서는 “지금 가상 하드 드라이브 만들기”를 선택한 후 “만들기” 버튼을 클릭합니다(그림 2-4). “하

드 드라이브의 파일 종류” 대화상자에서는 그대로 “VDI (VirtualBox 디스크 이미지)”를 선택한 후 “다

음(N )”을 클릭합니다.

30 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-4] 가상 드라이브 만들기(1)

“물리적 하드 드라이브에 저장” 대화상자에서 “동적 할당(D )”을 선택합니다(그림 2-5). 이렇게 하면

지정한 용량에 관계없이 VM이 실제로 사용하는 용량만큼만 HDD에서 할당됩니다.

[그림 2-5] 가상 드라이브 만들기(2)

“파일 위치 및 크기” 대화상자에서는 VM이 사용할 HDD의 크기를 결정합니다. 여기서는 20GB로 지정

합니다(그림 2-6). 크기를 지정한 후, “만들기” 버튼을 클릭해 VM을 만듭니다.

2. 개발 환경 구축 31

[그림 2-6] 가상 드라이브 만들기(3)

VM이 만들어지면 메인 윈도우에 VM의 내용이 표시되는데, 여기서 “설정(S )” 버튼을 클릭합니다(그림

2-7).

[그림 2-7] 가상 머신의 설정

32 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

내려받은 Xubuntu CD로 부팅하도록 설정하겠습니다. 왼쪽 창에서 “저장소”를 선택하고 “저장소 트

리(S )”에서 “컨트롤러: IDE”를 선택합니다. 그 옆에 “+” 표시가 붙어 있는 CD 모양의 아이콘에 마우

스 커서를 가져다 대면 “CD/DVD 장치 추가하기”라는 팝업이 뜨는데, 이 아이콘을 클릭합니다(그림

2-8).

[그림 2-8] “CD/DVD 장치 추가하기”를 클릭한다

“디스크 선택하기(C )”를 클릭하고 내려받은 Xubuntu의 ISO 파일을 지정합니다(그림 2-9).

[그림 2-9] “디스크 선택하기(C)”를 클릭

IDE 컨트롤러에 CD가 추가됩니다(그림 2-10).

[그림 2-10] Xubuntu CD가 IDE 컨트롤러에 추가된다

“확인” 버튼을 클릭해 메인 윈도우로 돌아가서 “시작(I )” 버튼을 눌러 부팅합니다. 잠시 기다리면 그림

2-11과 같은 화면이 표시됩니다. 이 화면 왼쪽의 리스트박스에서 아래 부분에 있는 “한국어”를 선택하

고 “Xubuntu 설치” 버튼을 클릭합니다.

[그림 2-11] “시작(I)” 버튼을 클릭해 Xubuntu를 부팅

34 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

이후의 절차는 VM을 사용하지 않는 경우와 동일하므로 “2.4.3 주분투 설치” 절에서 추가로 설명하겠습

니다.

2.4 리눅스 PC용 환경 구축하기

위에서 설명했듯이 윈도우 PC에서도 VM을 사용해 환경을 구축할 수 있지만 가능하면 리눅스 네이티브

환경을 구축하는 것이 좋습니다.

2.4.1 도입하기 전에

윈도우 PC에 리눅스를 설치하는 데는 크게 기존 윈도우와 공존시키는 방법과 전체를 리눅스로 대체하

는 방법으로 나눌 수 있습니다. 두 가지 모두 조작 실수나 버그로 인해 부팅할 수 없게 되거나 파티션에

손상이 가해질 수도 있습니다. 작업하기 전에 백업하는 것을 잊지 마십시오.

최근 대부분의 리눅스 배포판의 설치 프로그램은 이미 설치된 윈도우를 발견하면 윈도우 파티션의 크

기를 조정해서 리눅스와 공존하기 작업을 수행하는 기능을 마법사 형식으로 제공합니다. 이 경우 PC를

부팅할 때 메뉴가 표시되어 윈도우로 부팅할지 리눅스로 부팅할지 선택할 수 있습니다. 주분투도 이 기

능을 제공합니다만 새로 설치할 때는 HDD의 복구 파티션에 주의하기 바랍니다. PC의 종류에 따라서

는 HDD의 내용물을 출하 당시의 상태와 동일하게 되돌리기 위한 복구 기능을 HDD 내의 특정 파티션

(윈도우와는 다른 파티션)에 저장해둔 경우도 있습니다. 리눅스를 설치할 때 이 영역을 실수로 삭제해

버리면 나중에 복구 기능을 사용할 수 없게 됩니다. PC의 종류에 따라서는 이 복구 파티션을 CD-R/

DVD-R에 백업하는 기능을 제공하기도 하므로 가능하다면 작업 전에 미리 백업해두는 것이 좋습니다.

자세한 내용은 PC를 구입할 때 별도로 제공되는 설명서를 참조하기 바랍니다.

메모리 카드에 설치하기

새로.설치할.때.메모리.카드로.리눅스를.운영하는.것도.가능합니다..이.경우.HDD를.변경할.필요.없이.리눅스를.사

용할.수.있습니다(단,.설치할.때.실수로.설치.위치를.HDD로.지정하지.않도록.주의해야.합니다)..USB.메모리.카드로.

부팅할.수.있는.PC라면.USB.메모리.카드를.HDD.드라이브.중.하나로.인식해서.표시해주므로.이를.설치.대상.드라

이브로.선택하고,.그.이후에는.HDD에.설치하는.것과.같은.방식으로.설치.작업을.진행할.수.있습니다..설치가.끝나

면.BIOS에서.부팅.순서를.설정해.메모리.카드가.먼저.부팅하게.하면.HDD에.설치한.경우와.같은.방식으로.사용할.

수.있습니다(PC에.따라서는.USB.메모리.카드로.부팅하는.기능을.지원하지.않는.경우도.있습니다)..USB는.HDD에.

비해.전송.속도가.떨어지지만(PC.케이스.밖에서는.메모리.카드.슬롯의.형태이지만,.PC.내부적으로는.USB로.연결

돼.있는.경우가.많습니다),.충분히.빠른.메모리.카드를.사용한다면.실제.체감.속도는.오히려.HDD보다.빠르게.느껴

지는.경우도.있습니다..단,.메모리.카드는.내용을.자주.갱신하면.수명이.크게.줄어들기.때문에.RAM을.충분히(3GB.

이상).설치해.두고.스왑.파티션은.생성하지.않는.것이.좋습니다.

2. 개발 환경 구축 35

2.4.2 설치 디스크 만들기

VM을 사용하는 경우에는 내려받은 ISO 이미지 파일을 그대로 사용할 수 있지만 PC에 직접 설치하는

경우에는 매체에 “구울” 필요가 있습니다.

윈도우에서 만드는 방법

윈도우에서 만드는 방법으로 DVD-R/RW를 이용하는 방법과 USB 메모리를 사용하는 방법을 설명하

겠습니다.

DVD-R/RW 사용하기

PC에 DVD-R/RW에 기록할 수 있는 드라이브 장치가 탑재돼 있으면 DVD를 구워서 만드는 것이 가

장 간단한 방법입니다. 이 경우 PC에 번들로 소프트웨어가 이미 설치돼 있는 경우가 많기 때문에 해당

소프트웨어를 그대로 사용하면 됩니다. 방법을 잘 모르겠다면 조금 전에 내려받은 ISO 파일을 윈도우

탐색기로 찾아보기 바랍니다(그림 2-12).

[그림 2-12] ISO 파일을 탐색기에서 보기

이처럼 특정 응용 프로그램 아이콘으로 표시되는 경우에는 해당 소프트웨어가 ISO 이미지 굽기를 지원

하고 있을 가능성이 높으므로 이 파일의 아이콘을 더블클릭해보기 바랍니다. 실제 굽기 작업은 소프트

웨어에 따라 다르기 때문에 설명은 생략합니다. 자세한 내용은 해당 소프트웨어의 도움말을 참조하기

바랍니다.

36 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

이 DVD로 부팅하려면 BIOS에서 DVD 드라이브가 먼저 부팅하도록 설정해야 합니다(처음부터 그

렇게 설정돼 있는 경우가 많기 때문에 우선은 DVD를 넣은 채로 부팅해보기 바랍니다). 일반적으로

“Startup”이라든지 “Boot”라는 이름의 메뉴에 있지만 자세한 방법은 PC에 따라 다르기 때문에 해당

PC의 설명서(조립 PC라면 메인보드의 설명서)를 참조하기 바랍니다. 부팅하면 VM을 설명할 때 본

그림 2-11과 같은 화면이 표시됩니다. 왼쪽의 리스트 박스에서 아랫부분에 있는 “한국어”를 선택하고,

“Xubuntu 설치” 버튼을 클릭합니다.

이후 절차는 동일하므로 “2.4.3 주분투 설치” 절에서 추가로 설명하겠습니다.

CD-R/RW는 사용할 수 없나요?

크기로.말하자면.주분투.12.04는.아슬아슬하게.CD-R/RW에.기록이.가능하므로.CD-R/RW를.사용해도.괜찮습니

다..이.경우에는.700MB.용량의.공.CD를.사용하기.바랍니다..650MB로는.용량이.부족해서.구울.수.없습니다..또한.

주분투.12.04의.64비트.버전은.731,164,672바이트라서.언뜻.보기에.700MB로는.용량이.부족한.듯하지만.CD-R/

RW의.용량은.일반적으로.1MByte.=.1024.×.1024바이트를.나타내므로.실제로는.구울.수.있습니다(DVD-R/RW

나.HDD는.MB.=.1000.×.1000바이트가.일반적)..우분투의.크기는.버전을.거칠.때마다.증가하고.있으며,.향후.언제.

CD-R/RW에.맞지.않게.될지.모르는.상황입니다..따라서.이.책에서는.DVD-R/RW를.사용하는.것을.기준으로.설명

합니다..지금은.CD-R/RW와.DVD-R/RW가.장당.가격이.서로.거의.비슷하고,.요즘에는.CD-R/RW에만.레코딩할.

수.있는.드라이브는.거의.없을.것이므로.DVD-R/RW를.사용하는.것이.무난할.것입니다..

USB 메모리 사용하기

PC에 DVD-R/RW용 드라이브가 없는 경우 USB 메모리를 사용하는 것이 좋습니다. 사용법은 우분투

사이트에 기재돼 있습니다(http://www.ubuntu.com/download/help/create-a-usb-stick-on-

windows ). 여기서는 방법을 간략하게 설명하겠습니다.

용량이 2GB 이상인 USB 메모리를 준비하고, PC의 USB 포트에 연결합니다. 다음으로 http://

www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/#button을 방문해서

“DOWNLOAD UUI” 아이콘을 클릭해 Universal-USB-Installer라는 소프트웨어의 실행파일을 내

려받습니다. 내려받은 파일을 실행합니다. 먼저 라이선스 확인 화면에서 내용을 확인한 후, “I Agree”

버튼을 눌러 계속 진행합니다(그림 2-13).

2. 개발 환경 구축 37

[그림 2-13] USB 메모리에 Xubuntu의 USB 인스톨러 만들기

“Step 1”에서 “Xubuntu”를 선택합니다. “Step 2”에는 위에서 내려받은 ISO 파일의 위치를 지정합니다.

“Step 3”에는 PC에 연결된 USB 메모리를 지정합니다. USB 메모리에 내용물이 들어있다면 오른쪽에

있는 “Format x:\ Drive (Erases Content )” 체크박스를 체크합니다(여기서 x는 “Step 2”에서 선택

한 드라이브를 가리키며, 이 드라이브의 내용이 모두 지워집니다). “Step 4”는 변경하지 않고 “Create”

버튼을 클릭합니다. 확인용 대화상자가 표시되는데, 여기서 “예(Y )” 버튼을 클릭합니다. USB 메모리

의 속도에 따라 다르지만 10분 정도 기다리면 처리가 종료될 것입니다.

작업이 끝난 후에 이 USB 메모리로 부팅하려면 BIOS 설정에서 USB 메모리로 부팅하도록 설정해야 합

니다. 방법은 PC에 따라 다르기 때문에 해당 PC의 설명서(조립 PC라면 메인보드의 설명서)를 참조하

거나 제조업체의 고객지원센터를 이용하기 바랍니다. 부팅하면 그림 2-14와 같은 화면이 표시되는데,

메뉴에서 “Install Xubuntu”를 커서키로 선택하고 엔터 키를 누릅니다(이 화면은 자동으로 다음 화면

으로 이동해버리므로 조심하기 바랍니다).

38 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-14] USB 메모리로 Xubuntu를 부팅

그 후 GUI 화면이 나타나는데, 왼쪽의 리스트박스에서 “한국어”를 선택하고 “계속” 버튼을 클릭합니다

(그림 2-15).

[그림 2-15] 언어 선택

2. 개발 환경 구축 39

이후부터의 절차는 모든 방법에서 공통이므로 “2.4.3 주분투 설치” 절에서 설명하겠습니다.

리눅스에서 설치용 USB 메모리를 만드는 방법

이미 리눅스가 설치된 PC가 있다면 리눅스에서 생성하는 것이 간단합니다. 많은 배포판에는 “시동 디

스크 만들기”라는 프로그램이 시스템 관련 툴 메뉴에 포함돼 있고(주분투의 경우 시스템 메뉴에 있습니

다), 이것을 사용해 설치용 USB 메모리를 만들 수 있습니다(그림 2-16). 설치 원본 디스크 이미지로

방금 전에 내려받은 ISO 파일을 지정하고, 사용하는 디스크로는 지금 USB 포트에 연결된 USB 메모리

가 표시돼 있는지 확인하고 “시동 디스크 만들기”를 선택합니다(USB 메모리에 파일이 들어있는 경우,

“디스크 지우기” 버튼을 클릭해 내용을 삭제합니다. 삭제한 후에는 다시 USB 메모리가 인식되기까지

몇 초에서 수십 초 정도의 시간이 걸립니다).

[그림 2-16] 리눅스에서 부팅 가능한 USB 메모리 만들기

이 USB 메모리로 부팅하려면 BIOS에서 USB 메모리로 부팅하도록 설정해야 합니다. 방법은 PC에 따

라 다르므로 해당 PC 설명서를 참조하거나 제조업체의 고객지원센터를 이용하기 바랍니다. 부팅하

면 그림 2-11과 같은 화면이 나타나는데, 왼쪽 리스트박스의 아랫부분에 있는 “한국어”를 선택하고,

“Xubuntu 설치”를 클릭하기 바랍니다.

40 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

2.4.3 주분투 설치

위에서 설명한 방법 중 하나를 이용해 준비 작업을 실시하고 설치를 실행하면 설치 방법과 상관없이 공

통적으로 그림 2-17과 같은 화면이 나타납니다.

여기서는 2개의 체크박스를 모두 체크하고 다음에 나오는 설명대로 PC를 네트워크에 연결하고 계속합

니다. 유선 LAN의 경우 DHCP를 사용할 수 있는 환경이라면 자동으로 인식되어 네트워크에 연결됩니

다. 무선 LAN의 경우에는 위쪽의 체크박스는 비활성화되므로 아래쪽의 체크박스만 체크합니다. “계속”

버튼을 누르면 액세스 포인트의 목록이 표시되므로 자신이 사용하는 액세스 포인트를 지정해 연결합니

다.

[그림 2-17] 설치 프로그램의 초기 화면

그다음으로 설치할 가상 HDD에 파티션을 지정합니다. 그림 2-18은 버추얼박스를 사용한 예입니다.

가상 HDD 전체를 주분투로 지정할 것이므로 “디스크를 지우고 Xubuntu 설치”를 선택한 후 “계속” 버

튼을 클릭합니다.

2. 개발 환경 구축 41

[그림 2-18] 설치할 가상 HDD에 파티션을 지정

확인을 위한 화면이 표시되고, “지금 설치(I )”를 클릭합니다(그림 2-19).

[그림 2-19] 디스크의 파티션 삭제 확인

42 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

윈도우가 이미 설치돼 있는 PC에서 설치 프로그램을 시작했다면 “Xubuntu를 함께 사용 가능한 형태로

설치”라는 메뉴가 표시됩니다. 윈도우와 듀얼부팅 형태로 설치하려면 이 메뉴를 선택합니다. 이어서 주

분투와 윈도우의 디스크 용량을 각각 어떻게 나눌 것인지 결정하는 화면이 나타납니다. 윈도우와 리눅

스 사이의 경계선은 마우스로 드래그할 수 있기 때문에 위치를 결정하고 설치 버튼을 클릭합니다.

“어디에 살고 계신가요?” 화면(그림 2-20)에 “Seoul”이라고 표시돼 있습니다. 그대로 두고, “계속” 버

튼을 클릭해 진행합니다.

[그림 2-20] 언어 선택

그다음 순서인 키보드 배치 선택(그림 2-21)도 일반적인 윈도우 시스템용 키보드라면 그냥 한글 키보

드를 선택합니다.

2. 개발 환경 구축 43

[그림 2-21] 키보드 배치 선택

다음 화면에서 사용자 이름과 비밀번호를 입력합니다. “자동으로 로그인”을 선택하면 OS 부팅 시 자동

으로 로그인합니다(그림 2-22).

[그림 2-22] 사용자 이름과 비밀번호 지정

44 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

이후에는 자동으로 설치가 진행되며 마지막 단계에서 재부팅을 요구하는데, 이때는 설치에 사용했던 매

체(DVD 또는 USB 메모리)를 분리하고 재부팅합니다. VM을 사용하고 있는 경우에는 설정의 저장소

(그림 2-10)에서 추가했던 CD-ROM에 마우스 오른쪽 버튼을 클릭해 할당을 해제합니다. 재부팅 후

위쪽 패널에 빨간색 아이콘이 표시되는데 이 아이콘을 클릭해 “업데이트 보이기”를 선택합니다(그림

2-23).

[그림 2-23] “업데이트 보이기”를 선택

업데이트 관리자 윈도우가 나타나면 “업데이트 설치(I )” 버튼을 클릭합니다(그림 2-24).

2. 개발 환경 구축 45

[그림 2-24] “업데이트 설치(I)” 버튼을 클릭

설치 후 빨간색 아이콘의 오른쪽에 재부팅을 요구하는 아이콘이 표시되는데, 이 아이콘을 클릭해 재부

팅합니다. 재부팅 후에도 다시 빨간색 아이콘이 표시되면 또 한 번 업데이트를 설치합니다.

또한 VM을 사용하는 경우 이쯤에서 게스트 확장(Guest Addition )을 설치하는 것이 좋습니다. 게스트

확장을 설치하면 화면의 해상도를 높이거나 클립보드를 공유하는 기능이 추가됩니다. 버추얼박스의 “장

치” 메뉴에서 “게스트 확장 설치”를 선택합니다. 그러면 해당 CD가 마운트되고, 바탕화면에 CD의 아이

콘이 나타납니다(그림 2-25).

46 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-25] “게스트 확장” CD 이미지를 마운트

Ctrl 키를 누른 상태에서 Esc 키를 누르면 메뉴가 표시되며, 여기서 “Open Terminal Here”를 클릭합

니다(이후 터미널로 표기). 터미널에 다음과 같이 입력합니다.

$ cd /media/VBOXADDITIONS_4.3.16_95972

$ sudo ./VBoxLinuxAdditions.run

첫 번째 행에서 지정하는 "/media/VBOXADDITIONS_4.3.16_95972"는 그림 2-25에 나타난 창의 위쪽에 표시

되는 경로입니다. "cd /media/VBOX" 근처까지 입력하고 “탭( Tab )” 키를 누르면 나머지는 자동완성으로

입력됩니다. 두 번째 줄도 "sudo ./VBoxL"까지 입력하고 Tab 키를 누르면 나머지는 자동완성으로 입력

됩니다. 비밀번호를 물어보면 설치할 때 지정했던 비밀번호를 입력합니다(그림 2-26).

2. 개발 환경 구축 47

[그림 2-26] “게스트 확장” 설치하기

이상으로 주분투 설치가 완료됐습니다. 이제 개발 환경을 설치할 차례입니다.

2.5 이클립스 설치하기

이클립스(Eclipse )는 자바용 IDE로 유명하지만 C/C++ 개발에 사용할 수 있는 버전도 있습니다. 이

책에서는 이클립스를 IDE로 사용합니다. 이클립스를 사용하려면 자바가 필요하므로 먼저 자바를 설치

해야 합니다.

2.5.1 자바 설치하기

Ctrl + Esc 키를 눌러 “프로그램(A )” - “시스템” - “시냅틱 패키지 관리자”를 선택합니다. 비밀번호를

묻는 메시지가 나타나면 설치할 때 입력한 자신의 사용자 비밀번호를 입력합니다. “Quick filter” 입력

영역에 “jdk”를 입력하고 조금 기다리면 "openjdk - 7 - jdk"가 다른 패키지와 함께 목록에 나타나는데

여기서 마우스 오른쪽 버튼을 클릭하고 “설치 표시”를 선택합니다(그림 2-27).

48 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

“추가적으로 필요한 사항을 함께 표시하겠습니까?”라는 대화상자가 나타나면 “표시(M )”를 클릭합니

다. “시냅틱 패키지 관리자” 창 윗부분의 “적용” 버튼을 누를 수 있게 바뀌면 해당 버튼을 클릭합니다.

“요약” 대화상자가 나타나면 “적용(A )” 버튼을 누릅니다. 설치가 끝나면 “시냅틱 패키지 관리자”를 닫

습니다.

[그림 2-27] openjdk-7-jdk 패키지 설치

2. 개발 환경 구축 49

2.5.2 이클립스 설치하기

Ctrl + Esc 키를 누르고, “프로그램(A ) - 인터넷 - Firefox 웹 브라우저”를 선택합니다. 이클립스 사이

트(http://www.eclipse.org/)를 웹 브라우저로 열고, “Download”를 클릭합니다(그림 2-28).

[그림 2-28] 이클립스 사이트

여기서 “Eclipse IDE for C/C++ Developers”를 다운로드합니다. 운영 중인 OS의 종류에 따라

“32Bit” 또는 “64Bit”를 선택합니다. 참고로 이클립스 사이트는 사이트에 접속한 PC의 OS에 해당하는

파일을 자동으로 표시하게 돼 있습니다. 따라서 윈도우 PC에서 접속하면 윈도우용 파일이 표시될 것입

니다. 운영체제에 따라 내려받을 파일의 종류는 목록의 오른쪽 상단에 있는 드롭다운 메뉴에서 선택할

수 있습니다. 리눅스 이외의 OS를 사용하는 경우에는 이 드롭다운 메뉴를 “Linux”로 변경합니다. 이 책

을 집필하는 시점에서의 최신 버전은 “4.4-SR1”이며, 이 책에서는 이 버전을 사용합니다(그림 2-29).

50 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-29] Eclipse IDE for C/C++ Developers 다운로드

브라우저가 다운로드 파일을 저장할 위치

주분투의.기본.브라우저인.파이어폭스가.내려받은.파일을.저장하는.위치는.홈.디렉터리(리눅스의.홈.디렉터리는.“/

home/자신의.아이디”).아래의.“다운로드”라는.디렉터리이지만.이.위치는.파이어폭스에서.우측.상단에.있는.“메뉴.

버튼.-.환경설정.-.다운로드”를.선택해서.나타나는.대화상자에서.변경할.수.있습니다..필자는.파일을.저장하는.위

치를./tmp로.변경했습니다..또한.주분투에서는.기본적으로.홈.디렉터리에.이러한.한국어.이름의.디렉터리를.몇.가

지.포함하고.있지만.이러한.디렉터리는.터미널에서.사용할.때.불편하기.때문에.필요에.따라.영어.이름으로.변경하

면.편리할.것입니다..이를.변경하려면.터미널에서.다음과.같이.입력합니다.

LANG=C xdg-user-dirs-gtk-update

“Update.standard.folders.to.current.language?”라는.대화상자가.나타나면.“Update.Names”.버튼을.클릭합니다

(그림.2-30).

2. 개발 환경 구축 51

[그림 2-30] 디렉터리명 변경

그러고.나면.홈.디렉터리.아래에.있는.디렉터리의.한글.이름이.영어.이름으로.바뀝니다.

파일을 내려받은 다음 압축을 풉니다. 여기서는 홈 디렉터리에 설치합니다. 터미널을 열고(터미널은 위

에서 설명했듯이 Ctrl + Esc 키를 누르고, “Open Terminal Here”를 선택해서 열 수 있습니다) 다음과

같이 입력합니다.

$ cd

$ tar xf /tmp/eclipse-cpp-juno-SR1-linux-gtk.tar.gz

이 예제에서는 /tmp에 내려받은 경우를 나타내므로 자신이 내려받은 위치에 맞춰 입력하기 바랍니다.

또한 파일명은 내려받은 이클립스의 버전에 따라 다르기 때문에 /tmp/eclipse 근처까지 입력하고 Tab

키를 눌러 파일명을 완성하는 것이 좋습니다.

이제 이클립스를 설치했으므로 다음으로 이클립스를 쉽게 실행할 수 있게 설정하겠습니다. 터미널에서

다음과 같이 입력합니다(“~”는 홈 디렉터리를 나타냅니다).

$ mkdir ~/bin

이렇게 하면 홈 디렉터리에 bin이라는 디렉터리가 만들어집니다. 일단 로그아웃한 후(왼쪽 상단의 쥐

모양 아이콘을 클릭하고 “로그아웃”을 선택합니다. 이 쥐모양의 아이콘을 이후 “애플리케이션 메뉴”라

고 지칭하겠습니다) 다시 로그인합니다. 이제 ~/bin 아래에 둔 파일을 실행할 수 있게 됐습니다. 터미

널에서 다음과 같이 입력합니다.

52 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

$ cd ~/bin

$ ln -s ~/eclipse/eclipse

이렇게 하면 ~/bin이라는 디렉터리에 이클립스를 실행하기 위한 심볼릭 링크가 만들어집니다(윈도우

의 바로 가기와 같은 것입니다). Alt + F2 를 입력하면 대화상자가 표시되는데, 여기에 “eclipse”라고

입력하고 Enter 키를 누르면 이클립스를 실행할 수 있습니다(그림 2-31).

[그림 2-31] 프로그램 실행 대화창에서 이클립스를 실행

마우스를 이용해 실행하고 싶다면 파일 관리자를 열고(애플리케이션 메뉴의 보조 프로그램의 아래에 있

음) eclipse 디렉터리의 eclipse를 더블클릭하면 됩니다. 또한 eclipse에서 마우스 오른쪽 버튼을 클릭

해 “보내기(S )” - “데스크톱 (링크(들) 만들기)”를 선택하면 바탕화면에 링크를 만들 수 있습니다.

2.5.3 기타 툴 설치

이클립스를 사용할 때 다음과 같은 툴이 필요하므로 설치해야 합니다.

툴 설명

build-essential 개발.툴.세트

gdb GNU.디버거

git 소스코드.형상.관리.도구.중.하나

툴 설치는 자바를 설치할 때 봤듯이 시냅틱 패키지 관리자를 이용해 진행할 수도 있지만 이번에는 터미

널에서 실행하는 방법을 알아보겠습니다. 터미널에서 다음과 같이 입력합니다.

$ sudo apt-get install build-essential gdb git

비밀번호를 물어올 때 비밀번호를 입력하면 그 후에는 자동으로 설치가 진행됩니다. 이 책에서는 이후

apt-get 명령을 사용하는 방향으로 진행하겠지만 시냅틱 패키지 관리자를 사용하는 방법도 apt-get 명

령을 사용하는 방법과 결과는 동일하므로 원하는 방식을 선택하기 바랍니다.

2. 개발 환경 구축 53

git는 소스코드의 변경을 관리하기 위한 툴입니다(이후 SCM로 표기). SCM에는 git 말고도 CVS나 서

브버전(Subversion )이 있습니다. 이 책에서는 SCM에 대해서는 다루지 않을 것이므로 필요에 따라 다

른 책을 참조하기 바랍니다.

2.6 이클립스의 기본 사용법

그럼 이번에는 이클립스를 이용한 개발 방법에 대해 살펴보겠습니다.

2.6.1 Hello, world

이클립스를 이용해 유명한 Hello, world 프로그램을 작성해보겠습니다. 이클립스를 시작하면 워크스

페이스를 선택하는 화면이 나타납니다. 기본값은 홈 디렉터리 아래의 workspace 디렉터리입니다. 작업

영역이 무엇을 의미하는지에 대해서는 나중에 설명하기로 하고, 우선은 그대로 OK 버튼을 클릭해 진행

합니다(그림 2-32).

[그림 2-32] 워크스페이스 지정

EGit가 Git를 찾을 수 없다는 대화상자가 나타나면(그림 2-33) git가 설치돼 있지 않다는 것을 나타냅

니다. “2.5.3 기타 툴 설치”를 참조해 git을 설치하기 바랍니다.

54 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-33] git가 설치돼 있지 않은 경우에 나타나는 대화상자

처음에는 “Welcome”이라는 뷰가 나타나는데, “Welcome” 탭의 오른쪽에 있는 “X”를 클릭해 닫습니

다(그림 2-34).

[그림 2-34] “Welcome” 뷰

이제 프로젝트를 만들겠습니다. 프로젝트라는 것이 무엇을 의미하는지에 대해서는 나중에 설명하겠습

니다. 일단은 여기에 설명한 대로 작업을 진행하기 바랍니다. 메뉴에서 “File” - “New” - “C Project”

를 선택합니다(그림 2-35).

[그림 2-35] 새 프로젝트 생성

“Project name”에는 “helloworld”를 입력하고 “Project type”은 “Executable”의 “Hello World

ANSI C Project”를, “Toolchains”에서는 “Linux GCC”를 선택하고 “Finish” 버튼을 클릭합니다(그림

2-36).

[그림 2-36] “C Project” 대화상자

그러고 나면 Hello, world 애플리케이션이 자동으로 만들어집니다(그림 2-37).3

[그림 2-37] 생성된 Hello, world 애플리케이션

프로젝트가 만들어졌으면 컴파일합니다. “Project” - “Build All”을 선택합니다. “Console” 뷰에 컴파

일 과정이 표시됩니다(그림 2-38).

[그림 2-38] 프로젝트 컴파일

3 하단의 Problems 탭에 “Program g++ not found in PATH”라는 오류가 발생하면 터미널에서 다음과 같은 명령을 실행해 g++를 설치합니다.

sudo apt-get install g++

2. 개발 환경 구축 57

컴파일이 끝나면 프로그램을 실행해 봅니다. 소스코드 상에서 마우스 오른쪽 버튼을 클릭하고, “Run

As” - “Local C/C++ Application”을 선택합니다(그림 2-39).

[그림 2-39] 프로젝트 실행

“Console” 뷰에 “!!!Hello World!!!”가 표시되면 성공한 것입니다(그림 2-40).

[그림 2-40] Hello, world 실행 결과

58 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

2.6.2 리뷰

지금까지 살펴본 대로 이클립스 화면은 여러 구획으로 나뉘어 있음을 알 수 있습니다. 각 영역을 뷰라고

합니다. 기본적으로 왼쪽에 “Project Explorer”라는 뷰가 있고, 이곳에서 프로젝트에 포함된 파일과 그

구성을 볼 수 있습니다. 중앙의 윗쪽에는 파일의 내용이 표시됩니다(일반적으로 소스코드). 오른쪽에

는 현재 보고 있는 파일의 구조가 표시됩니다.

이클립스의 기능은 각 뷰에서 제공합니다. 어떤 뷰가 있는지는 “Window” - “Show View” - “Other”

를 선택해서 확인할 수 있습니다.

뷰를 실수로 닫아 버렸다! 뷰의 배치가 이상해져 버렸다!

각.뷰.옆에는.“X”.아이콘이.있습니다..아직.익숙하지.않을.때는.호기심에.혹은.실수로.아이콘을.클릭했는데.뷰가.없

어져버려서.당황하게.될지도.모릅니다..이.경우.본문에서.설명한.대로.“Window”.-.“Show.View”에서.뷰를.클릭해.

복원할.수.있습니다(시험.삼아.Project.Explorer를.닫고.복원해보기.바랍니다)..또한.뷰는.마우스로.드래그.앤.드롭

해서.원하는.위치에.배치할.수.있습니다..이것으로.엉망이.됐다면.“Window”.-.“Reset.Perspective”를.선택해.초기.

배치.상태로.되돌릴.수.있습니다(퍼스펙티브에.관해서는.나중에.설명합니다).

2.6.3 프로젝트와 워크스페이스 그리고 퍼스펙티브

이클립스를 비롯한 IDE에는 독특한 개념이 있습니다. 알고난 다음에는 전혀 어려운 개념이 아니지만

처음에는 생소한 탓도 있어 꽤나 당황할 수도 있습니다. 이번에는 이러한 프로젝트 워크스페이스, 퍼스

펙티브에 대해 쉽게 그 개념을 설명하겠습니다. 여기서는 잘 이해하지 못하더라도 사용하다 보면 익숙

해질 것이기 때문에 걱정할 필요가 없습니다.

프로젝트

프로젝트는 애플리케이션이나 애플리케이션을 구성하는 어떤 정해진 단위를 저장하기 위한 그릇입니

다. 좀 더 구체적으로 설명하면 애플리케이션이나 라이브러리를 구성하는 소스코드를 저장하기 위한 그

릇이라고 할 수 있습니다. 그림 2-36에서 “Project type”을 다시 잘 살펴보기 바랍니다. 거기에는 실행

모듈(Executable )이나 라이브러리 같은 프로젝트 타입이 있음을 알 수 있습니다. 프로젝트는 소스코

드 외에도 리소스 파일 같은 설정 파일이나 빌드 정보(C의 경우 Makefile 같은)를 포함할 때도 있습니

다.

2. 개발 환경 구축 59

워크스페이스

워크스페이스는 관련된 여러 프로젝트를 저장하기 위한 그릇입니다. 일정 규모 이상의 애플리케이션이

되면 하나의 프로젝트로는 관리하기 힘들어지므로 여러 프로젝트로 분할해야 할 필요성이 생깁니다. 이

때 프로젝트가 흩어져 있으면 관리하기 어렵기 때문에 하나의 워크스페이스에 넣어 편리하게 관리합니

다.

또한 이클립스의 설정은 프로젝트 단위로 할 수도 있고 워크스페이스 단위로 할 수도 있습니다. 여러 프

로젝트에 공통으로 해당하는 설정은 워크스페이스를 설정하는 부분에서 하고, 각 프로젝트 고유의 설정

은 프로젝트 설정 부분에서 하면 되므로 설정에 대한 수고를 줄일 수 있습니다. 단, 키바인딩 설정 등 워

크스페이스 쪽에만 설정이 있는 것도 있습니다.

퍼스펙티브

이미 살펴본 대로 이클립스의 화면은 상세히 나눠져 있습니다. Hello, world 애플리케이션을 표시한

창을 살펴보기 바랍니다(그림 2-41).

1

2 3

4

5

[그림 2-41] 이클립스의 화면 구성

60 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

왼쪽에 Project Explorer가 있고(➊), 이곳에서 프로젝트에 어떤 파일이 있는지 확인할 수 있습니다.

중앙 위쪽에 소스코드가 표시됩니다(➋). 오른쪽에는 소스코드의 내부 구조가 표시됩니다(➌). 그리고

하단부에는 애플리케이션의 출력 결과가 표시됐습니다(➍). 이것들을 이클립스에서는 뷰라고 합니다.

이클립스는 다양한 뷰를 제공함으로써 하나의 창에 다양한 정보를 동시에 표시합니다. 화면에 어떤 뷰

를 어떤 배치로 나타내는지를 정의한 것이 퍼스펙티브입니다. 이 그림에 표시된 것은 C/C++ 퍼스펙티

브로서 ➎의 부분에 어떤 퍼스펙티브를 표시하고 있는지를 나타냅니다.

퍼스펙티브를 직접 만들 수도 있습니다. 위에서 언급했듯이 뷰는 마우스로 드래그 앤드 드롭으로 옮기

거나 “×”를 클릭해 닫을 수 있습니다. 그 상태에서 “Window” - “Save Perspective As”를 선택하면

다른 이름으로 저장할 수 있습니다. 저장해 두면 언제든지 ➎의 + 표시가 된 아이콘을 클릭해 해당 퍼스

펙티브를 불러올 수 있습니다.

화면이 좁아요

이클립스는.다양한.정보를.뷰로.나누어.표시하기.때문에.기본.퍼스펙티브로는.소스코드를.표시할.수.있는.공간도.

작아져.버립니다..이는.소형.노트북.등을.사용하는.경우에는.중요한.문제일.것입니다..이.경우.뷰의.제목.부분을.더

블클릭해서.뷰를.최대화할.수.있습니다(되돌릴.때도.동일한.방법으로.되돌립니다)..단축키로는. Ctrl + M 을.입력하

면.됩니다..물론.키바인드(단축키)는.변경할.수.있습니다..“Window”.-.“Preferences”에서.“General”.-.“Keys”를.

선택하고,.검색란에.“max”라고.입력한.뒤에.나오는.“Binding”에서.마음에.드는.키.조합으로.변경할.수.있습니다(그

림.2-42).

[그림 2-42] 키바인드 변경

2. 개발 환경 구축 61

2.7 이클립스의 기능

마지막으로 이클립스의 주요 기능을 몇 가지 살펴보겠습니다.

2.7.1 비주얼 디버거

먼저 디버거 기능을 살펴보겠습니다. 하지만 이번 Hello, world 애플리케이션은 디버깅하기에는 너무

간단하기 때문에 helloworld.c의 내용을 수의 계승을 계산하는 것으로 수정합니다.

#include <stdio.h>

#include <stdlib.h>

int factorial(int n) {

if (n < 2) return 1;

return n * factorial(n - 1);

}

int main(void) {

int n;

for (n = 0; n < 5; ++n) {

printf("%d! = %d\n", n, factorial(n));

}

return EXIT_SUCCESS;

}

프로그램을 실행하면 다음과 같은 결과가 표시됩니다.

0! = 1

1! = 1

2! = 2

3! = 6

4! = 24

62 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

폰트 크기 바꾸기

기본.폰트.크기를.변경하려면.“Window”.-.“Preferences”를.선택하고,.“General”.-.“Appearance”.-.“Colors.

and.Fonts”를.선택합니다..“Basic”.아래에서.“Text.Font”를.선택하고.“Edit”.버튼을.누르면.폰트.선택.화면이.나타

납니다..그림.2-43에서는.“Monospace”라는.폰트에.크기로.10을.지정한.예를.볼.수.있습니다.

[그림 2-43] 폰트 변경

브레이크포인트와 스텝 실행

이제 디버깅을 해봅시다. factorial 함수의 입구에 브레이크포인트를 놓습니다. 브레이크포인트를 설정

하려면 해당 행의 왼쪽 여백 부분을 더블클릭하면 됩니다. 파란색 원은 그곳에 브레이크포인트가 설정

됐음을 나타냅니다(그림 2-44).

그림 2-44 브레이크포인트 설정

2. 개발 환경 구축 63

소스코드에서 마우스 오른쪽 버튼을 클릭하고 “Debug As” - “Local C/C++ Application”을 선택합

니다. 퍼스펙티브를 “Debug”로 전환할지 묻는 대화상자가 나타나면 “Remember my decision”에 체

크하고 Yes를 클릭합니다(그림 2-45).

[그림 2-45] 퍼스펙티브의 변경을 확인하는 대화상자

이제 “Debug”용 퍼스펙티브로 전환되어 자동으로 프로그램의 시작점에서 정지한 상태가 됩니다(그림

2-46). 디버거 퍼스펙티브에서는 왼쪽 상단에 스택이(➊), 오른쪽 상단에 지역 변수가 표시되고(➋),

중앙에 소스코드와 현재 실행 중인 행이 표시됩니다(➌).

12

3

[그림 2-46] 브레이크포인트로 프로그램이 중단된 상태

64 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

화면을 넓게 사용할 수 있는 경우

이전에.화면이.좁을.경우에.대해.이야기했으므로.이번에는.화면을.넓게.사용할.수.있는.경우에.대해.이야기하겠습

니다..여러.대의.모니터를.PC에.연결하는.등의.이유로.화면을.넓게.사용할.수.있는.경우에는.단순히.이클립스.창을.

크게.할.수.있을.뿐.아니라.각.뷰를.분리해서.배치할.수.있습니다..예를.들어,.변수가.많은.경우에는.“Variables”.뷰

가.넓은.편이.좋을.것입니다..이.경우.마우스로.“Variables”.탭을.드래그해서.이클립스.창.밖으로.끌어내면.독립된.

창으로.표시됩니다(그림.2-47).

[그림 2-47] “Variables” 뷰를 독립된 창으로 만든다

그리고.이.상태를.저장해둡니다..“Window”.-.“Save.Perspective.As...”를.선택하고.Debug를.선택합니다(그림.

2-48).

[그림 2-48] 퍼스펙티브 저장

이제.디버깅할.때마다.저장한.상태대로.화면이.배치됩니다..이전으로.되돌리고.싶다면.마찬가지로.“Variables”.탭

을.마우스를.사용해.원래.위치로.드래그하면.되돌아갑니다.

2. 개발 환경 구축 65

우선 프로그램을 계속해서 실행해 자신이 설정한 브레이크포인트의 위치(factorial 함수의 입구)까

지 진행합니다. 그렇게 하려면 “Resume”을 실행합니다. 아이콘을 클릭하거나 F8 키를 누르면 됩니다

(Resume과 Run 아이콘은 생김새가 비슷하므로 주의해야 합니다). 그림 2-49는 factorial에서 정지

한 모습입니다.

현재.위치

호출원

[그림 2-49] 브레이크포인트로 정지한 결과

스택을 살펴보겠습니다. 호출한 main()과 현재 위치인 factorial()이 표시돼 있습니다. 여기서 main ( )

을 클릭하면 소스코드에서 main ( ) 함수의 위치가 표시됩니다. 다시 F8 키를 눌러 “Resume”합니다.

“Console” 출력에 "0 ! = 1"이라고 표시되고 브레이크포인트의 위치에서 정지합니다. 현재 n이 1이라

는 점에 주의하기 바랍니다. factorial은 n이 0이나 1일 때는 곧바로 리턴해 버리므로 다시 “Resume”을

누릅니다. 이번에는 n이 2에서 정지합니다. 디버거 내에서 한 행만 실행하고 싶을 때는 “Step into”( F5

키) 및 “Step over”( F6 키)를 사용합니다. “Step into”는 그 위치에 함수 호출이 있으면 그 함수로 들

어가 정지합니다. “Step over”는 현재의 한 행을 실행하고 다음 행에서 정지합니다(즉 현재 행에 1개 이

상의 함수 호출이 있으면 그것들을 모두 실행하는 것입니다). 그러면 우선 F6 키로 “Step over”하겠습

니다. "return n * factorial(n - 1);" 행에서 정지할 것입니다. 그런 다음 F5 키로 “Step into”합니다.

그러면 다시 factorial의 첫 부분에서 정지하고 n이 1로 돼 있을 것입니다. 이는 factorial(n - 1)을 실

행하려고 했는데 n = 2였기 때문에 결과적으로 factorial(1)을 실행하려 한 것과 마찬가지이기 때문입

니다. 스택을 살펴보기 바랍니다(그림 2-50).

66 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-50] 재귀 호출

main() 위에 factorial()이 두 개 쌓여 있습니다. 첫 번째는 factorial(2)이고, 두 번째가 factorial(1)

입니다. 각각을 클릭해 Variables 뷰 상의 n의 값을 확인해 보기 바랍니다. 디버깅을 종료하려면 를

클릭하거나 Ctrl + F2 키를 누릅니다.

다음으로 브레이크포인트에 조건을 붙여 보겠습니다. 브레이크포인트는 기본적으로 해당 위치의 코드

가 실행됐을 때는 항상 정지하지만 다음과 같은 조건을 붙일 수 있습니다.

● 조건이 성립했을 때 정지하기

● 그 위치의 코드가 n번째로 실행된 경우에 정지하기

두 조건의 예를 살펴보겠습니다.

특정 조건이 성립했을 때 정지하기

오른쪽 상단의 “Breakpoints” 뷰에서 이번에 설정한 브레이크포인트에 마우스 오른쪽 버튼을 클릭한

후 “Breakpoint Properties...”를 클릭합니다(그림 2-51).

2. 개발 환경 구축 67

[그림 2-51] “Breakpoints” 뷰

“Condition”에 "n == 4"라고 입력합니다(그림 2-52).

[그림 2-52] 브레이크포인트에 조건을 지정

이렇게 해두면 n의 값이 4인 경우에만 정지하게 됩니다. 이전과 마찬가지로 소스코드 위에서 마우스 오

른쪽 버튼을 클릭하고 “Debug As” - “Local C/C++ Application”을 선택합니다. 처음에는 main()에

서 멈추며, 이때 “Resume”합니다

정지한 곳을 보면 “Console”은 "3 ! = 6"에서 출력이 끝나고, “Variables”에는 n의 값이 4로 표시되는

것을 알 수 있습니다(그림 2-53). 이 기능은 특정 조건에서만 발생하는 버그를 찾고자 할 때 편리합니

다.

68 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-53] “n == 4”에서 프로그램이 정지

특정 위치가 n번째로 실행되면 정지하기

마찬가지로 “Ignore count”에 0 이외의 숫자를 넣으면 지정된 횟수만큼 브레이크포인트를 무시합니다.

조건(“Condition”)과 “Ignore count”를 모두 지정할 수도 있습니다. 이 경우에는 “지정된 조건”이 “지

정된 횟수+1”번째에 성립한 곳에서 정지하게 됩니다.

변수의 값 변경하기

조건부 브레이크포인트를 사용하면 n이 특정 값을 가질 때의 동작 방식을 확인할 수 있었습니다. 하지

만 이번처럼 함수의 동작 방식만을 보고 싶다면 더 간단한 방법이 있습니다. n의 값을 직접 변경해 버리

면 됩니다. 브레이크포인트에서 조건을 삭제하고, “Ignore count”를 0으로 되돌리고, 다시 factorial의

시작 부분에서 멈추게 합니다. “Variables”의 부분에서 Value를 클릭하면 편집할 수 있으므로 거기에

“4”를 입력합니다(그림 2-54).

2. 개발 환경 구축 69

[그림 2-54] 변수의 값을 변경

브레이크포인트를 제거하고(브레이크포인트의 파란 동그라미 표시를 더블클릭하면 제거할 수 있습니

다) “Resume”하기 바랍니다. “Console”을 보면 0!일 때의 결과가 4!일 때와 동일한 24로 출력된다는

것을 알 수 있습니다.

0! = 24

1! = 1

2! = 2

3! = 6

4! = 24

2.7.2 탐색

탐색 기능은 IDE가 제공하는 기능 중에서도 가장 자주 사용하는 기능일 것입니다. 다음은 앞에서 사용

한 계승 계산 코드에 약간의 코드를 추가한 것입니다(탐색 기능을 보기 위한 것으로, 코드의 논리 자체

는 의미가 없습니다).

static int n;

void init(void) {

n = 0;

}

int factorial(int n) {

if (n < 2) return 1;

return n * factorial(n - 1);

}

그림 2-55는 static 변수 n을 정의한 라인에 커서를 둔 상태를 보여줍니다. 바로 아래에 있는 init 함수

내의 n에 마크 표시가 됐음을(배경색이 회색이 됨) 알 수 있습니다. 한편, factorial() 함수 안의 n에는

마크 표시가 없습니다.

70 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-55] static 변수에 마크 표시가 된 모습

마찬가지로 factorial() 함수 안의 n에 커서를 두고 본 것이 그림 2-56입니다. 이번에는 factorial()

함수 안의 n에만 표시가 되고 static 변수 쪽에는 마크가 표시되지 않음을 알 수 있습니다.

[그림 2-56] factorial()의 인자 n에 마크 표시된 모습

이처럼 이클립스에서는 단순히 이름뿐 아니라 문맥을 판단해 변수를 구별한다는 사실을 알 수 있습니

다. 단순히 이름에 마크 표시가 된 것 뿐이지만 이 기능은 짧은 변수명을 자주 사용하는 C 언어 프로그

램을 작성할 때 매우 편리한 기능입니다. 마찬가지로 factorial() 함수의 이름 위에 커서를 두면 모든

factorial() 함수에 마크가 표시된다는 것을 알 수 있습니다.

어셈블리 코드 보기

C/C++.코드를.디버깅할.때.어셈블리.코드를.보고.싶을.때가.많습니다(특히.C++.프로그램을.디버깅할.때)..어셈블

리.코드를.보면.컴파일러가.소스코드를.어떻게.해석했는지.금방.알.수.있습니다..어셈블리.코드를.보고.싶은.경우에

는.디버그를.실행할.메뉴에서.“Run”.-.“Instruction.Stepping.Mode”를.체크합니다..그럼.그림.2-57과.같이.어셈블

된.코드가.표시되며.기계어.코드.레벨에서.스텝을.실행할.수.있게.됩니다..“Registers”.뷰에서.범용.레지스터의.내

용도.확인할.수.있습니다.

2. 개발 환경 구축 71

[그림 2-57] 어셈블리 코드 보기

점프

이클립스에는 탐색 기능이 있어서 이 기능을 이용하면 함수나 변수 등이 정의된 지점으로 점프하거나

그 반대로 함수가 정의된 부분에서 그 함수를 호출하는 위치를 확인할 수 있습니다.

선언한 곳으로 가기

F3 키를 누르면 선언한 곳으로 이동할 수 있습니다. 예를 들어, factorial()를 호출하는 곳에 커서를 두

고 F3 키를 누르면 factorial() 함수가 선언된 부분으로 이동할 수 있습니다. 변수 n이 사용된 위치에

커서를 놓고 F3 키를 누르면 n이 선언된 부분으로 이동할 수 있습니다. 자신이 만든 함수에만 이 기능이

적용되는 것은 아닙니다. printf()에 커서를 놓고 F3 키를 누르면 stdio.h 내부의 printf()가 선언된 부

분으로 이동할 수 있습니다. include 문의 파일명 부분에 커서를 놓고 F3 을 누르면 해당 include 파일로

이동할 수 있습니다. 이 기능은 특히 복잡한 매크로에서 어떤 헤더 파일이 인클루드(include)돼 있는지

알고 싶을 때 유용합니다.

또한 점프하지 않고 선언부를 들여다 볼 수 있습니다. 그림 2-58은 main() 함수의 factorial()을 호출

하는 부분에 마우스 커서를 뒀을 때의 모습입니다.

72 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

[그림 2-58] factorial 함수의 정의를 들여다 볼 수 있다.

마찬가지로 그림 2-59는 printf() 상에 마우스 커서를 뒀을 때의 모습입니다. 이처럼 현재 위치를 떠나

지 않고 선언부를 확인할 수 있습니다.

[그림 2-59] printf 함수의 정의를 들여다 볼 수 있다.

사용하는 부분 추려내기

위와는 반대로 해당 함수가 사용된 부분을 찾을 수도 있습니다. factorial() 함수에 커서를 놓고 Ctrl

+ Alt + H 키를 누르면 그림 2-60과 같은 화면이 나타납니다.

[그림 2-60] factorial 함수를 사용한 부분을 표시

보다시피 factorial() 함수가 호출되는 위치가 나열돼 있습니다. 각각을 더블클릭하면 호출되는 위치로

점프할 수도 있습니다.

돌아가기

Alt + ← 키를 누르면 이전 위치로 돌아갈 수 있습니다. 이 기능을 이용하면 F3 키로 선언을 확인한 후

원래 위치로 돌아올 수 있습니다. 반대로 Alt + → 키를 눌러 앞으로 진행할 수도 있습니다.

헤더와 소스 사이의 점프

C에서는 Ctrl + Tab 을 사용해 헤더와 소스 사이를 오가는 경우가 종종 있습니다.

2.7.3 컨텐트 어시스트

IDE를 좋아하는 사람들을 대상으로 각자 좋아하는 기능에 대해 인기 투표를 하면 아마 컨텐트 어시

스트가 높은 순위를 차지할 것입니다. main() 함수 안에서 함수 호출이 가능한 위치(예를 들어 return

문 앞에 줄)에서 "fact"까지 입력하고 Alt + / 키를 입력해보기 바랍니다. 입력 내용이 자동완성되어

factorial()로 바뀌며, 인자에 대한 설명이 나타납니다(그림 2-61).

[그림 2-61] factorial 함수 호출을 입력할 때의 자동완성 기능

마찬가지로 그림 2-62는 "prin"까지 입력하고 Alt + / 키를 입력했을 때의 모습입니다. 이후 여러 종류

의 인자를 설명하는 목록이 나타나서 그 중에서 하나를 선택할 수 있게 됩니다.

[그림 2-62] printf 함수를 호출하는 내용을 입력했을 때 나타나는 자동완성

C의 경우 컨텐트 어시스트는 구조체의 멤버를 선택할 때 유용합니다. 그림 2-63은 다음과 같이 입력한

후 조금 기다리거나 또는 Alt + / 키를 입력했을 때의 모습입니다.

FILE *fp;

fp->

[그림 2-63] 구조체의 멤버 보기

물론 포인터를 통하지 않고 구조체 변수 뒤에 마침표를 입력한 경우에도 동일하게 표시됩니다.

컨텐트 어시스트의 자동 실행 기능 끄기

컨텐트.어시스트는.인기.있는.기능.중.하나지만.반대로.미움받는.기능.중.하나이기도.합니다..입력.도중에.자꾸만.

불필요한.것이.표시되어.입력에.방해되는.경우도.있기.때문입니다..컨텐트.어시스트의.자동.실행.기능은.꺼버릴.수.

있습니다..“Window”.-.“Preferences”.-.“C/C++”.-.“Editor”.-.“Content.Assist”로.가서.“Auto.-.Activation”이라

는.항목을.체크해제해서.자동.실행.기능을.끌.수.있습니다..물론.꺼놓은.상태에서도. Alt + / 키를.눌러.컨텐트.어시

스트.기능을.언제든지.사용할.수.있습니다.

[그림 2-64] 컨텐트 어시스트의 설정 화면

2. 개발 환경 구축 75

2.7.4 매크로 확인

C/C++ 매크로는 편리한 반면 여러 가지로 귀찮게 만드는 기능입니다. 특히 매크로가 여러 겹으로 겹쳐

져 있는 경우에는 결국 어떤 코드가 실행될지 이해하기가 아주 어렵습니다. 여기서는 이클립스에서 제

공하는 매크로 분석 기능을 살펴보겠습니다.

그림 2-65는 소스코드의 일부를 "#if 0 ~ #endif"로 묶어 놓은 경우를 보여줍니다. 매크로에 의해 비활

성화된 부분은 회색으로 흐리게 표시돼 있습니다.

[그림 2-65] 매크로에 의해 비활성화된 부분이 회색으로 표시됨

다음은 ctype.h에 포함된 매크로 중 하나인 isalnum()을 호출하는 예입니다.

#include <ctype.h>

void foo(int c) {

if (isalnum(c)) {

...

isalnum()이 어떤 매크로를 실행하는지는 isalnum()에 커서를 둔 상태에서 Ctrl + = 키를 눌러 확인할

수 있습니다(그림 2-66).

[그림 2-66] isalnum 매크로 열어보기

76 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

매크로와 함수 구별하기

매크로는.이름에.모두.대문자를.사용한다는.코딩.규약이.정해진.경우도.있지만.반드시.절대적인.것은.아니기.때문

에.보통은.언뜻.보면.매크로인지.함수인지.판별할.수.없는.경우가.많습니다..매크로는.뜻밖의.부작용이.있을.수.있

기.때문에(예를.들어.인자가.두.번.처리되는.등).사용할.때.주의해야.합니다..이클립스에서는.매크로를.다른.것과.구

별해서.표시되게.할.수.있습니다..“Window”.-.“Preferences”.-.“C/C++”.-.“Editor”.-.“Syntax.Coloring”을.엽니

다..“Code”에서.“Macro.references”를.선택하고.오른쪽의.“Enable”을.클릭해.색상과.폰트.종류.등을.선택함으로

써.매크로가.사용되는.부분의.표시.방법을.변경할.수.있습니다..그림.2-67은.이탤릭체에.밑줄을.그은.폰트로.변경

하는.모습을.나타냅니다.

[그림 2-67] 매크로의 표시 형식을 변경

이.설정을.적용하면.그림.2-68과.같이.쉽게.매크로를.구별할.수.있습니다.

[그림 2-68] 매크로가 밑줄이 그어진 이탤릭체로 표시되게 했다

2.7.5 로컬 히스토리

간혹 몇 시간 작업하고 나서 그 전의 소스코드로 되돌아가고 싶을 때가 있을 것입니다. 돌아가고 싶은

소스코드의 모습이 SCM에 커밋된 경우에는 괜찮겠지만 그렇지 않은 경우 편집기의 Undo 기능밖에 의

지할 것이 없습니다. 5분 정도 전의 코드라면 몰라도 몇 시간 전의 코드로 되돌리기란 어려운 일입니다.

2. 개발 환경 구축 77

로컬 히스토리는 이럴 때 편리한 기능입니다. 로컬 히스토리는 소스 상에서 마우스 오른쪽 버튼을 클릭

하고 “Team” - “Show Local History”로 실행할 수 있습니다(그림 2-69).

[그림 2-69] 로컬 히스토리의 표시

소스코드에 변경이 가해진 곳곳마다 그 당시의 스냅샷이 자동으로 저장됩니다. 특정 일시를 더블클릭하

면 그 내용이 표시되므로 그 당시의 내용으로 돌아가고 싶다면 해당 일시에 마우스 오른쪽 버튼을 클릭

한 다음 “Get Contents”를 선택합니다(그림 2-70).

[그림 2-70] 이전 내용 가져오기

또한 특정 일시에 마우스 오른쪽 버튼을 클릭해 “Compare Current with Local”을 클릭하거나 혹은

두 개의 일시를 선택(2개를 선택하려면 Ctrl 키를 누른 상태에서 클릭)한 후 마우스 오른쪽 버튼을 클릭

하고 “Compare with Each Other”를 선택해서 두 일시 사이에 어떤 변화가 있었는지 확인할 수 있습

니다(하나를 선택한 경우에는 현재 이클립스에서 편집 중인 소스코드의 상태와 비교됨). 그림 2-71에

서는 ctype.h에 include 문이 추가된 상태를 보여줍니다.

[그림 2-71] 소스코드 비교

78 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

2.7.6 TODO 주석

“이 부분은 나중에 마무리하자”라고 생각해두고, 완전히 그 존재를 잊어버렸던 적은 없습니까? 혹은 주

석에 “잠정적” 또는 “T.B.D.”라고 적힌 코드가 그대로 배포 환경에서 동작해서 당황한 적은 없습니까?

이클립스에서는 TODO로 시작하는 주석을 작성해 두면 그 위치를 나중에 쉽게 검색할 수 있습니다.

그림 2-72는 TODO 주석의 예입니다.

[그림 2-72] TODO 주석

소스 바깥쪽 왼쪽 열에 메모 아이콘이, 소스 바깥 오른쪽 열에 파란색 마크가 놓여 있음을 알 수 있습니

다. 오른쪽의 마크는 마우스로 클릭할 수 있으며, 클릭하면 해당 위치로 이동합니다.

또한 아래의 “Tasks”라는 뷰를 보면 TODO 목록이 만들어져 있습니다. 해당 항목을 더블클릭하면 해

당 위치로 바로 이동할 수 있습니다(그림 2-73). 이렇게 하면 언제든지 미완성된 작업을 확인할 수 있

습니다.

[그림 2-73] “Tasks” 뷰에 표시된 TODO 항목

2.7.7 외부 에디터와의 연계

지금까지 설명한 기능을 보고 “좋아, 이클립스로 완전히 바꿔야지”라고 생각한 독자는 많지 않을 것이라

생각합니다.

그것은 당연한 일입니다. 편집기를 효율적으로 사용하려면 어느 정도 익숙해질 필요가 있고, 하루 아침

에 실현할 수 있는 일도 아닙니다. 또한 1장에서 언급한 바와 같이 필자 자신도 텍스트 편집기와 IDE를

2. 개발 환경 구축 79

모두 용도에 따라 나눠서 사용하고 있습니다. 또 한 번 이야기하지만 각각을 적재적소에 적절히 사용하

는 것이 좋습니다. 따라서 마지막으로 이클립스와 텍스트 편집기를 모두 이용할 때의 주의사항에 대해

설명하겠습니다.

파일의 위치

텍스트 편집기에서 편집하려면 이클립스로 열어놓은 파일이 디스크의 어느 위치에 있는지 파악해야 합

니다. 그러려면 Project Explorer에서 해당 파일에 마우스 오른쪽 버튼을 클릭하고 “Properties”를 클

릭합니다. 그 후에 나타나는 대화상자의 “Location”에 절대 경로가 포함돼 있습니다(그림 2-74).

이 경로로 열면 동일한 파일을 텍스트 편집기로 편집할 수 있습니다. 물론 텍스트 편집기로 이동하기 전

에 이클립스에서 해당 파일을 보관해둘 필요가 있습니다.

[그림 2-74] 파일 속성

80 모던 C 언어 프로그래밍: IDE, 디자인 패턴, XP, TDD, 리팩터링, 지속적인 통합

텍스트 에디터에서 변경한 사항을 이클립스에 적용하기

텍스트 에디터에서 파일을 수정하고 이클립스 창으로 전환해도 이클립스에 이전의 파일 내용이 그대로

표시되는 경우가 있습니다. 이 경우 이클립스 상에서 해당 파일을 클릭하면 반영됩니다. 또는 Project

Explorer에서 프로젝트에 마우스 오른쪽 버튼을 클릭하고 “Refresh”를 선택(또는 F5 키를 누름)하면

새로운 내용이 반영됩니다.

에디터로부터 새로운 변경 사항을 자동으로 가져오려면 “Window” - “Preferences”에서 “General”

- “Workspace”를 열고, “Refresh using native hooks or polling”을 체크합니다(그림 2-75).

[그림 2-75] 이클립스 이외의 에디터에서 변경한 사항을 자동으로 반영

몇 초 정도의 지연은 발생하지만 이렇게 하면 자동으로 파일이 업데이트됩니다.

2. 개발 환경 구축 81

2.8 정리

2장에서는 다음과 같은 개발 환경 설정 및 사용법을 설명했습니다.

● 개발 환경의 OS

-.툴의.풍부함과.타깃.기기에도.많이.사용되는.리눅스를.OS로.채택.및.설치

-.개발.환경을.윈도우.PC에서.그대로.사용할.수.있게.VM을.이용해.설치

● IDE

-.C/C++용.IDE로.활용하기.위한.이클립스.설치

-.이클립스의.기본적인.사용법

-.이클립스.뷰는.이클립스.창에서.다양한.기능을.제공하는.각각의.개별.영역

-.프로젝트는.애플리케이션이나.라이브러리를.구성하는.한.묶음의.소스코드를.저장하기.위한.그릇

-.워크스페이스는.관련된.여러.프로젝트를.저장하기.위한.그릇

-.퍼스펙티브는.이클립스.내의.뷰.배치에.이름을.붙인.것

-.비주얼.디버거를.이용하면.브레이크포인트.및.스텝.실행으로.소스코드를.한.행씩.실행할.수.있음

-..브레이크포인트에는.조건과.횟수를.지정할.수.있고.특정.조건이.성립하거나.특정.횟수만큼.실행됐을.때.정지할.수.

있음

-.브레이크포인트로.중지한.상태에서.변수의.값을.변경할.수.있음

-.탐색.기능을.이용해.변수.및.함수.선언부로.이동하거나,.해당.변수.및.함수를.사용하는.곳을.파악할.수.있음

-..컨텐트.어시스트.기능을.이용해.변수명이나.함수명의.일부만.입력하고.나머지는.자동완성할.수.있고,.구조체의.멤

버를.그.자리에서.목록을.통해.선택할.수.있음

-.매크로.확장.확인.기능을.이용하면.소스코드.상의.매크로가.실제로.어떻게.확장되는지.확인할.수.있음

-..로컬.히스토리를.이용하면.몇.시간.전의.상태로.소스코드를.되돌리거나.최근.어떤.사항을.변경했는지.확인할.수.있음

-.TODO.주석을.이용해.소스코드에.나중에.하려는.작업을.기록해두면.나중에.쉽게.찾아낼.수.있음

-.이클립스와.텍스트.에디터를.함께.사용함으로써.각.특성에.맞는.기능을.함께.활용할.수.있음

2장에서는 이클립스의 기본 기능만 소개했지만 다음 장에서는 리팩터링 기능 및 테스트 지원 기능 등을

차례로 소개하겠습니다.