Top

프로그래머처럼 생각하기 [문제 해결과 논리적 사고 훈련을 통한 프로그래밍 학습]

  • 원서명Think Like a Programmer: An Introduction to Creative Problem Solving (ISBN 9781593274245)
  • 지은이안톤 스프라울
  • 옮긴이김무항
  • ISBN : 9788960776142
  • 25,000원
  • 2014년 09월 26일 펴냄
  • 페이퍼백 | 348쪽 | 188*250mm
  • 시리즈 : 프로그래밍 언어

책 소개

요약

이 책은 프로그래밍 입문자를 위한 책인 동시에 어떤 문제에 대한 해결책을 프로그래밍으로 구현하려 할 때 막막함을 한 번이라도 느껴본 적이 있는 모든 이들을 위한 책이다. C++의 개념과 문법만을 학습하기 위한 참고서 형태의 책이 아니다. 어떤 문제를 해결하기 위한 논리적 사고 과정과 문제 해결 기법을 학습하고 여기서 도출된 해결책을 C++라는 도구를 사용해 어떻게 프로그래밍할 것인가에 대해 학습한다. 이러한 과정 중에 자연스레 C++의 개념과 문법을 학습함으로써 이후에 독자들이 C++라는 언어를 실제 업무나 과제 중에 등장하는 문제를 해결하는 데 적용할 수 있게 돕는다.

이 책에서 다루는 내용

■ 문제를 해결하기 쉽게 만들기 위해 개별적인 구성요소로 나누는 법

■ 함수와 클래스, 라이브러리를 이용하여 코드 재사용을 최대한 활용하는 법

■ 특정 작업에 가장 적합한 데이터 구조를 선택하는 법

■ 재귀와 동적 메모리와 같은 고급 프로그래밍 도구 활용법

■ 특정한 유형의 문제를 해결하기 위해 생각을 정리하고 전략을 개발하는 법

이 책의 대상 독자

시행착오를 겪으면서 배우기보다는 체계적인 방법으로 문제 해결 능력을 배울 수 있다. 이 책은 그러한 문제 해결 능력을 배우기 위한 지침서다. 이 책을 통해 여러분은 생각을 정리하는 기법과 해결책을 찾아내는 과정, 특정한 부류의 문제에 적용하기 위한 전략을 배울 수 있다. 이러한 접근법을 배우는 동시에 여러분의 창의성을 끌어낼 것이다. 더 이상 실수는 없을 것이다. 프로그래밍은 창의적인 활동이다. 특히 문제 해결은 더욱 그러하다. 창의성은 신비한 것이며 창의적인 사고가 동작하는 방식에 대해 정확하게 말할 수 있는 사람은 없다. 그러나 우리가 작곡을 배우거나 창의적인 글쓰기에 대한 조언을 얻거나 그림 그리는 법을 배울 수 있다면 프로그래밍 문제를 창의적으로 해결하는 방법 또한 배울 수 있다. 이 책은 여러분이 무엇을 해야 할지 상세히 알려주지는 않는다. 하지만 여러분의 잠재적인 문제 해결 능력을 개발해서 여러분 스스로 무엇을 해야 할지 알 수 있도록 도울 것이다. 다시 말해 여러분이 꿈꿔왔던 프로그래머가 될 수 있도록 도와줄 수 있는 책이다.

이 책의 구성

이 책에서 다루는 주제는 많은 신입 프로그래머들이 어려움을 겪어온 분야들이다. 또한 이 책은 프로그래밍 초반과 중반 무렵 다양한 영역에서 발생하는 대표적인 모습들을 폭넓게 제시한다. 그러나 이 책은 알고리즘에 대해 예제 위주로 설명한 ‘요리책(Cookbook)’ 스타일의 책이거나 특정 문제를 해결하기 위한 패턴에 대한 책이 아니라는 점을 거듭 강조하고 싶다. 책의 후반부에서 잘 알려진 알고리즘과 패턴을 어떻게 적용할지에 대해 논의를 하겠지만, 이 책을 특정 문제를 해결하기 위한 커닝 페이퍼로 사용하거나 여러분이 현재 겪고 있는 문제에 직접적으로 관련된 장에만 집중하지 않았으면 한다.

