1.1.1 프로그램이란 무엇인가

프로그램은 어떤 작업을 수행하는 과정을 안내하는 지식이다. 꼭 컴퓨터 분야에만 한정된 이야기가 아닌데, 예를 들면 음식 레시피(조리법)도 일종의 프로그램이다. 레시피에는 재료를 손질하고, 데치고, 찌고, 굽고, 내어 놓는 과정이 순서대로 차근차근 나와 있다. 그 과정을 충실히 따르면 누구나 괜찮은 요리를 할 수 있다. 전문 요리사나 미식가가 아니더라도 말이다.

개념 정리

  • 프로그램: 작업의 수행 과정을 설명한 지식

컴퓨터 프로그램은 컴퓨터가 작업을 수행하는 과정을 담은 지식이다. 컴퓨터는 사람을 이해하며 행동하지 않는다. 단지 프로그램에 기술된 명령을 빠르고 정확하게 수행할 뿐이다. 사람의 일을 이해하고 도와주는 수많은 프로그램을 따름으로써, 컴퓨터는 우리에게 온갖 이로움을 제공할 수 있다.

그림 1-1 컴퓨터와 프로그램

그림 1-1 컴퓨터는 프로그램 덕분에 여러 가지 일을 할 수 있다

그러므로 프로그램이 일을 똑바로 처리할 수 있도록 잘 만드는 것이 중요하다. 이것을 프로그래밍이라고 한다. 컴퓨터가 더 많은 일을 할 수 있게 하고, 더 잘 할 수 있게 개선하는 것이다. 컴퓨터에게 일하는 방법을 가르쳐주면, 사람의 머리와 손으로 해 왔던 귀찮은 일들을 맡길 수 있다. 컴퓨터가 잘못 일하는 부분을 찾아, 더 올바르게 일하도록 고칠 수도 있다.

개념 정리

  • 프로그래밍: 컴퓨터 프로그램을 만드는 활동

1.1.2 프로그래밍 언어는 왜 필요한가

프로그램을 읽고 쓰기 위한 약속

프로그램은 어떤 작업을 수행하는 과정을 안내하는 지식이라고 했다. 이 지식을 정확하게 표현해 컴퓨터에게 일을 시켜야 한다. 그런데 컴퓨터는 사람의 언어를 이해하지 못한다. 그래서 컴퓨터가 이해할 수 있는 언어, 즉 기계어(컴퓨터의 단순한 기본 명령에 일련번호를 부여한 것)로 프로그램을 작성해야 한다.

하지만 기계어는 이진수로 이루어진 데다 CPU와 레지스터를 직접 제어하는 원시적인 명령만 제공한다. 사람의 생각을 표현하기에는 몹시 불편하다. 다음은 기계어로 덧셈식 ‘1789 + 211’을 계산하는 명령을 기계어로 작성해 본 것이다. 간단한 덧셈 연산이지만 이해하기가 쉽지 않다.

코드 1-1 덧셈식 ‘1789 + 211’ 을 계산하는 명령 (기계어)

01001000 11000111 11000000 11111101 00000110 00000000 00000000  (mov rax,0x6fd)
01001000 00000101 11010011 00000000 00000000 00000000           (add rax,0xd3)

기계에게 명령도 내릴 수 있으면서, 사람의 생각을 나타내기에도 용이한 언어가 있다면 프로그램을 만들기 훨씬 좋을 것이다. 그래서 만들어진 것이 프로그래밍 언어다. 다음 코드는 ‘1789 + 211’을 계산하는 명령을 우리가 앞으로 배울 프로그래밍 언어인 파이썬으로 작성해 본 것이다. 덧셈을 아는 사람이라면 누구라도 이해할 수 있을 것이다.

코드 1-2 덧셈식 ‘1789 + 211’ 을 계산하는 명령 (파이썬)

1789 + 211

프로그래밍 언어는 프로그램을 더 편하게 읽고 쓰기 위해 만든 언어다. 사람도 쉽게 이해할 수 있고, 번역 프로그램을 통해 기계어로 번역하면 컴퓨터도 이해할 수 있다. 프로그래밍 언어는 기계어와 자연어(사람의 일상 언어)의 중간에 위치한다. 프로그래밍 언어에도 여러 가지가 있는데, 컴퓨터의 기계적인 특성에 가까울수록 저수준 언어, 사람의 생각에 가까울수록 고수준 언어로 분류한다. 파이썬은 사람이 사용하기 쉬운 고수준 언어다.

