간편결제, 신용카드 청구할인
카카오페이 3,000원
(카카오페이 결제시 최대할인 3천원 / 5만원 이상 결제, 기간 중 1회)
삼성카드 6% (16,920원)
(삼성카드 6% 청구할인)
인터파크 롯데카드 5% (17,100원)
(최대할인 10만원 / 전월실적 40만원)
북피니언 롯데카드 30% (12,600원)
(최대할인 3만원 / 3만원 이상 결제)
NH쇼핑&인터파크카드 20% (14,400원)
(최대할인 4만원 / 2만원 이상 결제)
Close

엔지니어를 위한 C++ 빌더 프로그래밍의 기초

소득공제

2013년 9월 9일 이후 누적수치입니다.

판매지수 22
?
판매지수란?
사이트의 판매량에 기반하여 판매량 추이를 반영한 인터파크 도서에서의 독립적인 판매 지수입니다. 현재 가장 잘 팔리는 상품에 가중치를 두었기 때문에 실제 누적 판매량과는 다소 차이가 있을 수 있습니다. 판매량 외에도 다양한 가중치로 구성되어 최근의 이슈도서 확인시 유용할 수 있습니다. 해당 지수는 매일 갱신됩니다.
Close
공유하기
정가

20,000원

  • 18,000 (10%할인)

    1,000P (5%적립)