저자/역자 소개

저자 서문

여러분은 프로그램 언어를 이해했음에도 프로그램을 만드는 일이 어려운가? 프로그램 책을 읽는 내내 고개를 끄덕이며 읽지만 읽은 내용을 프로그램에 적용하기가 힘든가? 온라인에서 읽은 프로그램의 각 코드가 어떤 역할을 하는지 다른 사람에게 설명할 수 있을 정도로 이해를 하는데도, 프로그램 작업과 문서 편집기의 빈 화면을 보면 머릿속이 하얘지는가?

여러분만 그런 것이 아니다. 나는 지난 15년간 프로그래밍 강의를 해왔다. 그러나 강의에 출석하는 학생 대부분이 비슷한 상황을 겪고 있다. 이러한 상황을 겪는 이유는 바로 문제 해결(problem solving) 능력이 부족하기 때문이다. 문제 해결 능력이란 주어진 문제를 기술하고 그것을 해결하기 위해 독창적인 프로그램을 작성할 수 있는 능력을 말한다. 물론 모든 프로그램이 광범위한 문제 해결 능력을 필요로 하는 건 아니다. 여러분이 기존 프로그램을 아주 사소하게 수정하고 디버깅하거나, 기존 프로그램에 테스트 코드를 추가하는 등의 일을 한다면 그 프로그래밍은 완전히 기계적인 작업이기 때문에 창의력이 필요하지는 않다. 그러나 모든 프로그램에는 문제 해결 능력을 요하는 시점이 있다. 그렇기 때문에 전문 프로그래머들은 프로그래밍 과정에서 직면하는 문제를 해결할 수 있어야 한다.

시행착오를 겪으면서 배우기보다는, 체계적인 방법으로 문제 해결 능력을 배우는 편이 좋다. 이 책은 그러한 문제 해결 능력을 배우기 위한 지침서다. 이 책을 통해 여러분은 생각을 정리하는 기법과 해결책을 찾아내는 과정, 특정한 부류의 문제에 적용하기 위한 전략을 배울 수 있다. 이 책을 통해 이러한 접근법을 배우는 동시에 여러분의 창의성을 끌어낼 수 있을 것이다. 더 이상 실수는 없을 것이다. 프로그래밍은 창의적인 활동이다. 특히 문제 해결은 더욱 그러하다. 창의성은 신비한 것이며 창의적인 사고가 동작하는 방식에 대해 정확하게 말할 수 있는 사람은 없다. 그러나 우리가 작곡을 배우거나 창의적인 글쓰기에 대한 조언을 얻거나 그림 그리는 법을 배울 수 있다면, 프로그래밍 문제를 창의적으로 해결하는 방법 또한 배울 수 있다. 이 책은 여러분이 무엇을 해야 할지 상세히 알려주지는 않는다. 하지만 여러분의 잠재적인 문제 해결 능력을 개발해서 여러분 스스로 무엇을 해야 할지 알 수 있도록 도울 것이다. 다시 말해 여러분이 꿈꿔왔던 프로그래머가 될 수 있도록 도와줄 수 있는 책이다.

이 책을 쓴 목적은 여러분이 모든 프로그래밍 작업을 체계적으로 접근할 수 있게 도와서 궁극적으로는 주어진 문제를 해결할 수 있다는 자신감을 갖게 하는 데 있다. 이 책을 다 읽고 난 후에 여러분 모두가 ‘프로그래머처럼 생각’하고 ‘스스로가 모두 프로그래머라는 사실을 믿을 수 있기’를 바란다.

저자 소개

안톤 스프라울(Anton Spraul)

기초 프로그래밍과 컴퓨터 과학을 15년 넘게 가르쳤다. 이 책은 어려움을 겪는 프로그래머들을 저자가 직접 개인 지도하면서 사용했던 기법들을 모아놓은 정수다. 『Computer Science Made Simple』의 저자이기도 하다.

옮긴이의 말