그림 1-2 고수준 언어와 저수준 언어

그림 1-2 고수준 언어와 저수준 언어

프로그래밍 언어는 약속이다. 같은 약속을 따르는 프로그래머들은 소스 코드를 서로 돌려 보거나 함께 협업할 수도 있다. 파이썬을 사용하는 프로그래머들은 세계 곳곳에 아주 많다. 외국어를 배우면 외국인과 의사소통할 수 있듯, 파이썬을 배우면 파이썬 프로그래머들과 소통할 수 있다.

개념 정리

  • 기계어: 컴퓨터가 이해하는 유일한 언어
  • 프로그래밍 언어: 프로그램을 작성할 때 사용하는 언어. 사람도 쉽게 이해할 수 있다. 번역 프로그램을 이용해 기계어로 번역하거나 실행시킬 수 있다.

프로그램의 번역과 실행

프로그래밍 언어로 작성한 프로그램 코드를 소스 코드(source code)라고 한다. 프로그래밍 언어마다 소스 코드를 기계어 코드로 번역하기 위한 프로그램이 있다. 이런 번역 프로그램은 크게 컴파일러(compiler)인터프리터(interpreter)로 나뉜다. 컴파일러는 소스 코드를 기계어로 미리 번역해 둘 때 사용하는 프로그램이다. 인터프리터는 실행이 필요할 때 소스 코드를 실시간으로 해석해서 그에 맞는 명령을 컴퓨터에게 지시하는 프로그램이다.

그림 1-3 프로그램의 번역 과정

그림 1-3 프로그램의 번역 과정

파이썬은 인터프리터 언어다. 파이썬으로 프로그램을 만든다는 것은 컴퓨터가 수행해야 할 작업을 파이썬 언어로 기술한다는 의미다. 파이썬 언어로 작성한 프로그램은 파이썬 인터프리터로 실행할 수 있다.

개념 정리

  • 소스 코드: 기계어로 번역되지 않은 원본 프로그램 코드
  • 인터프리터: 소스 코드를 해석해서 실행시켜주는 프로그램.

1.1.3 파이썬 살펴보기

파이썬은 누가 만들었나

파이썬은 귀도 반 로섬(Guido van Rossum)이라는 프로그래머가 1989년에 처음 만들었다. 2001년에는 귀도를 포함해 파이썬의 발전에 기여해 온 사람들을 중심으로 파이썬 소프트웨어 재단(Python Software Foundation, PSF)이 설립되었다. 파이썬 소프트웨어 재단이 파이썬 언어를 정의·개정하는 일을 맡아오고 있고, 그 외에도 수많은 프로그래머가 다양한 라이브러리(여러분의 프로그램에 삽입할 수 있는 프로그램 조각)를 개발해 파이썬 생태계에 기여하고 있다. 기술의 발전·프로그래밍 방식의 변화에 부응해 프로그래밍 언어도 새로운 기능이 추가되고 발전해야 하기 때문에 이런 노력은 꾸준히 필요하다.

그림 1-4 파이썬 로고

그림 1-4 파이썬 로고

파이썬의 이용권

