Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

The way of the program

이 책의 목표는 컴퓨터 과학자처럼 생각하는 법을 가르치는 것이다. 이 사고 방식은 수학, 엔지니어링 자연과자들이 어떻게 세상을 바라보고 문제를 푸는지에 대한 것이다. 수학자와 마찬가지로 컴퓨터 과학자들은 특정 언어를 이용해서 자신의 아이디어(특히 계산)를 표현하고 다른 컴퓨터 과학자들과 공유한다. 또한 엔지니어와 마찬가지로 어떤 것을 디자인하고, 단위 구성요소들을 만들고 이것들을 조립해서 어떤 시스템을 만들어 낸다. 때때로(혹은 많은 경우) 이미 만들어진 구성물들을 가져와서 균형있게 조립해서 새로운 시스템을 만들기도 한다. 과학자와 마찬가지로 그들은 복잡한 시스템의 동작을 관찰하고, 가설을 세우고 결과를 예측한다.

컴퓨터 과학자에게 가장 중요한 과제는 문제를 해결하는 것이다. 문제 해결이란 문제를 찾아내고, 이것을 공식화하고 해결책을 찾아서 (프로그래밍)언어로 해결방법을 만들고, 이 해결 방법을 컴퓨터라는 도구를 이용해서 실행해서 답을 찾아내는 것 까지의 전 과정을 의미한다. 즉 프로그래밍을 공부하는 것은 문제해결 기술을 공부하는 것이기도 하다. 이번 장의 제목을 프로그램의 길이라고 붙인 이유다.

한편으로 우리는 프로그램을 만드는 법을 배울 것이다. 그리고 프로그래밍을 이용해서 문제를 풀기위한 다양한 방법들을 배울 것이다.

프로그램이란 무엇인가

프로그램이란 계산을 수행하는 절차와 방법을 명시한 일련의 명령의 집합이다. 복잡하게 생각 할 필요 없다. 어떤 작업을 수행하기 위한 메뉴얼이라고 보면 된다. 사람이 읽어서 수행하느냐 컴퓨터가 수행하느냐의 차이가 있을 뿐이다. 프로그램이 하는 계산은 방정식이나 다항식을 푸는 것과 같은 수학적인 것일 수도 있지만 이미지 처리나 소리의 재생, 문서 작성, 텍스트 검색과 같은 계산일 수도 있다.

컴퓨터에 내리는 명령들은 언어마다 표현에 있어서 차이가 있지만, 모든 언어들이 아래의 기초적인 지시사항들을 가지고 있다.
  1. 입력(Input) : 키보드, 파일, 네트워크 등의 장치로 부터 데이터를 가져온다.
  2. 출력(Output) : 화면에 데이터를 표시하고, 파일에 저장하고 네트워크를 이용해서 데이터를 전송한다.
  3. 수학 : 더하기, 곱하기, 나누기와 같은 기본 수학 연산을 한다.
  4. 조건부 실행 : 조건을 만족하는지 확인해서 동작을 실행한다.
  5. 반복 : 특정 조건하에서 반복적으로 동작을 실행한다.
믿거나 말거나 이게 전부다. 프로그램이 아무리 복잡해보여도, 위의 5가지 지시사항들로 구성된다. 따라서 프로그래램을 만드는 것은 복잡해 보이는 작업들을 간단한 작업들로 분해하고 이것들을 결합하는 절차로 볼 수 있다. 프로그래머(프로그램을 만드는 사람. 개발자라고 부르기도 한다) 이런 기본적인 지시사항들로 수행 할 수 있을 때까지 작업들을 나눈다. 모호하게 들릴 수 있지만 현실에서 사람이 일을 수행하는 것과 별 차이가 없다. 현실에서도 많은 일들이 큰 작업을 작은 단위의 작업으로 나누어서 작업자에게 할당하고, 그 결과를 결합해서 완전한 결과물을 만드는 식으로 진행한다.

파이선 실행

파이선(python)을 시작하려면 python과 이와 관련된 소프트웨어를 컴퓨터에 설치해야 한다. 운영체제 특히 명령행인터페이스(CLI)에 익숙하다면 python 설치에 아무런 문제가 없을 것이다. 그러나 초보자에게는 힘든일이 될 수 있다. 이 문제를 피하려면 웹 브라우저에서 파이선을 실행하는 것이 좋다. 나중에 파이선에 익숙해 지면 컴퓨터에 파이선을 설치하면 된다. 혹시라도 리눅스 사용자라면 아마도 우분투 리눅스를 사용 하고 있을 테고, 이 경우에는 파이선을 설치할 필요가 없다. 기본으로 설치돼 있기 때문이다.