이 책은 프로그래밍 입문서다. 하지만 여타 프로그래밍 입문서와는 전혀 다른 방식으로 프로그래밍에 접근한다. 일반적인 프로그래밍 입문서가 프로그래밍의 기본 문법을 먼저 가르친 다음 간단한 예제를 통해 배운 내용을 점검하거나 활용하도록 독자들을 이끄는 반면, 이 책은 실생활에 있을 법한 문제를 독자들에게 제시한 다음 프로그래밍과는 상관없이 해당 문제를 어떻게 논리적으로 풀 것인지에 대해 먼저 고민하고 이를 프로그래밍으로 구현해볼 수 있게 이끈다.

그렇다고 이 책이 프로그래밍 입문자만을 위한 책은 아니다. 이 글을 읽고 있는 독자들 중 프로그래밍 입문서를 읽고 독학하거나 학교 또는 학원에서 기초 프로그래밍 수업을 이수했음에도, 실제 어떤 문제에 대한 해결책을 프로그래밍으로 구현하려 할 때가 닥치면 막막함을 느낀 독자들이 분명히 있을 것이다. 나 역시 프로그래밍에 막 입문했을 때 프로그래밍 문법에 초점을 맞춘 책들의 예제를 타이핑해보고 실행하는 것만으로 해당 책을 학습했다고 느낀 적이 있었다. C++와 윈도우 API 수업을 이수한 다음, 막상 지뢰찾기 게임을 구현하려 했을 때 어떤 식으로 알고리즘을 구현해야 할지 막막했던 기억이 난다.

지뢰찾기 게임을 구현하기 위해 이벤트 처리나 비트맵 처리 등의 윈도우 애플리케이션을 이해하는 일도 중요하지만, 그보다 더 중요한 핵심은 지뢰 배치와 숫자 표시, 사용자의 선택에 따라 지뢰를 터뜨릴지 주변 영역을 반전시킬지 등에 관한 알고리즘을 구현하는 것이라고 생각한다. 이러한 알고리즘 또는 원리를 구현하는 데 막막함을 느꼈던 적이 있다면 바로 이 책을 통해 문제 해결 능력을 키울 수 있다.

이 책에서는 각 장마다 주어진 문제를 해결하기 위한 다양한 문제 해결 기법을 소개한다. 해당 문제 해결 기법을 활용해 논리적인 문제 해결책을 도출한다. 그러고 나서 이러한 해결책을 프로그래밍으로 구현하면서 이를 위해 필요한 C++의 기본 문법과 개념들을 학습한다. 프로그래밍 입문자들이 가장 어려워하는 주제 중 하나인 객체지향을 다룸에 있어서도 객체지향이란 이런 것이라고 독자들에게 일방적으로 소개하는 게 아니라 문제 해결을 통해 독자들이 개념을 이해하게 이끌어 향후에 실제 어떤 문제를 해결하는 데 활용할 수 있게 돕는다.

번역 작업을 진행하면서, 내가 프로그래밍에 입문하던 당시에 이 책을 접했다면 어땠을까라는 생각을 많이 했다. 앞에서 언급했듯이 처음 입문했을 당시, 기본 문법을 섭렵하고도 막상 어떤 문제에 대한 해결책을 프로그래밍할 때마다 막막한 마음이 들어 내가 프로그래밍에 재능이 없는 건 아닐까 생각했던 적이 있었다. 그때 이 책을 접했더라면, 문제를 분석하고 프로그래밍으로 구현할 수 있는 체계적인 틀을 마련하는 데 큰 도움을 받을 수 있었으리라 확신한다.

옮긴이 소개

김무항

인하대학교에서 컴퓨터공학을 전공했다. 삼성SDS 정보기술연구소에 입사해 보안, IPTV, 증강현실, 위치 기반 서비스 등 다양한 분야에서 연구•개발을 수행했다. 이후 맥콰리 대학교 통번역학 석사 과정을 졸업한 후, 현재 바이오메트릭 보안 업체인 슈프리마에서 기술지원 업무를 맡고 있다. 마이크로소프트 관련 기술과 모바일 애플리케이션 개발, 최신 웹 기술에 관심이 많으며, 테크니컬에반젤리스트를 목표로 하고 있다.

목차