파이썬은 무료다. 파이썬 소스 코드를 실행하는 데 필요한 인터프리터는 파이썬 공식 웹사이트(https://www.python.org/)에서 다운로드할 수 있다. 이 책에서는 ‘파이참(PyCharm)’이라는 개발 도구를 이용해 학습을 진행할 것인데, 파이참을 설치하면 파이썬 인터프리터가 함께 설치되므로 직접 다운로드하지 않아도 된다. 파이참 역시 커뮤니티판이 무료로 제공된다.

파이썬의 언어적 특징

세상에는 다양한 프로그래밍 언어가 있고 언어마다 특징이 다르다. 파이썬과 다른 고수준 프로그래밍 언어를 비교해 보자.

언어 패러다임 데이터 유형 검사 방식 메모리 관리
C 절차적 프로그래밍 정적 수동
C++ 다중 패러다임 정적 수동
자바(Java) 객체지향 프로그래밍 정적 자동
루비(Ruby) 객체지향 프로그래밍 동적 자동
클로저(Clojure) 함수형 프로그래밍 동적 자동
하스켈(Haskell) 함수형 프로그래밍 정적 자동
파이썬 다중 패러다임 동적 자동

표 1-1 고수준 프로그래밍 언어 비교

패러다임: 프로그래밍 패러다임은 프로그램을 잘 작성하기 위한 방법과 지침이다. 파이썬은 객체지향 패러다임을 기반으로 하되, 다양한 패러다임을 지원한다.

데이터 유형 검사: 변수에 어떤 유형의 데이터를 대입할 수 있는지 미리 정해 두는 방식을 정적 검사 방식, 그렇지 않은 방식을 동적 검사 방식으로 분류한다. 정적 검사 방식은 오류를 발견하기 쉬운 대신 코드를 작성하기가 좀 더 까다롭다. 파이썬은 동적 검사 방식이어서 코드 작성이 더 간편하다.

메모리 관리: 메모리는 데이터를 기억하는 공간으로, 모든 프로그램이 나누어 사용하는 중요한 자원이다. 파이썬은 메모리를 자동으로 관리해주기 때문에 프로그래머가 메모리와 관련된 문제로 골치를 썩을 일이 별로 없다.

패러다임, 데이터 유형, 메모리라는 말이 생소하고 잘 이해되지 않아도 괜찮다. 위의 표를 외울 필요도 전혀 없다. 파이썬이 유연하고 사용하기 쉬운 언어라는 점이 핵심이다.

파이썬을 활용하기에 좋은 분야

파이썬은 다양한 분야에 사용될 수 있을 만큼 강력하고, 실제로도 활용되고 있다.

  • 프로그래밍 교육: 배우기 쉬운 언어인 파이썬은 프로그래밍 입문용 언어로 사랑받고 있다.

  • 웹 서비스: 웹 서비스란 웹 사이트, 인터넷 쇼핑몰, 블로그, 채팅 등 웹 브라우저로 인터넷에 접속한 사람들에게 제공하는 다양한 서비스다. 장고(Django), 플라스크(Flask) 등 파이썬 기반의 웹 프레임워크를 사용하여 전문적인 웹 프로그래밍을 할 수 있다.

  • 데이터 과학: 데이터 과학이란 통계와 시각화 도구를 활용해 데이터 속에서 의미 있는 지식과 통찰을 이끌어내는 기술이다. 데이터 분석에 파이썬을 활용하는 사람들이 많아지고 있다. 판다스(Pandas), 넘파이(NumPy), 맷플롯(matplotlib) 등 파이썬에서 사용할 수 있는 데이터 과학 도구가 많다.

  • 기계학습: 기계학습(machine learning)은 알파고, 이미지 인식, 자율주행 등 최신 유행 기술에 사용된다. 파이썬에서는 사이킷런(scikit-learn), 텐서플로(TensorFlow) 등의 기계학습 도구를 사용할 수 있다.

  • 사무자동화: 단순 반복 작업은 사람의 손과 머리보다는 컴퓨터로 수행하는 편이 훨씬 빠르고 정확하다. 파이썬을 이용하면 귀찮고 번거로운 작업을 자동화할 수 있다.

  • 명령행 유틸리티: 파이썬은 간단한 명령행 유틸리티를 작성하는 데도 많이 사용된다. 파이썬 코드는 빠르고 쉽게 작성할 수 있고, 파이썬 인터프리터가 설치된 서버가 많기 때문에, 시스템 관리자나 해커들이 스크립트를 빠르게 작성하고 사용하기 좋다.

다른 언어가 필요한 분야

어떤 분야는 사용하는 언어가 정해져 있어, 그 분야에서 파이썬을 직접 사용하기는 어려울 수 있다. 하지만 파이썬을 익히며 배운 프로그래밍 지식은 다른 언어에서도 통용된다. 파이썬으로 기본을 다진 뒤, 원하는 분야에 필요한 언어를 배우는 것도 좋은 방법이다.

  • 프론트엔드 웹 개발: 프론트엔드 웹 기술은 웹 브라우저에서 웹 문서를 표현하거나 웹 애플리케이션을 만들 때 사용된다. 이 분야에는 하이퍼텍스트 마크업 언어(HTML), 캐스케이딩 스타일 시트(CSS), 자바스크립트(Javascript)라는 언어가 주로 사용된다.

  • 모바일 애플리케이션: 안드로이드 애플리케이션 개발에는 자바와 코틀린(Kotlin), iOS 애플리케이션 개발에는 오브젝티브-C(Objective-C)와 스위프트(Swift)가 사용된다.

  • 컴퓨터 게임: 파이썬으로도 파이게임(Pygame) 라이브러리를 이용해 간단한 2차원 그래픽 게임을 만들 수 있다. 하지만 최신 고사양 3차원 그래픽 게임을 만들 때는 주로 C, C++, C# 등이 사용된다.