파이선 인터프리터는 파이선 코드를 읽고 실행하는 프로그램이다. 환경에 따라서 아이콘을 클릭하거나 명령줄에 python을 입력하여 인터프리터를 시작할 수 있다. 시작하면 아래와 같은 텍스트가 화면에 출력된다.
$ python
Python 3.5.2+ (default, Sep 22 2016, 12:18:14) 
[GCC 6.2.0 20160927] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
파이선 인터프리터를 실행하면, 파이선의 버전과 파이선을 실행하고 있는 운영체제의 버전이 출력된다. 나는 파이선 3를 사용하고 있어서 3.5.2 가 출력됐는데, 파이선 2가 출력되는 경우도 있을 거다. 비록 파이선 3가 최신 파이선 버전이긴 하지만, 대부분은 파이선 2 버전이 기본으로 실행이 될거다.

마지막으로 프롬프트가 출력된다. 이것은 프로그래머에게 명령입력 준비가 끝났다는 걸 알려준다. 여기에 명령을 내리고 엔터키를 누르면, 이 명령은 파이선에게 전달되고 파이선에게 전달되고 파이선은 명령을 읽어서 수행한다.
>>> 1 + 1
2
이 것으로 파이선을 공부할 준비를 마쳤다.

첫번째 프로그램

전통적으로 새로운 언어를 배울 때, 가장 먼저 "Hello, World!"라는 단어를 화면에 표시하는 코드를 작성한다. 파이선으로는 아래와 같이 작성한다.
>>> print "Hello, World!"
이 프로그램을 실행하면 아래 문자열을 출력한다.
Hello, World!
python3 의 경우 괄호를 생략하면 에러가 발생한다.
>>> print("Hello, World")
괄호는 print가 함수임을 알려준다.

디버깅

파이선 인터프리터를 이용하면 줄 단위로 실행 결과를 확인 할 수 있기 때문에, 특히 공부에 많은 도움을 준다. 하지만 반복되는 코드의 테스트를 위해서는 스크립트를 만들어야 한다.

한번에 작동하는 코드를 만드는 건 불가능에 가깝다. 따라서 새로운 기능을 만들 때마다 반복해서 코드를 테스트해야 한다. 예를들어 "Hello, World" 같은 간단한 프로그램이라고 하더라도 따옴포를 생략하는 등의 실수는 흔하게 할 수 있다. 그래서 프로그래머는 자신의 프로그램을 계속 테스트해야 하며, 일상적으로 실패를 맛볼 것이다. 만든 프로그램이 제대로 작동하는지 테스트하고 확인하는 이 과정을 디버깅이라고 한다.

프로그래머에게 디버깅의 과정은 상반된 두 가지 감정을 불러온다. 프로그래머는 분노하거나 낙담할 수 있으며, 반대로 어떤 쾌감을 느낄 수도(쾌감의 정도는 분노와 낙담의 정도에 비례하곤 한다.) 있다.

디버깅은 프로그램을 테스트하는 과정이며, 어떤 데이터를 입력했을 때 내가 원하는 대로 작동하는지를 확인한다. 따라서 만약 당신이 하려고 하는 일에 대한 이해가 부족하다면, 디버깅이 부족해질 것이고, 프로그램이 실패항 확률도 높아진다. 사칙연산을 하는 간단한 프로그램을 만든다고 가정해보자. 여러분이 꼼꼼하다면 그리고 산술연산에서 0이 가지는 중요성을 알고 있다면, 5/0 과 같이 분모가 0일때 프로그램이 어떻게 작동하는지를 테스트 할 것이다. 이런 프로그램을 소비자에게 팔았다고 가정해보자. 프로그램이 뻗는다는 고객의 불만 사항이 접수될 것이고, 프로그래머는 문제가 생길 만한 부분을 추적할 것이다. 이 것은 매우 고통스러운 과정이 될 수 있다.

대부분의 경우 디버깅은 고통을 수반하지만 완벽하게 작동하는 프로그램을 만드는 것은 매우 힘들기 때문에, 좋은 프로그래머가 되고 싶다면 반드시 습득해야 할 유용한 기술이다. 각 장의 끝에서 디버깅에 대한 경험을 함께 공유하도록 하겠다.

용어

  • 고수준 언어(high-level language) : 파이선 처럼 인간이 쉽게 이용 할 수 있도록 디자인된 프로그래밍 언어