할인혜택
적립혜택
  • I-Point 적립은 출고완료 후 14일 이내 마이페이지에서 적립받기한 경우만 적립됩니다.
  • 추가혜택
    배송정보
    주문수량
    감소 증가

    * 배송예정일이 오늘이나 내일인 경우 1) 당일/하루배송 보장! 2) 배송 지연 시 I-Point 2,000P또는 4,000원 도서상품권 지급 &n 더보기

    • 이벤트/기획전

    • 연관도서

    • 사은품(9)

    특이사항

    * 배송예정일이 오늘이나 내일인 경우
    1) 당일/하루배송 보장!
    2) 배송 지연 시 I-Point 2,000P또는 4,000원 도서상품권 지급
       (상품권 3만원 이상 사용 가능, 결제완료 3일 후 주문 상세내역에서 신청)


    출판사 서평

    C++ 빌더는 RAD(Rapid Application Development) 툴로서 세계적으로 많이 사용되고 있으나 국내에서는 Visual C++에 비해 사용자가 적은 상태이다. 실제로 기능이나 편리성에 있어 타의 추종을 불허하는 개발 툴임에도 불구하고 국내에 사용자가 적은 이유로는 제대로 된 국문 참고서적이 존재하지 않는다는 것을 들 수 있다. 물론 시중에 여러 종류의 C++ 빌더 관련 서적이 나와 있기는 하지만 대부분 개발환경의 사용방법이나 간단한 컴포넌트의 사용법을 소개하고 있으며, 책을 다 읽고 나서도 겨우 메모장이나 데이터베이스 같은 단순한 프로그램 정도 밖에 개발할 수 없는 경우가 많기 때문에, 엔지니어가 되고 싶은 학생이나 소프트웨어를 개발하고 싶어하는 엔지니어들에게는 큰 도움이 되지 않는 문제를 가지고 있다.
    본서에서는 필자가 20년 이상 여러 공학 분야의 각종 소프트웨어를 개발하면서 얻은 지식을 알기 쉽게 설명하여 실제 이공계 학생들에게 교육하여 프로그램 개발 동기를 부여하기에 적합한 내용으로 구성하고자 하였으며 실제 공학 실무에서 만나게 되는 여러 가지 문제를 소프트웨어 개발 측면에서 분석하고 이를 C++ 빌더를 이용해서 구현하는 구체적인 방법을 다루고자 하였다. C++에 대한 어느 정도 기본 지식이 있는 독자라면 자신의 아이디어를 소프트웨어로 구현하는데 필요한 기본 지식을 얻을 수 있을 것이며, 전산 관련 학과의 프로그래밍 수업의 교재 등으로 활용 될 수 있을 것으로 기대한다.

    목차

    제1장 범용 인공 신경망 학습 및 활용 프로그램
    1. 인공신경망이란?
    2. C++ Builder 어플리케이션의 시작
    3. 사용자 인터페이스 설계
    4. Document-View 구조의 설계
    5. 인공신경망 구현
    6. 데이터 파일 입출력
    7. 신경망 구조의 시각화
    8. 신경망 클래스의 재사용
    9. 리뷰
    10. 프로그램 개선 팁

    제2장 프랙탈 차원 계산 프로그램
    1. 프랙탈 차원이란?
    2. 프로그램의 기본 구조
    3. 프랙탈 차원 계산
    4. 리뷰
    5. 프로그램 개선 팁

    제3장 푸리에 급수 변환 프로그램
    1. 푸리에 급수란?
    2. 프로그램의 기본 구조
    3. 푸리에 급수 변환 크랠스의 제작
    4. 리뷰
    5. 프로그램 개선 팁

    제4장 디지털 이미지 내의 객체 계수 프로그램
    1. 디지털 이미지 내의 객체 계수란?
    2. 프로그램의 기본 설계
    3. 이미지 프로세싱 함수의 구현
    4. 순차적 이미지 프로세싱 및 결과 표시
    5. 개체 계수 알고리즘의 구현
    6. 리뷰
    7. 프로그램 개선 팁

    제5장 디지털 이미지의 외곽선 추출 프로그램
    1. 디지털 이미지의 외곽선 추출이란?
    2. 프로그램의 기본 구조
    3. 외곽선 추출용 이미지 불러오기
    4. 외곽선 추출
    5. 리뷰
    6. 프로그램 개선 팁

    제6장 벡터 그래픽 프로그램
    1. 벡터 그래픽이란?
    2. 프로그램의 기본 설계
    3. 벡터 캔버스
    4. 데이터 관리
    5. 리뷰
    6. 프로그램 개선 팁

    제7장 파라메트릭 디자인 프로그램
    1. 파라메트릭 디자인이란?
    2. 프로그램의 기본 설계
    3. 컴파일러 클래스의 설계
    4. 테스트 및 출력
    5. 리뷰
    6. 프로그램 개선 팁

    제8장 3차원 그래픽 프로그램
    1. 3차원 그래픽이란?
    2. 프로그램의 기본 설계
    3. OpenGL 창의 준비
    4. 3차원 모델링
    5. 데이터 입출력
    6. 리뷰
    7. 프로그램 개선 팁

    제9장 하드웨어 컨트롤 프로그램
    1. 하드웨어 컨트롤이란?
    2. 하드웨어 컨트롤의 기본
    3. 컨트롤러의 제작
    4. 소프트웨어의 제작
    5. 리뷰
    6. 프로그램 개선 팁

    제10장 웹 프로그래밍
    1. 웹 프로그래밍이란?
    2. ASP의 기본
    3. CGI/ISAPI의 기본
    4. 리뷰
    5. 프로그램 개선 팁

    맺음말
    색인

    본문중에서

    머리말

    1. 과학 기술과 프로그래밍
    무릇 소프트웨어와 관련된 기발한 아이디어는 프로그래밍에 대해 모르면 모를수록 잘 떠오르기 마련이다. 이것은 프로그래밍을 할 줄 모르는 사람들은 그 과정이 얼마나 복잡한지 전혀 모르기에 ‘아이디어만 내면 그 다음은 컴퓨터가 다 알아서 해줄 것이다’라고 편하게 이런 저런 상상의 나래를 부담 없이 펼 수 있지만, 프로그래머라면 이런 저런 어려움을 잘 알기 때문에 사고가 일정한 틀에 갇혀 버리곤 하기 때문이다. 그러나 ‘완전 자동 프로그래밍’이란 것은 공상과학 영화에서조차 더 이상 먹히지 않을 정도로 허무맹랑한 이야기로, 컴퓨터는 여러분이 시키지 않은 일이라면 그 어떤 것도 하지 않으며, 아무런 주관이나 창의성이 없이 주어진 명령대로 융통성 없이 움직일 뿐이므로 프로그래밍을 모른다면 어렵게 떠올린 기발한 아이디어는 결국 아쉬운 꿈으로 끝나고 만다. 이런 이유로, 만약 실현되었다면 과학 발전에 지대한 공헌을 했을지도 모를 아이디어들이 ‘프로그래밍에 대해 잘 몰랐다’는 사소한 이유로 스러져간 예는 이루 말할 수 없을 것이다.
    현대의 거의 모든 과학과 공학 분야에서는 컴퓨터의 도움이 없이는 원천적으로 해결이 불가능한 복잡하고 거대한 스케일을 갖는 문제들이 많이 다루어지고 있다. 물론 문제의 규모와 관련 없이 가장 중요한 것은 ‘창의적인 해결방법’ 그 자체인 것이 당연하지만, 이러한 문제에 실제로 접해본 적이 있는 독자들이라면 실질적 문제해결은 대부분 컴퓨터 소프트웨어에 의존하게 되며 쓸 만한 소프트웨어를 만들기 위해 드는 노력, 시간, 그리고 비용 등이 결국 연구를 방해하는 큰 요소가 되는 경우가 많다는 것을 알고 있을 것이다. 물론 독자들이 아이디어만 낸 뒤 휘하의 연구 인력을 독려하여 결과를 얻어내면 되는 위치에 있다면 골치 아픈 프로그래밍에 대해 신경 쓸 필요도 없을 것이며 이 책을 읽을 필요도 없을 것이다. 그러나 기발한 아이디어를 실현하고 싶고, 자신의 가설을 확인해 보고는 싶은데, 간단한 소프트웨어를 만들 능력이 없어서 다른 사람에게 부탁을 해본 적이 있다면, 그리고 그 과정에서 생기는 커뮤니케이션의 오류로 인해 시간과 노력을 낭비해본 경험이 있다면 ‘전문적인 프로그래머’ 까지는 아니더라도 스스로의 생각을 직접 구현해 볼 수 있는 정도의 프로그래밍 기술을 익히고 싶다는 생각을 누구나 해보았을 것이다.
    물론 전문적인 프로그래머가 되기 위해서는 컴퓨터 공학이나 소프트웨어 엔지니어링에 대한 많은 지식을 쌓고 수련을 해야 하는 것이 사실이다. 필자도 역시 전문적인 프로그래머는 아니며, 당연히 과학ㆍ공학자 모두가 전문적인 소프트웨어 엔지니어가 될 필요는 없고 그렇게 돼도 안 된다. 왜냐하면 화학을 잘하는 사람이 화학실험 분석용 소프트웨어를 만들고, 기계공학을 잘하는 사람이 기계 설계용 소프트웨어를 만들 때 진정 쓸모 있는 소프트웨어가 탄생하는 것이지, 아무리 뛰어난 컴퓨터 엔지니어라 해도 모든 분야의 과학을 통달한 후 그런 소프트웨어를 만든다는 것은 불가능하기 때문이다.
    현재의 과학기술의 모든 분야는 각각 너무나 방대한 전문 지식을 다루고 있기 때문에 소프트웨어 개발을 더 이상 전문 프로그래머에게만 맡길 수 없게 되었다. 따라서 각 분야의 전문가가 자기 분야에서 필요로 하는 수준의 파일럿 애플리케이션(pilot application) 정도는 개발할 수 있는 능력을 습득하는 것이 반드시 필요하게 되었다. 공학을 연구하는 독자들이라면 물론 이러한 문제의 심각성을 어느 정도 느꼈을 것이고 많은 서적을 참고했으리라 생각한다. 그러나 독자들과 마찬가지로 필자 또한 기존의 프로그래밍 관련서적을 보면서 많은 아쉬움을 느꼈는데, 그 이유로는 대부분의 서적이 비전문가에 의한 외국서적의 무리한 번역에 그치는 경우가 많았다는 것, 그렇지 않으면 단순히 컴파일러의 설치, 운용방법을 알려주는 유저 매뉴얼 수준이었다는 것, 또는 이미 다 아는 (과연?) C와 C++ 문법에 대한 장구한 설명과 컴파일도 안 되는 쓸데없는 코드의 나열뿐이었다는 것, 아니면 엄청난 부피의 책을 한권 다 읽어본 들 겨우 아무 짝에도 쓸 데 없는 텍스트 편집기, 전화번호부, 잘해야 만년달력 따위를 만들 정도의 지식을 얻을 수밖에 없었다든가 하는 것들을 들 수 있겠다.
    이러한 문제를 극복하고자 본 책에서 필자는 일평생 써볼 일도 없을 것 같은 암호 같은 문법 설명, 실용적 프로그래밍에 별로 도움도 안 되는 희한한 숨겨진 SDK(software development kit)함수 들의 발굴 등을 지양하고, 진정한 실용적 소프트웨어 개발을 위해서 어떻게 ‘재사용 가능한 객체 지향적 프로그램을 설계하는가’를 이해시키는 것을 목표로 하였으며, 이를 통해 독자가 자신만의 소프트웨어를 만들고자 할 때 그 시작점을 대체 어디로 잡고 어떤 방향으로 나아가야 하는가를 익히게 하고자 한다.
    이 책은 소프트웨어 프로그래밍을 전공으로 하고, 전문 소프트웨어 엔지니어가 되고 싶어 하는 독자들을 위한 책은 아니다. 만약 그러한 심오한 목표를 가지고 있다면 프로그래밍이나 소프트웨어 엔지니어링에 대한 보다 심도 있는 지식을 다룬 책을 선택하여야 할 것이다. 이 책은 그동안 익힌 과학ㆍ공학 지식을 바탕으로, 머릿속으로만 가지고 있던 아이디어를 소프트웨어로 구현하고 싶어 하는 독자들을 위한 것으로, 거기에 필요한 최소한의 테크닉, 그리고 그 응용기법을 알려 주는 것을 목표로 하고 있을 뿐, 이렇게 익힌 테크닉을 바탕으로 세계적인 상용 소프트웨어를 개발하는 것은 독자들의 몫이다. 필자 역시 전문적인 소프트웨어 공학에 대한 교육을 받은 적이 없는 섬유공학 전공 엔지니어로, 중학교 때부터 현재까지 30년 가까이 자의반 타의반으로 수없이 많은 소프트웨어를 독학으로 개발하며 익힌 지식을 바탕으로 이 책을 쓰는 것이므로, 이 책에 소개된 필자의 문제해결 기법은 어쩌면 정통 프로그래머들의 그것과 다를 수도 있으며, 보다 나은 방법으로 해결할 수 있는 정석적이고 최적화된 코드는 따로 있을 지도 모르겠다. 그러나 복잡한 프로그래밍 테크닉이 없이 머릿속의 생각을 최대한 빨리 실제 프로그램으로 구현해보고자 하는 독자들은 이 책을 통해 답을 얻을 수 있을 것이라 확신한다.

    2. C++과 C++ Builder
    프로그래밍과 관련된 책을 읽어본 적이 있는 독자들은 알겠지만 그런 책들의 서두에서 항상 빠지지 않는 내용이 있는데 그것은 바로 프로그래밍 언어의 계보이다. 이를 보면 Assembler, PL/1, Snowball, COBOL, LISP, FORTRAN 등과 같이 들어본 적도 없거나 겨우 이름만 들어본 언어로부터 BASIC, PASCAL, C, C++, Java, XML 등등 현재까지 널리 쓰이고 있거나 미래의 주류가 되리라고 여겨지는 것까지 실로 다양한 언어들이 나타났다 사라져 간 것을 알 수 있다. 지금까지도 널리 쓰이고 있는 언어들을 살펴보면 그들이 선택된 이유는 각자의 영역에서 가장 적합하다는 평가를 받아왔기 때문임을 알 수 있는데, 즉, 간단한 스크립트 방식의 웹페이지를 만들 때는 BASIC이, 복잡한 계산을 하는 데는 C가, 객체지향의 프로그램을 하는 데는 Pascal 이 적합하다고 여겨져 왔다는 것 등을 말한다. 그렇지만 프로그래밍에 관심이 있는 독자라면, 이들 중에서도 단연 C 언어가 사람들의 주목을 받아왔으며 프로그래밍 언어를 논할 때 항상 가장 먼저 떠올려진다는 사실을 알 수 있을 것이다. 이는 자동차 공학 계에서 자동차의 동력으로 수많은 단점에도 불구하고 개발된 지 100년이 훨씬 넘은 가솔린엔진을 최고라고 생각하는 것처럼 소프트웨어 계통에서는 ‘배우고-이해하고-활용하기 힘들다’는 등의 단점에도 불구하고 C 언어를 최고의 프로그래밍 언어로 평가하고 있기 때문이다. 물론 전화번호부나 가계부 따위의 신변잡기용 간단한 데이터베이스 프로그램을 만들거나 할 때는 베이직이나 파스칼 등의 언어가 편리한 것은 사실이지만 (사실 저런 용도의 소프트웨어는 차고 넘치므로 새삼 프로그램을 짤 필요도 없다) 방대한 계산을 필요로 하는 공학용 소프트웨어나, 시스템의 하부 구조를 컨트롤해야 하는 소프트웨어를 만들 때에는 C 언어를 써야만 하는데, 그것은 C 언어가 가지는 특징, 즉 명료한 문법규칙, 방대한 함수, 폭넓은 호환성 등에 기인한다고 볼 수 있다.
    이러한 이유로 C 언어는 컴퓨터의 운영체제로부터 응용 프로그램에 이르기까지 거의 전 분야의 소프트웨어 개발에 두루 쓰이고 있는데, 역시나 가장 큰 단점인 배우기 어렵다는 문제 때문에 최근까지도 소수 전문가들의 전유물로 여겨져 왔던 것이 사실이다. 또한 C 언어의 한계를 극복하고 성능을 대폭 확장시킨 C++ 언어가 등장하면서 생소한 객체개념으로 인해 C 언어를 겨우 익힌 사용자들은 점점 이 어려운 언어를 멀리하게 되었다. 게다가 윈도우즈(Windows) 방식의 운영체제가 널리 보급되면서 소프트웨어를 설계할 때 그 소프트웨어의 주목적을 달성하는 것 보다 GUI(Graphical User Interface)를 만드는 것이 오히려 중요해 지면서 이러한 인터페이스 구현에 취약했던 C 언어는 점점 더 어려운 언어로 여겨지게 되었고, 화려한 비주얼 개발환경을 내세운 4GL(Fourth Generation Language)들, 즉 Visual Basic이나 Delphi 등에 C 언어가 밀리는 현상이 눈에 띠게 나타나기도 하였다. 윈도우즈 운영체제의 보급 초기에 프로그래밍을 해본 독자라면 기억이 나겠지만, 당시 윈도우 하나를 띄우는데도 4GL과 달리 C 코드는 수십~수백 라인이 필요했으며, 재사용하기도 어려운 코드라서 전문 프로그래머가 아닌 사람들에게는 간단한 소프트웨어를 만들어보는 것조차 거의 불가능한 일이었다.
    이런 난국을 타개하기 위해서 Borland사는 OWL(Object Windows Library)이라는 일련의 C++ 클래스들을 발표하며 재사용가능한 윈도우즈 프로그래밍 언어로서의 가능성을 보여주려 하였으나 아직 너무나 복잡한 구조 때문에 ‘그러면 그렇지 역시 C++은 안돼’라는 인상만을 주는 결과를 가져오고 말았다. 그러나 OWL로 내공을 쌓은 Borland사에서 Delphi 의 C++버전이라 할 수 있는 C++ Builder 1.0을 발표하면서 일거에 상황이 역전되게 되었는데 C++ Builder 는 객체개념을 바탕으로 하는 C++ 언어에 비주얼 개발환경을 더한 것으로 이로써 일약 C++은 진정한 윈도우즈용 RAD(Rapid Application Development) 툴로 새롭게 태어나게 되었다. 이후 C++ Builder는 버전 2010(2010년 현재)에 이르기까지 윈도우를 만들고 관리하는 단순하고 반복적인 부분들을 모두 떠맡았을 뿐 아니라 프로그래밍에 필요한 여러 가지 요소들, 즉 입출력을 위한 윈도우즈 컨트롤, 시스템을 제어하기위한 루틴, 그래픽이나 멀티미디어를 다루는 모듈 등의 ‘창의적 알고리즘 자체를 제외한 모든 작업도구’를 컴포넌트라는 이름으로 제공함으로써 프로그래머를 엄청난 잡무에서 해방시켜주었다. 그리하여 수학 프로그램을 만드는 사람은 미적분의 해법 자체에만, 캐드 프로그램을 만드는 사람은 기하학적인 도형의 조작에만, 그리고 이미지 프로세싱을 하는 사람은 이미지 필터의 조합에만 전념할 수 있게 되었으며 전문가가 아니더라도 얼마든지 근사하고 편리한 사용자 인터페이스를 만들 수 있게 되었다. 물론 C++ Builder에도 장점만이 있는 것은 아니다. 컴퍼넌트를 기반으로 하는 그 특성상 사용자가 자신이 만든 소프트웨어의 모든 부분을 알 수 없다는 것이 그 중 하나인데, 이 때문에 ‘자신이 코딩하지 않은 이상 어떠한 일도 저절로 이루어지기를 바라지 않는’ 고집 센 정통파 윈도우즈 프로그래머들은 C++ Builder와 같은 4GL 툴들을 무시하는 경향이 있다.
    사실 C++ Builder의 방대한 런타임 라이브러리(run-time library)들은 ‘어두운 무대 뒤’에서 프로그래머가 신경 쓰지 않는 (사실은 어떻게 하는지도 모르는) 많은 일을 하고 있다. 그것은 C++ Builder의 라이브러리 헤더파일을 한번 쓱 읽어보면 쉽게 알 수 있는데 거기에는 생전 써볼 것 같지도 않은 다양한 전처리기(preprocessor)들, 수십 글자짜리 복잡한 데이터타입 선언, 함수마다 달려있는 끝도 없는 파라미터 리스트들이 있어서 초보 프로그래머의 기를 죽게 하곤 한다. 물론 프로그래밍의 전문가라면 그들의 의미를 알아야 할 것이며 또한 자유자재로 쓸 수 있어야 한다. 그러나 앞서 말했듯이 C++ Builder는 전문가들만을 위한 개발도구가 아니기 때문에 전문가가 아닌 일반 프로그래머라면 그렇게 ‘어둡고 어수선한 무대 뒤’ 따위는 들여다볼 필요가 없다. 특히 이 책의 주 독자로 여겨지는 아마추어 프로그래머의 경우에는 더욱 그렇다. 전문적인 프로그래머가 되고자 하지 않는 이상 독자들은 C++ Builder를 배움으로써 더 이상 정신없이 복잡한 시스템 관련 코드들에 신경 쓸 필요가 없게 될 것이며 전문가가 아니면 꿈도 못 꿀 것 같았던 화려한 인터페이스를 자신의 프로그램에 구현할 수 있게 될 것이다 (물론 이런 생활을 계속 하다보면 자기도 모르는 새 전문 프로그래머가 될 수도 있다!).
    필자가 살펴본 바에 의하면 지금까지 대부분의 C++ Builder 관련 서적이나 온라인 포럼들은 정작 중요한 ‘아이디어의 구현 방법’ 보다는 컴포넌트의 사용법이나, 데이터베이스 연결법, 아니면 ‘윈도우즈의 시작 버튼 없애기’ 같은 아무 짝에도 쓸모없는 시시한 트릭들에 주목하고 있는 듯이 보였으며 모든 프로그래머가 주소록이나 텍스트 에디터만을 만들고 싶어 열광하고 있다고 생각하는 것처럼 느껴졌다. 물론 ‘가장 재미있는 컴퓨터 작업은 아무짝에도 쓸모없는 컴퓨터작업 (주소록이나 텍스트 에디터 만들기 같은!)’이라는 농담도 있지만 이것은 어디까지나 농담일 뿐 프로그래밍의 목적은 역시 필요한 문제의 해결방법을 찾는 것이다.
    이 책은 뭔가 의미 있는 프로그램을 만들어 보고자하는 아마추어 프로그래머를 위한 것이기 때문에 독자들은 이미 C++ Builder의 제반 운용법이나 컴포넌트 사용법들을 알고 있으며, C와 C++ 언어에 대해서도 대충 알고 있지만 주어진 문제를 어떻게 분석하고, 이런 지식들을 어떻게 조합하는지를 몰라서 방황하고 있을 뿐이라는 가정을 전제로 하고 있다. 독자들 역시 그런 소소한 사전 지식은 이미 다른 책을 통해 수도 없이 봐왔기 때문에 이 책을 선택한 것일 것이며 따라서 이 책의 어디에서도 C++에 대한 친절한 설명이나 C++ Builder 메뉴에 대한 그림을 곁들인 자상한 설명은 다루어지지 않을 것이다. 다만 이 책에서는 다양한 예제를 통해 독자들의 전문 분야에 필요한 소프트웨어를 만들기 위해 문제를 어떻게 분석하고 컴포넌트들을 어떻게 조합해야 하는가를 아는데 필요한 기법만을 다루게 될 것이다.

    3. Object Oriented Programming
    C++에 관련된 프로그래밍 서적을 읽어본 적이 있는 독자들은 OOP(Object Oriented Programming) 이라는 용어를 들어보았을 것이다. 흔히 이것은 ‘객체지향 프로그래밍’ 이라고 해석되곤 하는데 이 또한 너무 어려운 말이라서 역시 C++은 어렵다는 생각을 했을 것이다. 대체 ‘객체지향’이란 말은 무슨 뜻을 가지는 것일까? 얼핏 객체지향이라는 말은 내가 만들고자 하는 단순한 프로그램과는 아무 상관이 없는, 운영체제와 같은 거대한 프로그램을 만들 때에나 신경 써야 할 개념으로 보이기도 한다. 그러나 객체 지향이라는 것은 실로 친근하고 유용한 개념으로서 아무리 작은 프로그램을 만들더라도 반드시 필요한 것으로, 오히려 어떻게 보면 너무나 당연한 것인데 그것이 정립되기 까지 왜 이렇게 많은 시간이 걸릴 수밖에 없었는지가 오히려 미스터리하다.
    C 언어가 처음 나왔을 때 그 명확성과 범용성으로 인해 많은 프로그래머들의 지지를 받은 것은 사실이었으나 큰 프로그램을 만들 때 수없이 많은 함수들과 변수들이 서로 얽히게 되면 프로그램 개발은 물론 유지 보수마저 매우 힘들어 질 수 있다는 사실은 곧 프로그래머들의 골칫거리가 되었다. 물론 C를 비롯한 많은 언어에는 구조체(struct)와 같이 관련 있는 변수들을 한 묶음으로 묶어 관리하는 데이터 형식이나, 함수(function), 서브루틴(sub routine)과 같이 복잡한 프로시저들을 따로 묶어서 처리하는 기능이 있다. 그러나 역시 이 모든 것들은 전체 프로그램에 종속된 코드로 구성되도록 되어 있어서 비슷한 기능을 하는 다른 프로그램에서 다시 쓸 수 없다는 문제를 가지고 있었다. 그런 과정에서 일련의 특수한 기능을 하는 서브루틴과 데이터 묶음을 재사용 가능한 독립적인 코드로 만들어내고자 하는 요구가 생겨나게 되었고, 이로부터 드디어 객체 개념을 가지는 C++ 언어가 생겨나게 되었다.
    객체 지향 프로그래밍을 추구하는 C++ 언어의 가장 큰 특징은 단연 ‘클래스(class)’ 개념이라고 할 수 있다. 이는 가히 혁명적인 것으로 클래스 개념을 절반만이라도 이해한다면 이미 목표를 거의 달성한 것이라고 볼 수 있다. 이 책에서는 독자들이 이미 C 언어에 대한 내용은 상당 부분 알고 있다고 가정했으므로 이를 바탕으로 클래스에 대해 설명을 하자면 다음과 같다. 알다시피 C 언어의 큰 특징 중의 하나로 구조체를 들 수 있는데 이는 연관된 여러 가지 데이터를 하나로 묶어 대표 이름으로 쓸 수 있도록 한 것이다. 즉, 주소록을 만들고자 한다면 한 사람 한 사람을 나타내는 데이터에는 이름, 주소, 전화번호, 이메일 등이 있을 것인데 이런 것들을 묶어서 구조체로 만들면 이들을 한 번에 어떤 함수의 파라미터로 전달한다든가 하는 일을 쉽게 할 수 있다. 그러나 만약 구조체의 데이터들끼리 계산을 해서 어떤 값을 얻어내야 하는 경우- 이를테면 전화번호에서 국번을 분리해서 지역을 찾아본다든가, 주소로부터 우편번호를 찾아야 하는 등 -가 생기면, 구조체 내부의 데이터를 참조하는 함수를 만들어야 한다. 따라서 구조체안의 데이터의 종류와 수가 많아지고, 데이터를 조작하는 함수가 많아지는 경우 상당한 양의 코드가 필요하게 되며, 유사한 기능의 다른 프로그램에서 이와 같은 구조체를 사용하는 경우에 똑같은 코드임에도 코드를 재사용 하는 것이 매우 복잡하게 된다. 게다가 여러 개의 구조체를 다루는 함수들은 기능이 동일하더라도 같은 이름을 쓸 수 없기 때문에 프로그램의 복잡성을 증가시키는 문제를 가지게 된다. 클래스는 구조체의 이러한 약점들을 극복하기 위해 나타난 개념으로, 쉽게 말하면 데이터 뿐만 아니라 데이터를 조작하는 함수들까지 다 포함하는 확장된 구조체라고 할 수 있다. 클래스는 구조체처럼 데이터를 포함하며 이것은 클래스의 멤버변수(member variables)라고 한다. 또한 이 멤버변수를 참조해서 여러 가지 계산을 하는 함수들이 포함되는데 이것은 클래스의 멤버 함수(member functions)라고 불린다. 이 멤버 함수들은 클래스 외부에서 참조가 가능하며 프로그래머는 멤버함수를 통해 클래스 내부의 변수들을 컨트롤할 수 있게 된다.
    따라서 클래스를 잘 설계하면 프로그래머는 클래스 내부의 복잡한 계산 루틴을 메인 프로그램에서 완벽하게 분리시킬 수 있으므로 개발 및 유지 보수가 매우 용이해지며, 잘 설계된 클래스는 같은 기능을 필요로 하는 다른 프로그램을 개발할 때 얼마든지 재사용될 수 있다. ‘잘 설계된’ 클래스의 대표적인 예가 바로 C++ Builder의 기본 클래스 중 하나인 TForm이다. TForm은 윈도우를 만들기 위한 수백 수천 라인의 코드를 내부에 담고 있지만 프로그래머는 이러한 것에 대해 아무것도 몰라도 자유롭게 윈도우를 만들 수 있고, 그를 기반으로 복잡한 프로그램을 만들 수 도 있다. 또한 TForm 클래스는 알다시피 어떤 프로그램에서도 다 쓸 수 있는 클래스이다.
    클래스의 도를 깨닫는 것은 매우 어렵지만 중요한 일이다. 클래스와 관련해서도 몇 가지 복잡한 문법적 개념들이 많지만 사실은 그 일부분만 알아도 쓸 만한 프로그램을 만드는 데에는 아무 지장이 없다. 클래스의 문법에서 꼭 알아야 할 것은 생성자, 파괴자, 멤버변수, 멤버함수를 정의하는 것과 클래스의 멤버함수를 호출하는 방법 정도이며 이것만 알면 독자들은 스스로의 클래스를 만들 수도 있고, C++ Builder의 모든 컴포넌트 클래스들을 어려움 없이 사용할 수 있을 것이다. 다시 말하지만 객체 지향 프로그래밍에서 중요한 것은 C++ 언어의 문법을 이해하는 것이 아니다. C++ 언어의 문법은 경험이 늘면 자연히 다 알게 되는 것이고 가장 중요한 것은 주어진 문제를 어떻게 클래스로 세분화하며, 클래스간의 상호작용으로 해결 가능한 구조로 분석하느냐는 것이다 (물론 C++ 언어와 class 에 대한 설명도 필요한 만큼은 다루어 질 것이니 너무 걱정 하지는 마시기를). CAD(Computer Aided Design) 프로그램을 만들 때는 기하학적 요소를 다루는 클래스를 만드는 것이, 이미지 프로세싱을 할 때는 이미지 비트맵을 조작하는 클래스를 만드는 것이, 수치해석을 할 때는 미적분 계산 클래스를 만드는 것이 중요한 것이므로 이를 위해 이 책에서는 앞으로 다양한 예제를 통해 기본적인 문제 분석 방법 및 이의 프로그램 구현에 대해 설명하고자 한다. 이 책에서는 C++ Builder 2010 버전을 기본으로 설명하고자 하는데, C++ Builder 2010에만 있는 화려한 기능이 아닌 기본적인 기능들을 이용해서 프로그램을 제작하도록 할 것이므로 C++ Builder의 이전의 버전을 가지고 있는 독자라고 하더라고 걱정할 필요는 없을 것으로 생각된다. 그럼 이제 예제를 통해 C++ Builder를 이용한 객체지향 프로그래밍에 대해 알아보자.
    (/ '머리말' 중에서)

    제1장 범용 인공 신경망 학습 및 활용 프로그램

    1. 인공신경망이란?

    최근의 과학 논문에서 자주 나타나는 용어 중에 ‘인공신경망(Artificial Neural Network)’이라는 말이 있는데, 이는 사람의 신경망을 본떠서 구현한 일종의 소프트웨어로 무궁무진한 활용 분야를 가지고 있는 기술이라 할 수 있다. 인공신경망을 활용하는 프로그램을 만들기 위해서는 당연히 인공신경망이 무엇인지 알아야 할 것 같아서, 이미 아는 독자들도 있을지 모르지만 다시 한 번 간단히 설명하고자 한다. 인공 신경망은 1965년 Zadeh에 의해 처음 제안된 것으로, 학습에 의해서 컴퓨터가 ‘유사지능’을 가질 수 있다는 가능성을 보여준 놀라운 개념이라 할 수 있다. 통계학에 ‘회귀분석’ 이라는 기법이 있는데, 가장 간단한 회귀분석의 예로는 두 개의 변수 x, y 사이에 직선적인 관계가 있다고 가정하고 두 변수간의 관계식을 찾는 ‘선형회귀’를 들 수 있다. 그런데 만약 관련된 변수가 아주 많다면? 혹은 관련된 변수들 간에서 직선적인 관계, 혹은 어떠한 다항식 관계도 찾아볼 수 없다면 어떻게 할 것인가? 물론 회귀분석에도 여러 종류가 있어서, 그중에서 ‘비선형 회귀’ 라는 것은 이와 같이 독립변수와 종속변수 사이에 어떠한 뚜렷한 관계식이 없는 경우에 쓸 수 있는 방법이 있기는 하다. 그러나 이는 경험이나 직관에 의해 변수간의 관계를 파악할 필요가 있으며 컴퓨터를 쓰더라도 엄청나게 복잡한 과정이고 결과의 적절성 또한 신뢰하기 어렵다고 볼 수 있다.
    그런데 알다시피 실제 공학 문제에서는 이와 같은 비선형 회귀가 필요한 경우가 수없이 많다. 사람이 손으로 쓴 글자를 어떻게 컴퓨터가 인식할 것인가? 음성을 인식하고 동작하는 기계를 만들려면 어떻게 해야 할까? 수없이 많은 현미경 사진에서 이미지 분석을 통해 특정한 패턴을 찾아내려면 대체 어떻게 해야 할까? 등등 조금만 생각해봐도 아이디어 자체는 쉽지만 어떤 식으로 구현해야할지 감조차 오지 않는 문제가 수도 없이 많다는 것을 금방 알 수 있다.
    바로 이러한 문제들을 해결하는데 인공신경망이 널리 쓰이고 있으며, 인공신경망을 활용한다면 독자들의 연구에서도 많은 문제를 해결할 수 있을 것으로 생각된다. 인공신경망은 수많은 문제들과 그 문제의 답들을 반복적으로 컴퓨터에게 ‘학습’ 시킴으로써 컴퓨터가 결국에는 어떤 문제를 보면 저절로 답을 낼 수 있도록 하는 소프트웨어 시스템으로, 사람이 무언가를 배우는 과정과 매우 유사한 과정을 통해 컴퓨터에게 학습 능력을 부여하는 것이라고 볼 수 있다. 즉, 여러 모양의 글자를 컴퓨터에 입력하고, 그 글자가 어떤 글자라는 것을 알려준다거나, 여러 가지 음성을 컴퓨터에 입력하고 그 음성이 어떤 소리라는 것을 알려주는 방법으로 앞서 말한 일견 황당해 보이는 문제들을 해결한다는 것이다. 그렇다면 대체 어떤 원리로 컴퓨터가 ‘학습’을 할 수 있단 말인가?
    사람의 신경망은 뉴런(neuron)이라는 세포들로 구성되어 있는데 이것은 신경 세포와, 세포들을 연결하는 돌기들로 이루어져 있다. 신경세포들은 감각세포(sensor)와 운동세포(actuator)들과도 연결이 되어 있으며, 감각세포로부터 신호를 받고, 이 신호를 운동세포에 적절히 증폭, 전달하여 외부 자극에 대해 사람이 적절한 반응을 하게끔 만드는 것이라고 믿어지고 있다.
    이때, 뜨거운 것을 만졌다거나 할 때와 같은 자극에 대해 귀를 잡는다거나하는 적절한(?) 대응을 하였다면 당시 감각신호가 전송된 경로의 돌기들에는 일련의 가중치(weight)가 누적되어 이후 똑같은 자극을 받았을 때 더 빠르고 정확하게 반응을 할 수 있도록 신호를 증폭하게 될 것이다. 그런데 만약 소리만 지른다든가 하는 엉뚱한 반응을 하여 피해를 최소화하지 못했다면, 관련된 돌기들의 가중치는 작게 조정될 것이며 이러한 과정을 거쳐 모든 신경세포 연결돌기의 가중치가 조절된다면 자극에 대한 사람의 반응 동작은 점점 더 빠르고 세련되어질 것이다. 똑같은 원리를 학습에 적용한다면, 즉 사람에게 어떤 글자를 보여주고, 그 글자가 어떤 뜻인지를 계속해서 알려준다면 결국 사람은 글자를 이해하고, 말을 배우게 되는 것이다.
    인공신경망이란 바로 이런 원리를 소프트웨어적으로 구현한 것으로 그림 1.1과 같은 구조를 가지고 있다. 감각세포단의 역할을 하는 것이 바로 입력값(input)이 되며, 운동세포단의 역할을 하는 것이 출력값(output)이 된다. 그리고 두 세포 간에 존재하는 한층 이상의 신경 세포단을 숨겨진 신경세포단(hidden neuron layer)이라고 하며, 각각의 세포들을 연결하는 가상의 돌기는 가중치를 가지며 학습 초기에는 모두 임의의(random) 값을 가진다.
    입력세포단에 입력값을 주고 학습을 시작하면, 입력값은 가중합으로 계산 되어 숨겨진 신경세포에 전달되고, 이는 다시 가중합을 거쳐 출력값으로 전달된다 이 과정은 입력에서 출력 쪽으로 순방향으로 이루어지기 때문에 ‘feed forward’ 과정이라고 한다. 이때 출력값이 이미 알고 있는 ‘정답’ 과 같다면 좋겠지만 최초에 가중치가 랜덤한 값이었으므로 그럴 가능성은 거의 없다. 따라서 정답과 계산된 값에 차이, 즉 오차가 존재하는데, 인공신경망의 학습은 바로 이 오차를 이용해서 연결 돌기들의 가중치를 재조정하는 과정에 의해 이루어진다. 여기에도 역시 여러 가지 방법이 있는데 가장 간단한 방법으로는 ‘오차의 후방전파’(error back propagation) 알고리즘이 있다. 이는 문자 그대로 오차를 다시 숨겨진 신경세포단 쪽으로 되돌리면서(feed backward) 가중치를 조절하는 방법으로, 1969년 Bryson과 Ho에 의해 처음 제안 되었다.
    이러한 과정을 무수히 반복하다보면 결국 오차가 점점 작아지며 모든 연결돌기의 가중치의 변화량이 매우 작아지는 안정적인 상태가 오게 되는데 이 상태를 ‘학습’ 된 상태라고 하는 것이다. 일단 ‘학습’ 이 이루어지면 이후에는 입력값을 주면 ‘순간적’으로 결과값을 얻을 수 있게 된다.
    당연히 인공신경망은 모든 어려운 문제에 대한 절대적인 해답이 아니며 결정적 약점 중의 하나로 ‘학습된’ 범위에서는 좋은 결과를 예상할 수 있지만 학습하지 않은 범위의 입력값에 대해서는 결과를 신뢰할 수 없다는 단점도 가지고 있다. 그러나 공학연구에서 만나는 대부분의 비선형 다중회귀 문제를 해결하는데 있어 적합한 도구로 사용될 수 있다는 것만은 사실이다.
    인공신경망에 대한 참고문헌은 세계 여러 나라 언어로 수도 없이 많이 나와 있고 한두 권쯤 읽어본 사람들도 있겠지만 구체적으로 어떻게 이를 프로그램화 하는가에 대한 내용은 별로 많지 않았을 것으로 생각된다. 그러면 어떻게 C++ 언어를 이용해서 인공신경망을 구현할 수 있는지, 혹은 이와 같은 추상적인 수학적 개념을 어떻게 구체화하여 소프트웨어로 개발할 수 있는지에 대해 알아보도록 하자.

    2. C++ Builder 어플리케이션의 시작

    이 책을 읽는 독자는 물론 C++ Builder 프로그램을 어떻게 만드는지 정도는 ‘당연히’ 알 것이라고 믿고 있지만 혹시나 하는 마음에 C++ Builder 프로그램을 처음 만들기 시작하는 방법에 대해 ‘이번 한번만’ 차근차근 설명하고자 한다. C++ Builder 2010 이전의 버전을 사용하는 독자의 경우에는 각자의 컴파일러에 맞는 메뉴를 찾아서 해보도록 하자.
    새로운 프로그램을 만들려면 C++ Builder 2010의 경우 ‘File-New-Others-VCL Forms Application’메뉴를 선택해서 새로운 프로젝트를 만들면 된다. 다른 버전의 경우에도 비슷한 메뉴를 이용해서 프로젝트를 만들 수 있다.
    프로젝트를 저장할 때는 ‘File-Save All’ 메뉴를 이용한다. 이때 각 파일의 이름을 물어보는데, 먼저 메인 폼의 이름을 물어보는데, 각자 취향대로 입력할 수 있으나 필자는 TMainForm.cpp 과 같이 T를 붙이곤 하는데, 왜인지는 모르겠으나 Turbo C++ 시절부터 왠지 클래스 앞에는 T를 붙이는 것이 관례같이 되어 버렸다 (필자만 그런지도 모르겠다. 프로그램에 능통한 필자의 한 후배는 본인의 이니셜을 따서 S를 붙이곤 한다). Visual C++ 경우에는 C를 붙이고, 어떤 책에서는 My를 붙이기도 하는데 이는 전적으로 프로그래머의 자유이다. 주의 할 것은, 폼을 TMainForm.cpp 로 저장했다면 폼의 이름 (object inspector에서 Name field)은 MainForm과 같이 T를 빼고 하는 것이 좋다는 것이다. 이런 식으로 폼은 form이 붙은 이름으로 저장하고, 폼이 아닌 유닛(unit)은 form이란 단어가 없는 이름으로 저장하는 습관을 들이다 보면 나중에 파일을 보고 폼인지 유닛인지 혼동할 가능성이 적어져서 좋다. 다음 프로젝트파일 (cbproj 혹은 bpr)은 만들고자 하는 프로그램의 이름으로 지정하면 된다. 이 예제에서는 NeuralNetwork 정도로 하는 것이 좋겠다. 프로그램을 저장하는 폴더도 잘 관리해야 하는 것은 당연한 것으로, 후에 프로그램이 많아질 것에 대비해 종류별로 하거나 하는 것도 좋을 것이다. 이 책에서 다루는 예제들을 따로 저장하기 위한 폴더를 만드는 것도 좋을 듯.
    C++ Builder 에서는 위와 같이 프로젝트를 저장하면 이것만으로도 프로그램을 실행할 수 있게 된다. F9를 눌러서 실행을 해보면 폼이 하나 뜨는 것을 볼 수 있다. 십 수 년전 아마 독자들이 한 번도 본 적도 없을 수도 있을 운영체제인 ‘도스(DOS-Disk Operating System)’ 가 일세를 풍미하던 시절, 저자가 처음으로 윈도우즈 프로그래밍을 접했을 때는 이렇게 폼 하나를 띄우는데도 수십 줄의 코딩이 필요했던 것을 생각하면 실로 편리한 세상이 되었다는 것을 실감할 수 있다.
    Project-Options 메뉴를 이용하면 프로그램에 아이콘을 달거나, 작업표시줄에 보여질 제목을 설정할 수도 있다. 이러한 것은 각자 찾아서 한 번씩 해보길 바란다.

    3. 사용자 인터페이스 설계

    가장 중요하다고 할 수 있는 프로그램의 뼈대를 만드는 과정을 지났으니 이제는 실제로 인공신경망을 구성하는데 필요한 프로그램의 사용자 인터페이스를 구성할 차례이다. 사용자 인터페이스는 프로그램의 사용 편이성을 결정짓는 가장 중요한 요소이기 때문에 많은 신경을 써야 한다. DOS 시절에는 모든 작업은 순차적으로 이루어졌기 때문에 작업의 순서에 대해서 사용자는 선택의 여지가 없었으나, 윈도우즈 운영체제에서 그래픽 기반의 사용자 인터페이스가 사용되면서, 사용자는 알고리즘의 순서에 구애받지 않고 이 작업 저 작업을 마구 해볼 수 있는 자유(?)를 가지게 되었다. 따라서 사용자 인터페이스를 만들 때는 사용자가 할 수 있는 작업의 모든 순서를 고려해야 하며, 작업의 선후에 관계없이 에러가 나지 않도록 세심한 배려를 해야 한다. 물론 이러한 것은 상용프로그램을 만들 때 그렇다는 것이지 우리가 하고자 하는 공학기술 전용의 파일럿 프로그램(pilot program)의 경우에는 그렇게 까지 할 필요는 없다고 생각 할 수도 있으나, 프로그램의 모든 스텝에서 가능한 에러를 방지하고자 노력해야 한다는 것은 아무리 강조해도 지나치지 않는다고 볼 수 있다. 따라서 앞으로 프로그램을 해나가면서 잠재적으로 에러가 발생할 수 있는 상황을 항상 가정하고, 그것을 피해갈 수 있는 대책을 마련하는 습관을 들여야 할 것이다.

    3.1. MDI(Multiple Document Interface) 구조

    마이크로 소프트의 ‘Office’나 한글과 컴퓨터의 ‘한글’과 같은 프로그램들은 대개 여러 개의 문서를 동시에 열어놓고 작업할 수 있는 구조로 되어 있는데, 이것을 MDI 구조라 한다. 인공신경망 프로그램도 여러 개의 인공신경망을 동시에 띄워놓고 작업할 수 있다면 아마도 더 효율적이지 않을까하는 생각에 겸사겸사 MDI 구조의 어플리케이션을 어떻게 만드는지에 대해 알아보도록 하자. 이 장에서 설명한 MDI 구현방법은 이 책의 다른 예제에서도 모두 유사하게 사용될 것이므로 이번 기회에 확실하게 알아두도록 하며, 이후에는 MDI 구성에 대한 설명은 생략하도록 하겠다.
    MDI를 구현하기 위해서는 MDI 의 바탕이 되는 폼이 필요한데 이것은 오브젝트 인스펙터 (Object Inspector - 단축기 F11)에서 폼의 다음 속성을 설정하는 것으로 가능하다.
    Form 에는 이외에도 무수히 많은 속성이 있는데 이는 필요할 때 마다 설명하도록 하겠다. 궁금한 사람들은 직접 하나씩 바꿔보면서 어떤 변화가 일어나는지 보는 것도 좋은 학습 방법이라 할 수 있겠다.
    여기서 Name 프로퍼티를 보면, MainForm이라고 입력하였는데, 이 부분은 물론 임의로 정할 수 있다. 그러나 앞으로 수많은 프로그램을 만들 때 일관성을 위해서 form의 경우에는 저렇게 class 이름에 form 이 들어가게 하고, 저장할 때에도 TMainForm.cpp 와 같이 역시 form 이라는 이름을 달아서 저장하는 습관을 들인다면 나중에 소스를 관리할 때 약간 편리할 것이다. 클래스 이름은 MainForm 이고, 저장할 때는 TMainForm.cpp 로 하였는데, 역시 T 가 앞에 붙는 것은 Turbo C++ 이래의 오랜 관행이므로 굳이 마음에 안 들면 다른 것으로 바꿔도 상관없다.
    MDI 방식의 프로그램을 써본 사람들은 알겠지만 MDI 바탕창에는 항상 존재하는 메뉴가 있는데 그것은 File과 Window메뉴이다. File메뉴는 새 프로젝트 시작, 저장된 프로젝트 불러오기, 프로젝트 저장하기, 끝내기 등의 메뉴를 가지고 있으며, Window메뉴는 가로로 창 정렬, 세로로 창 정렬, 모두 정렬 등의 메뉴를 가지고 있다. C++ Builder에서 창에 메뉴를 다는 것은 매우 직관적으로, 컴포넌트 팔레트(component palette)에서 메뉴를 가져다가 폼에 놓기만 하면 된다. 그런 다음 component를 더블 클릭하고, 메뉴를 하나하나 추가해나가기만 하는 것으로 메뉴를 만들 수 있다. 메뉴의 추가는 Insert 키를 눌러서 할 수 있으며, 메뉴 사이의 separator를 만들기 위해서는 caption 속성을 ‘-’ 로 주기만 하면 된다.
    인공신경망 프로그램을 위해 그림 1.2와 같이 메뉴를 만들어보자.
    메뉴아이템의 속성 중 몇 가지에 주의할 필요가 있다. MDI 프로그램에서 Window 메뉴의 경우에 File 과 Window 메뉴 사이에 보통 child window 의 메뉴가 들어가야 하므로, Window 메뉴의 Group Index 속성을 큰 값 (10 정도면 적당) 으로 줘야 한다는 것이다. 그렇지 않으면 child window 메뉴가 Window메뉴 뒤로 들어가는 비정상적인 일이 발생할 수 있다. 그리고 MainForm 의 WindowMenu 속성을 Window1 로 설정해주면 열려있는 Child window 의 목록을 Window menu 아래에서 볼 수 있게 된다.

    경험상 메뉴는 가능하면 영어로 만드는 것이 좋다. 이것은 본인의 프로그램을 ‘국제적’으로 만들어줄 뿐만 아니라 메뉴 아이템의 이름이 영어로 생성되어야 나중에 연결함수의 이름이 제대로 만들어지기 때문이다. 만약 한글로 한다면, 메뉴 아이템의 이름은 N1, N2 와 같이 의미 없는 이름이 될 수 있기 때문이다.

    3.2. Child Window 제작

    본 예제에서 하나의 child window는 하나의 인공신경망을 나타내게 된다. 이를 위해 File-New-Form 메뉴를 이용해서 폼을 하나 추가한 다음 이를 TChildForm.cpp 정도의 이름으로 저장한다. 그런데 이 때 새로 추가된 form 은 자동생성폼이 되는데, child window 라는 것은 필요할 때만 만들어야 하므로 자동생성 속성을 없애야 한다. 없애지 않더라도 크게 문제될 것은 없지만 명확히 하기 위해서는 없애는 것이 좋다. 방법은 일단 TChildForm.h 헤더 코드의 맨 아래 쪽에서
    extern PACKAGE TChildForm *ChildForm;
    이 문장을 삭제하고, TChildForm.cpp 소스 코드의 맨 위 쪽에서
    TChildForm *ChildForm;
    문장을 삭제한다. 그런 다음 Project-Options 메뉴 다이얼로그 상자에서 Forms 메뉴를 선택하고, 왼쪽의 Auto-create forms 에 있는 ChildForm을 선택하고 ‘>’ 버튼을 눌러 Available forms 쪽으로 옮기면 된다. 앞으로도 ‘자동 생성 폼을 취소한다’ 는 내용이 나오면 위의 과정을 자동으로 반복하면 자동 생성되지 않고 new 연산자로 명시적으로 만들어줘야 생기는 form을 만들 수 있게 된다.
    Project-Options 메뉴에서 봐야할 또 하나는 Application 메뉴가 있다. 여기서 Title 은 작업표시줄에 나오는 프로그램 이름이며, Load Icon 버튼을 이용하면 아이콘을 지정할 수 있다. MainForm 이나 ChildForm 에도 지정하지 않으면 C++ Builder 의 기본 아이콘이 지정되는데, 이것은 각 form 의 Icon property를 클릭하고 *.ico 파일을 선택함으로써 지정할 수 있다. *.ico 파일은 아이콘 제작 프로그램 등을 이용해서 만들 수 있으며 이는 프로그래밍과는 별도인 예술의 영역이라 할 수 있으므로 이 책에는 설명하지 않는다. 기타 수없이 많은 다른 옵션들은 필요할 때 설명하도록 하겠다.
    Child window를 만드는데 필요한 form의 property 들은 다음과 같다.
    일단은 이정도의 property 만 설정해도 폼은 child window 로 동작하게 된다. MDI 바탕 창에서 Child 창을 생성하는 방법은 다음과 같다. TMainForm에 만들어 놓은 New Project 메뉴를 클릭하면 TMainForm.cpp 에 다음과 같은 코드가 생성된다.
    void __fastcall TMainForm::NewProject1Click(TObject *Sender)
    {
    }
    이미 알고 있겠지만 C++ Builder 에서는 메뉴 아이템을 클릭하거나, 컴포넌트의 object inspector에서 event 중 하나를 더블 클릭하면 위와 같은 코드를 자동으로 생성해준다. 따라서 버튼을 눌렀을 때, 마우스를 클릭 했을 때, 라디오버튼이나 체크버튼을 작동했을 때 어떤 일을 하고 싶다면, 해당하는 event를 만들고 자동으로 생성된 코드블럭 ({ } 으로 둘러싸인 부분)내에 하고자 하는 일을 구성하면 되는 것으로, 이를 통해 복잡한 프로그램과 사용자 인터페이스를 쉽게 만들 수 있다.

    (/ 본문 중에서)

    저자소개

    생년월일 -
    출생지 -
    출간도서 3종
    판매수 153권

    김성민 교수는 생활과학대학 의류학과 소속이며 패션테크놀로지 분야를 담당하고 있다. 섬유공학을 전공했으며 각 대학 의류학과·섬유패션산업체와 섬유의류제품 설계·생산·평가 공정 자동화기술 개발을 위한 다양한 공동 연구 프로젝트를 진행했다. 기계, 전자, 컴퓨터 등 여러 분야에서도 다양한 연구 경험을 가지고 있으며 [엔지니어를 위한 C++ 빌더 프로그래밍의 기초](광주: 전남대학교 출판부, 2012), [전기전자컴퓨터공학기초](광주: 전남대학교 출판부, 2015, 공저) 등의 저자로 다양한 분야의 IT 융합 연구에 필요한 기초 지식 보급에도 관심을 기울이고 있다.

    이 책과 내용이 비슷한 책 ? 내용 유사도란? 이 도서가 가진 내용을 분석하여 기준 도서와 얼마나 많이 유사한 콘텐츠를 많이 가지고 있는가에 대한 비율입니다.

      리뷰

      0.0 (총 0건)

      구매 후 리뷰 작성 시, 북피니언 지수 최대 600점

      리뷰쓰기

      기대평

      작성시 유의사항

      평점
      0/200자
      등록하기

      기대평

      0.0

      교환/환불

      교환/환불 방법

      ‘마이페이지 > 취소/반품/교환/환불’ 에서 신청함, 1:1 문의 게시판 또는 고객센터(1577-2555) 이용 가능

      교환/환불 가능 기간

      고객변심은 출고완료 다음날부터 14일 까지만 교환/환불이 가능함

      교환/환불 비용

      고객변심 또는 구매착오의 경우에만 2,500원 택배비를 고객님이 부담함

      교환/환불 불가사유

      반품접수 없이 반송하거나, 우편으로 보낼 경우 상품 확인이 어려워 환불이 불가할 수 있음
      배송된 상품의 분실, 상품포장이 훼손된 경우, 비닐랩핑된 상품의 비닐 개봉시 교환/반품이 불가능함

      소비자 피해보상

      소비자 피해보상의 분쟁처리 등에 관한 사항은 소비자분쟁해결기준(공정거래위원회 고시)에 따라 비해 보상 받을 수 있음
      교환/반품/보증조건 및 품질보증 기준은 소비자기본법에 따른 소비자 분쟁 해결 기준에 따라 피해를 보상 받을 수 있음

      기타

      도매상 및 제작사 사정에 따라 품절/절판 등의 사유로 주문이 취소될 수 있음(이 경우 인터파크도서에서 고객님께 별도로 연락하여 고지함)

      배송안내

      • 인터파크 도서 상품은 택배로 배송되며, 출고완료 1~2일내 상품을 받아 보실 수 있습니다

      • 출고가능 시간이 서로 다른 상품을 함께 주문할 경우 출고가능 시간이 가장 긴 상품을 기준으로 배송됩니다.

      • 군부대, 교도소 등 특정기관은 우체국 택배만 배송가능하여, 인터파크 외 타업체 배송상품인 경우 발송되지 않을 수 있습니다.

      • 배송비

      도서(중고도서 포함) 구매

      2,000원 (1만원이상 구매 시 무료배송)

      음반/DVD/잡지/만화 구매

      2,000원 (2만원이상 구매 시 무료배송)

      도서와 음반/DVD/잡지/만화/
      중고직배송상품을 함께 구매

      2,000원 (1만원이상 구매 시 무료배송)

      업체직접배송상품 구매

      업체별 상이한 배송비 적용