목차
  • 1장 문제 해결 전략
    • 고전 퍼즐
      • 여우와 거위, 옥수수
      • 타일 밀기 퍼즐
      • 스도쿠
      • 콰라시 열쇠
    • 일반적인 문제 해결 기술
      • 항상 계획을 세워라
      • 문제를 다른 방식으로 표현해보자
      • 문제를 나누어라
      • 아는 것부터 시작하라
      • 문제를 축소하라
      • 유사점을 찾아라
      • 실험하라
      • 좌절하지 말자
    • 연습문제

  • 2장 기본 퍼즐
    • 2장에서 사용할 C++ 살펴보기
    • 출력 패턴
    • 입력 처리
      • 문제 분할
      • 조각들을 하나로 합치기
    • 상태 추적
    • 결론
    • 연습문제

  • 3장 배열을 이용한 문제 해결
    • 배열에 관한 기본 지식
      • 저장
      • 복사
      • 회수와 검색
      • 정렬
      • 통계 계산
    • 배열을 사용한 문제 해결
      • 리팩토링
    • 고정 데이터 배열
    • 비 스칼라 배열
    • 다차원 배열
    • 배열을 사용해야 하는 경우
    • 연습문제

  • 4장 포인터와 동적 메모리를 사용한 문제 해결
    • 포인터에 관한 기본 지식
    • 포인터의 이점
      • 런타임 시 크기를 결정할 수 있는 데이터 구조
      • 크기 변경이 가능한 데이터 구조
      • 메모리 공유
    • 포인터를 사용해야 하는 경우
    • 메모리
      • 스택과 힙
      • 메모리 크기
      • 수명
    • 포인터 문제의 해결
      • 가변 길이 문자열
      • 연결 리스트
    • 결론과 다음 과정
    • 연습문제

  • 5장 클래스를 사용한 문제 해결
    • 클래스에 관한 기본 지식
    • 클래스 사용 목적
      • 캡슐화
      • 코드 재사용
      • 문제 세분화
      • 정보 은닉
      • 가독성
      • 표현성
    • 간단한 클래스 작성
      • 기본 클래스 프레임워크
      • 지원 메소드
    • 동적 데이터를 사용하는 클래스
      • 노드 추가
      • 연결 리스트 재배열
      • 소멸자
      • 깊은 복사
      • 전체적인 관점에서 동적 메모리를 사용하는 클래스 살펴보기
    • 피해야 할 실수
      • 가짜 클래스
      • 한정된 용도를 지니는 클래스
    • 연습문제

  • 6장 재귀를 사용한 문제 해결
    • 재귀에 관한 기본 지식
    • 전방 재귀와 후방 재귀
      • 첫 번째 접근법
      • 두 번째 접근법
    • 체계적인 재귀 적용 방식
    • 일반적인 실수
      • 매개변수 과다
      • 전역 변수
    • 동적 데이터 구조에 재귀 적용
      • 재귀와 연결 리스트
      • 재귀와 이진 트리
    • 래퍼 함수
    • 재귀를 사용해야 하는 경우
      • 재귀를 반대하는 이유
    • 연습문제

  • 7장 코드 재사용을 통한 문제 해결
    • 올바른 재사용과 잘못된 재사용
    • 구성요소란 무엇인가?
      • 코드 블록
      • 알고리즘
      • 패턴
      • 추상 데이터 타입
      • 라이브러리
    • 구성요소에 대한 지식 쌓기
      • 탐색 학습
      • 필요에 따른 학습
    • 구성요소 타입 선택
      • 실제 구성요소 선택하기
      • 결과 비교
    • 연습문제

  • 8장 프로그래머처럼 사고하기
    • 자신만의 종합 계획 만들기
      • 자신의 장단점에 따라 전략 세우기
      • 종합 계획 세우기
    • 어떤 문제든 효율적으로 대처하기
      • 속이기 위한 방법 찾기
      • 행맨 게임에서 플레이어 2를 속이는 데 필요한 연산
      • 초기 설계
      • 코딩 초기 단계
      • 초기 구현에 대한 분석
      • 문제 해결 기술
    • 새로운 프로그래밍 기술 학습
      • 새로운 언어
      • 이미 친숙한 언어에 관한 새로운 기술 익히기
      • 새로운 라이브러리
      • 수업을 들어라
    • 결론
    • 연습문제

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

2             5       3                     10