Python & AI Tutorials Logo
Python 프로그래밍

1. Python 첫걸음

Python 프로그래밍 여정에 온 것을 환영합니다! 이 장에서는 Python이 무엇인지 이해하고, 컴퓨터에 Python을 설치하고, 첫 번째 Python 코드를 실행하는 데 필요한 필수 첫 단계를 살펴봅니다. 이 장을 마칠 때쯤이면 Python 대화형 셸을 편안하게 사용할 수 있고, 스크립트 파일을 만들고 실행할 수 있으며, Python이 보여 주는 기본적인 에러 메시지를 이해할 수 있게 됩니다.

1.1) 프로그램이란 무엇이고 Python은 무엇을 할까요?

Python 자체로 들어가기 전에, 먼저 프로그램이 무엇인지, 그리고 프로그램을 만드는 데 Python이 어떤 역할을 하는지부터 이해해 보겠습니다.

1.1.1) 프로그램 이해하기

프로그램은 컴퓨터에게 무엇을 해야 하는지 알려 주는 명령어 집합입니다. 레시피가 케이크를 굽는 방법을 단계별로 설명해 주는 것처럼, 프로그램은 컴퓨터에게 어떤 작업을 어떻게 단계별로 수행할지 알려 줍니다. 이 작업은 단순한 계산부터 웹 페이지 표시, 이미지 처리, 로봇 제어 같은 복잡한 작업까지 다양합니다.

컴퓨터는 영어, 스페인어 같은 인간의 언어를 직접 이해하지 못합니다. 컴퓨터가 이해하는 것은 머신 코드(machine code)뿐인데, 이는 아주 기초적인 연산을 나타내는 0과 1의 이진수(바이너리)로 이루어진 코드입니다. 사람이 직접 머신 코드를 작성하는 것은 매우 어렵고, 에러가 쉽게 발생합니다.

여기서 프로그래밍 언어가 등장합니다. 프로그래밍 언어는 사람이 읽을 수 있는 형태로 명령을 작성하고, 이를 머신 코드로 번역할 수 있게 해 주는 방법입니다. Python은 이런 프로그래밍 언어 중 하나로, 특히 사람이 읽고 쓰기 쉽게 설계된 언어입니다.

1.1.2) Python이 특별한 이유

Python은 고수준 프로그래밍 언어(high-level programming language)입니다. 이는 저수준 언어에서 직접 다뤄야 하는 많은 복잡한 세부 사항들을 추상화해서 숨겨 준다는 뜻입니다. Python이 초보자와 전문가 모두에게 특히 매력적인 이유는 다음과 같습니다.

읽기 쉬운 문법: Python 코드는 거의 영어 문장을 읽는 것처럼 느껴질 정도로 읽기 쉽습니다. 예를 들어 Python에서 "Hello, World!"를 출력하려면 이렇게 씁니다.

python
# hello_simple.py
print("Hello, World!")

출력:

Hello, World!

같은 일을 C나 Java 같은 언어로 하려면 훨씬 더 많은 상용구(boilerplate) 코드가 필요합니다.

인터프리터 언어: Python은 인터프리터 언어(interpreted language)입니다. 이는 코드를 실행하기 전에 미리 머신 코드로 컴파일할 필요가 없다는 뜻입니다. 대신 Python 인터프리터(Python interpreter)라는 프로그램이 코드를 읽고 한 줄씩 실행합니다. 덕분에 코드를 수정한 뒤 결과를 바로 확인할 수 있어 개발이 더 빠릅니다.

다재다능하고 강력함: Python은 초보자 친화적이지만, 동시에 전문적인 환경에서도 사용됩니다. 예를 들어:

  • 웹 개발(웹사이트, 웹 애플리케이션)
  • 데이터 분석 및 시각화
  • 머신러닝과 인공지능
  • 과학 계산
  • 자동화와 스크립팅
  • 게임 개발
  • 그 외 여러 분야

거대한 커뮤니티와 라이브러리: Python에는 방대한 사용자 커뮤니티와, 기능을 확장해 주는 수천 개의 라이브러리가 있습니다. 덕분에 많은 문제는 라이브러리를 하나 가져다 쓰는 것만으로도 쉽게 해결할 수 있습니다.

1.1.3) Python이 코드를 실행하는 방식

Python 코드를 작성해서 실행하면, 내부에서는 다음과 같은 일이 일어납니다.

Your Python Code

Python Interpreter

Bytecode

Python Virtual Machine

Execution/Output

  1. 코드를 작성합니다: Python 명령을 담은 파일을 만들거나, Python 대화형 셸에 직접 입력합니다.

  2. 인터프리터가 코드를 읽습니다: Python 인터프리터가 코드를 읽으면서 문법 에러(코드를 잘못 쓴 부분)가 있는지 확인합니다.

  3. 바이트코드로 변환: 문법 에러가 없다면, Python은 코드를 바이트코드(bytecode)라는 중간 형태로 변환합니다. 바이트코드는 코드의 중간 형태로, Python과 머신 코드의 중간쯤에 있는 언어입니다. 컴퓨터 입장에서는 Python 원본 코드보다 실행하기 쉽지만, 순수 머신 코드만큼 낮은 수준은 아닙니다.

  4. 실행: Python 가상 머신(PVM, Python Virtual Machine)이 이 바이트코드를 실행하면서, 작성한 동작을 실제로 수행합니다.

  5. 출력: 화면에 텍스트가 출력되거나, 파일이 생성되는 등, 프로그램의 결과가 나타납니다.

이 과정의 장점은, 대부분의 단계를 신경 쓸 필요가 없다는 점입니다. 코드를 쓰고 실행해 결과를 보면 되고, 나머지는 인터프리터가 처리합니다.

1.2) Python 설치와 인터프리터 실행하기

Python으로 프로그래밍을 시작하려면, 먼저 컴퓨터에 Python을 설치해야 합니다. 이 절에서는 설치 과정을 안내하고, 모든 것이 제대로 작동하는지 확인해 보겠습니다.

1.2.1) Python이 이미 설치되어 있는지 확인하기

어떤 운영체제는 Python이 미리 설치되어 있기도 합니다. 새로 다운로드하기 전에, 먼저 시스템에 Python이 이미 있는지 확인해 보겠습니다.

Windows에서:

  1. 명령 프롬프트(Command Prompt)를 엽니다.

    • Windows + R 키를 눌러 실행 창을 엽니다.
    • cmd를 입력한 후 Enter를 누릅니다.
  2. 다음 명령을 입력하고 Enter를 누릅니다.

bash
python --version

Python이 설치되어 있다면, 대략 다음과 같은 출력이 나옵니다.

Python 3.11.5

'python' is not recognized as an internal or external command와 같은 에러 메시지가 보인다면, Python이 설치되어 있지 않거나, 시스템 PATH에 등록되어 있지 않은 것입니다.

macOS에서:

  1. Terminal 애플리케이션을 엽니다.

    • Command + Space를 눌러 Spotlight를 엽니다.
    • Terminal을 입력한 뒤 Enter를 누릅니다.
  2. 다음 명령을 입력하고 Enter를 누릅니다.

bash
python3 --version

참고: macOS에서는 보통 python 대신 python3를 사용합니다. python이 오래된 Python 2를 가리키는 경우가 있기 때문입니다.

Python 3가 설치되어 있다면, 다음과 같은 출력이 나옵니다.

Python 3.11.5

Linux에서:

  1. 사용하는 배포판에 맞는 터미널 애플리케이션을 엽니다.

  2. 다음 명령을 입력하고 Enter를 누릅니다.

bash
python3 --version

대부분의 최신 Linux 배포판에는 Python 3가 기본으로 설치되어 있습니다.

1.2.2) Python 다운로드 및 설치

Python이 설치되어 있지 않거나, 너무 오래된 버전이라면 최신 버전을 설치해야 합니다.

Windows 설치:

  1. 공식 Python 웹사이트로 이동합니다. https://www.python.org/downloads/

  2. "Download Python" 버튼을 클릭합니다(예: "Download Python 3.11.5"처럼 최신 버전이 표시됩니다).

  3. 다운로드된 설치 프로그램(.exe 파일)을 실행합니다.

  4. 중요: 설치 프로그램 첫 화면에서 "Add Python to PATH"라는 체크박스를 선택합니다. 이 옵션은 매우 중요합니다. 이 옵션을 켜야 명령 프롬프트 어디에서나 Python을 실행할 수 있습니다.

    만약 이 옵션을 빼먹었다면: "Add Python to PATH"를 선택하지 않으면, 명령줄에서 Python을 실행하려 할 때 'python' is not recognized as an internal or external command 같은 에러가 나타납니다. 이 경우 Python을 다시 설치하면서 체크박스를 켜거나, 초보자에게는 조금 더 복잡한 PATH 수동 설정을 해야 합니다.

  5. "Install Now"를 클릭하고 설치가 끝날 때까지 기다립니다.

  6. 설치가 끝나면 새 명령 프롬프트를 열고 다음을 입력해 확인합니다.

bash
python --version

방금 설치한 버전 번호가 보여야 합니다.

macOS 설치:

  1. https://www.python.org/downloads/ 로 이동합니다.

  2. 최신 버전에 대한 "Download Python" 버튼을 클릭합니다.

  3. 다운로드된 .pkg 파일을 열고 설치 마법사를 따릅니다.

  4. Terminal을 열고 다음을 입력해 설치를 확인합니다.

bash
python3 --version

Linux 설치:

대부분의 Linux 배포판에는 Python 3가 포함되어 있지만, 설치하거나 업데이트해야 할 수도 있습니다.

Ubuntu/Debian 계열:

bash
sudo apt update
sudo apt install python3

Fedora/Red Hat 계열:

bash
sudo dnf install python3

다음으로 설치를 확인합니다.

bash
python3 --version

1.2.3) Python 인터프리터 실행하기

Python을 설치했다면, 이제 명령줄이나 터미널에서 바로 Python 인터프리터를 실행할 수 있습니다. 인터프리터는 Python 코드를 실제로 실행하는 프로그램입니다. 인터프리터를 직접 실행하면 대화형 셸(REPL)이 열립니다. 이는 스크립트 파일을 실행하는 것(1.4절에서 다룰 내용)과는 다릅니다.

Windows에서:

명령 프롬프트를 열고 다음을 입력합니다.

bash
python

macOS와 Linux에서:

Terminal을 열고 다음을 입력합니다.

bash
python3

그러면 대략 다음과 같이 보입니다.

Python 3.11.5 (main, Sep 11 2023, 13:54:46) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

>>> 프롬프트는 Python이 명령을 받을 준비가 되었다는 표시입니다. 이를 Python 대화형 셸(Python interactive shell) 또는 REPL(Read-Eval-Print Loop)이라고 부르며, 다음 절에서 자세히 살펴보겠습니다.

인터프리터를 종료하는 방법:

  • exit()를 입력하고 Enter를 누르기
  • quit()를 입력하고 Enter를 누르기
  • macOS/Linux: Ctrl + D 누르기
  • Windows: Ctrl + Z를 누른 뒤 Enter 누르기

축하합니다! Python을 성공적으로 설치했고, 인터프리터가 잘 작동하는 것을 확인했습니다. 이제 Python 코드를 작성할 준비가 되었습니다.

1.3) Python 대화형 셸(REPL) 사용하기

Python 대화형 셸, 흔히 REPL(Read-Eval-Print Loop)이라고 부르는 것은 학습과 실험에 매우 유용한 기능입니다. REPL을 사용하면 Python 코드를 입력하고 결과를 바로 볼 수 있어서, 새로운 개념을 시험해 보고, 작은 코드 조각을 테스트하고, Python의 기능을 탐색하기에 적합합니다.

1.3.1) REPL이란 무엇인가?

Python 대화형 셸, 즉 REPL(Read-Eval-Print Loop)은 학습과 실험을 위해 Python에서 사용할 수 있는 가장 유용한 기능 중 하나입니다. REPL은 Python 대화형 셸(Python interactive shell) 또는 간단히 대화형 인터프리터(interactive interpreter)라고도 부르는데, 모두 같은 것을 가리킵니다. 즉, >>> 프롬프트에서 Python 코드를 입력하고 즉시 결과를 볼 수 있는 환경을 말합니다.

REPL은 다음의 약자입니다.

  • Read: Python이 입력한 코드를 읽습니다.
  • Eval: Python이 그 코드를 평가(실행)합니다.
  • Print: Python이 결과를 출력합니다.
  • Loop: Python이 다시 처음으로 돌아가 다음 코드를 읽습니다.

이 순환은 REPL에서 나갈 때까지 계속됩니다. 이는 마치 Python과 대화를 하는 것과 비슷합니다. 명령을 하나 주면 Python이 응답하고, 그 응답에 따라 바로 다음 명령을 줄 수 있습니다.

1.3.2) REPL 시작하고 사용하기

REPL을 시작하려면, 이전 절에서처럼 명령줄이나 터미널을 열고 Windows에서는 python, macOS/Linux에서는 python3를 입력하면 됩니다.

>>> 프롬프트가 보이면 Python 코드를 입력할 수 있습니다. 간단한 예제를 몇 가지 살펴보겠습니다.

간단한 산술 연산:

python
>>> 5 + 3
8
>>> 10 * 2
20
>>> 15 / 3
5.0

REPL에서는 print()를 사용하지 않아도 표현식의 결과를 자동으로 보여 준다는 점에 주목하십시오. 이것이 REPL의 편리한 점 중 하나입니다.

텍스트 다루기:

python
>>> "Hello, World!"
'Hello, World!'
>>> "Python" + " is " + "great"
'Python is great'

따옴표로 둘러싼 문자열만 입력하면 Python은 그 값을 따옴표와 함께 보여 줍니다. 이는 문자열을 Python이 내부적으로 표현하는 방식입니다. 따옴표 없이 화면에 텍스트를 출력하고 싶다면 print() 함수를 사용합니다.

python
>>> print("Hello, World!")
Hello, World!

차이를 보십시오. 문자열만 입력하면 따옴표와 함께 보이고(내부 표현), print()를 사용하면 따옴표 없이 실제 텍스트만 출력됩니다.

값을 변수에 저장하기:

값을 바로 입력하는 것도 유용하지만, 보통은 값을 여러 번 재사용하기 위해 변수에 저장합니다. 변수는 데이터를 담는 이름 있는 “상자”라고 볼 수 있습니다.

python
>>> name = "Alice"
>>> name
'Alice'
>>> age = 25
>>> age
25

name = "Alice"처럼 값을 변수에 대입하면, 그 줄을 실행할 때는 아무 것도 출력되지 않습니다. 하지만 변수 이름만 입력하면 Python이 그 변수에 담긴 값을 보여 줍니다.

계산기로서의 Python:

python
>>> 2 + 2
4
>>> (10 + 5) * 2
30
>>> 100 / 4
25.0
>>> 7 % 3
1

REPL은 이런 식으로 간단한 계산을 빠르게 해 볼 수 있는 좋은 계산기이기도 합니다.

1.3.3) REPL에서 여러 줄 입력하기

가끔은 한 줄로 끝나지 않는 코드를 작성해야 합니다. 예를 들면 함수(function) 정의 같은 경우입니다. REPL은 이런 여러 줄 코드를 잘 처리해 줍니다. 여러 줄이 필요한 구문을 시작하면 프롬프트가 >>>에서 ...로 바뀌어 더 입력을 기다리게 됩니다.

함수를 이용한 간단한 예를 보겠습니다. (참고: 함수에 대해서는 19장에서 자세히 배울 것입니다. 여기서는 REPL에서 여러 줄 입력 시 ... 프롬프트가 어떻게 동작하는지만 살펴보면 됩니다.)

python
>>> def greet():
...     print("Hello!")
...
>>> greet()
Hello!

첫 줄을 입력하고 Enter를 누르면 프롬프트가 ...로 바뀝니다. 그다음 들여쓴 줄을 입력하고 Enter를 누르고, 빈 줄에서 Enter를 한 번 더 눌러야 Python이 전체 코드를 실행합니다.

1.3.4) 이전에 입력한 명령 다시 사용하기

REPL은 입력한 명령의 기록을 저장합니다. 키보드의 위/아래 화살표 키를 사용해서 이전 명령을 다시 볼 수 있습니다.

  • 위쪽 화살표: 이전 명령을 보여 줍니다.
  • 아래쪽 화살표: 히스토리에서 앞으로 이동합니다(뒤로 갔다가 다시 앞으로 갈 때).

명령을 조금 수정해서 다시 실행하고 싶을 때나, 앞에서 무엇을 입력했는지 기억이 나지 않을 때 유용합니다.

1.3.5) REPL에서 도움말 얻기

Python REPL에는 내장된 도움말 기능이 있습니다. REPL 안에서 Python 객체, 함수, 모듈에 대한 정보를 직접 확인할 수 있습니다.

이런 도움말 기능은 Python을 탐색하면서 “무엇이 가능한지” 알고 싶을 때 특히 유용합니다. 예를 들어 문자열을 다루고 있는데 어떤 메서드들이 있는지 궁금하다면, dir(str)을 통해 가능한 메서드 목록을 볼 수 있습니다. 이 책을 계속 읽다 보면, 이런 도구들이 독립적으로 학습하고 탐색하는 데 점점 더 큰 도움이 될 것입니다.

python
>>> help()

이 명령을 입력하면 Python의 도움말 시스템으로 들어갑니다. 여기에서 보고 싶은 항목의 이름을 입력할 수 있고, quit를 입력하면 도움말 시스템에서 나옵니다.

특정 항목에 대한 도움말을 바로 보고 싶을 때는 다음과 같이 할 수 있습니다.

python
>>> help(print)

print() 함수에 대한 문서를 보여 줍니다. 끝까지 읽었다면 q를 눌러서 종료하면 됩니다.

또 하나 유용한 함수는 dir()인데, 이 함수는 객체가 가지고 있는 속성과 메서드 목록을 보여 줍니다. (참고: 속성과 메서드는 객체가 가진 “특징”과 “동작”이라고 생각할 수 있습니다. 이에 대해서는 43장에서 더 자세히 배울 것입니다. 모듈을 가져오는 방법(import)에 대해서는 22장에서 다룰 것입니다. 이 예제는 REPL이 Python의 기능을 탐색하는 데 어떻게 도움이 되는지를 보여 줍니다.)

python
>>> dir(str)

문자열 객체에서 사용할 수 있는 모든 메서드를 보여 줍니다.

1.3.6) REPL이 특히 유용한 때

REPL은 다음과 같은 상황에서 특히 유용합니다.

  1. 학습과 탐색: 새로운 개념을 배우고 있을 때, REPL을 사용하면 파일을 만들 필요 없이 곧바로 실험해 볼 수 있습니다.

  2. 작은 코드 조각 테스트: 프로그램에 코드를 추가하기 전에, REPL에서 먼저 테스트하여 예상대로 동작하는지 확인할 수 있습니다.

  3. 빠른 계산: REPL은 항상 사용할 수 있는 강력한 계산기입니다.

  4. 디버깅: 프로그램이 제대로 동작하지 않을 때, REPL에서 코드 일부를 따로 떼어내 개별적으로 테스트할 수 있습니다.

  5. 라이브러리 탐색: 새로운 라이브러리를 배울 때, REPL에서 라이브러리를 import한 뒤 그 안의 함수들을 직접 호출해 보며 익힐 수 있습니다.

하지만 REPL에는 한계도 있습니다. REPL에서 작성한 코드는 REPL을 닫으면 사라집니다. REPL 세션을 프로그램으로 저장하는 방법은 없습니다. 여러 번 다시 실행하고 싶은 코드는 스크립트 파일로 만들어야 하는데, 이에 대해서는 다음 절에서 살펴보겠습니다.

1.3.7) REPL 종료하기

REPL 사용을 마쳤다면, 여러 가지 방법으로 종료할 수 있습니다.

python
>>> exit()

또는:

python
>>> quit()

또는 키보드 단축키를 사용할 수 있습니다.

  • Windows: Ctrl + Z를 누른 뒤 Enter
  • macOS/Linux: Ctrl + D 누르기

종료하면 원래의 명령 프롬프트나 터미널로 돌아갑니다.

1.4) Python 스크립트 파일 만들고 실행하기

REPL은 실험과 빠른 테스트에 매우 좋지만, 코드를 저장해 두었다가 나중에 다시 실행하려면 어떻게 해야 할까요? 수십, 수백 줄짜리 긴 프로그램은 어떻게 작성해야 할까요? 이런 상황에서는 스크립트 파일(script files)이 필요합니다. 스크립트 파일은 Python 코드를 담은 영구적인 파일로, 편집하고 저장하고 반복해서 실행할 수 있습니다.

REPL은 실험에 매우 유용하지만, 대부분의 Python 프로그래밍은 스크립트 파일을 작성하는 형태로 이뤄집니다. 스크립트 파일은 Python 코드를 담은 텍스트 파일로, 저장하고 편집하고 반복해서 실행할 수 있습니다. 이 절에서는 첫 번째 Python 스크립트를 만드는 방법과, 명령줄에서 그것을 실행하는 방법을 배웁니다.

1.4.1) Python 스크립트란?

Python 스크립트(Python script)는 단순히 Python 코드를 담고 있는 텍스트 파일입니다. 파일 확장자는 .py를 사용합니다. REPL에 직접 입력하는 코드와 달리, 스크립트 파일은 다음과 같은 특징이 있습니다.

  • 파일로 저장되므로 나중에 다시 실행할 수 있습니다.
  • 쉽게 수정하고 편집할 수 있습니다.
  • 필요한 만큼 많은 코드를 담을 수 있습니다.
  • 다른 사람과 공유할 수 있습니다.
  • 자동으로 실행하거나, 일정에 따라 실행되게 만들 수 있습니다.

스크립트 파일은 메모해 두는 레시피에 비유할 수 있고, REPL은 레시피를 그때그때 만들어 가며 요리하는 것에 비유할 수 있습니다. 둘 다 쓰임새가 있지만, 어느 정도 길이가 있는 프로그램을 만들 때는 스크립트 파일이 필요합니다.

1.4.2) 텍스트 에디터 선택하기

Python 스크립트를 만들려면 텍스트 에디터가 필요합니다. Microsoft Word나 Google Docs 같은 워드 프로세서는 사용하지 마십시오. 이런 프로그램들은 서식을 위한 정보를 같이 넣기 때문에 Python이 이해하지 못합니다.

초보자에게 좋은 선택지:

  1. IDLE: Python과 함께 제공됩니다. 간단하고 학습용으로 설계되었습니다.

    • Windows: 시작 메뉴에서 "IDLE"을 검색
    • macOS/Linux: 터미널에서 idle3 실행
  2. Visual Studio Code(VS Code): 무료이고, 기능이 강력하며, 전문가들도 많이 사용하는 에디터입니다. 확장 기능을 통해 Python 지원이 매우 좋습니다.

  3. PyCharm Community Edition: Python 전용 통합 개발 환경(IDE)으로, 기능이 풍부합니다.

  4. Notepad++(Windows 전용): 가볍고 단순한 텍스트 에디터입니다.

  5. Sublime Text: 빠르고 세련된 에디터로, Python 지원도 좋습니다.

이 책에서는 어떤 에디터를 사용하더라도 동일하게 따라 할 수 있는 간단한 예제만 사용할 것입니다. 편하다고 느끼는 에디터를 하나 골라 사용하면 됩니다.

1.4.3) 첫 번째 Python 스크립트 만들기

간단한 인사 메시지를 출력하는 Python 스크립트를 하나 만들어 보겠습니다.

1단계: 새 파일 만들기

선택한 텍스트 에디터를 열고 새 파일을 만듭니다. 파일 이름을 hello.py로 저장하고, 나중에 다시 찾기 쉬운 위치(예: 바탕화면이나 Python 프로젝트용 폴더)에 저장합니다.

중요: .py 확장자가 꼭 있어야 합니다. 이 확장자를 보고 운영체제와 에디터가 “이것은 Python 파일이다”라고 인식합니다.

2단계: 코드 작성하기

파일에 다음 코드를 입력합니다.

python
# hello.py
# My first Python script
 
print("Hello, World!")
print("Welcome to Python programming!")

#로 시작하는 줄은 주석(comment)입니다. 코드를 읽는 사람을 위한 메모이고, Python은 완전히 무시합니다. 주석은 나중에 코드를 다시 볼 때 무슨 일을 하는 코드인지 기억하는 데 도움이 되고, 다른 사람에게도 코드를 이해하기 쉽게 해 줍니다. 주석에 대해서는 2장에서 더 자세히 살펴봅니다.

3단계: 파일 저장하기

파일을 저장합니다. 파일 이름이 hello.py.txt처럼 되지 않고, 정확히 hello.py로 저장되었는지 확인합니다.

이 코드가 하는 일을 간단히 정리해 보겠습니다.

  • print("Hello, World!")는 화면에 "Hello, World!"라는 텍스트를 표시하라고 Python에 지시합니다.
  • print("Welcome to Python programming!")는 두 번째 메시지를 표시합니다.

조금 더 복잡한 스크립트로 넘어가기 전에, 예제를 하나 더 추가해 보겠습니다.

python
# greetings.py
# A script with multiple print statements
 
print("Python is fun!")
print("Let's learn together.")
print("This is exciting!")

이 파일은 greetings.py라는 이름으로 저장합니다. 이 예제는 세 개의 print 문을 사용하지만 변수는 사용하지 않아서, 더 복잡한 개념으로 넘어가기 전에 기본 구조에 익숙해지는 데 도움이 됩니다.

1.4.4) 명령줄에서 스크립트 실행하기

이제 스크립트를 만들었으니, 실행해 보겠습니다.

1단계: 명령줄/터미널 열기

  • Windows: 명령 프롬프트를 엽니다.
  • macOS/Linux: Terminal을 엽니다.

2단계: 스크립트가 있는 위치로 이동하기

cd(change directory) 명령으로 hello.py를 저장해 둔 폴더로 이동해야 합니다. 예를 들어 바탕화면에 저장했다면 다음과 같이 합니다.

Windows:

bash
cd Desktop

macOS/Linux:

bash
cd ~/Desktop

스크립트를 실행하려고 할 때 "No such file or directory" 같은 에러가 나타난다면, 현재 위치가 올바른 폴더가 아닐 가능성이 큽니다. cd 명령을 사용해 파일이 있는 폴더로 잘 이동했는지 확인합니다.

현재 폴더에 어떤 파일이 있는지 확인하려면 다음과 같이 합니다.

Windows:

bash
dir

macOS/Linux:

bash
ls

목록 안에 hello.py가 보여야 합니다.

3단계: 스크립트 실행하기

Windows:

bash
python hello.py

macOS/Linux:

bash
python3 hello.py

다음과 같은 출력이 나타나야 합니다.

Hello, World!
Welcome to Python programming!

축하합니다! 첫 번째 Python 스크립트를 만들고 실행했습니다.

1.4.5) 스크립트 실행 과정 이해하기

Python 스크립트를 실행할 때 내부적으로는 다음과 같은 일이 일어납니다.

  1. 스크립트를 실행하는 명령을 입력합니다.
  2. 운영체제가 Python 인터프리터를 실행합니다.
  3. 인터프리터가 스크립트 파일 전체를 읽습니다.
  4. 문법 에러(코드를 잘못 작성한 부분)가 있는지 확인합니다.
  5. 에러가 있으면 에러 메시지를 출력하고 실행을 중단합니다.
  6. 에러가 없으면, 위에서 아래로 한 줄씩 코드를 실행합니다.
  7. print() 문에서 나오는 출력이 화면에 표시됩니다.
  8. 스크립트 실행이 끝나면, 다시 명령줄로 제어가 돌아옵니다.

1.4.6) 조금 더 복잡한 예제

여러 개념을 함께 보여 주는 스크립트를 하나 만들어 보겠습니다. 먼저, 변수를 좀 더 자연스럽게 소개하기 위해 중간 단계 예제를 하나 보겠습니다.

python
# simple_variable.py
# Using a variable for the first time
 
message = "Hello, Python!"
print(message)

출력:

Hello, Python!

이 예제는 순수한 print 문만 사용하던 예제와 더 복잡한 예제 사이를 잇는 예입니다. 이제 여러 변수를 사용하는 스크립트를 살펴보겠습니다.

python
# student_info.py
# A script that uses variables and multiple print statements
 
name = "Alice"
age = 25
city = "New York"
 
print("Student Information")
print("-------------------")
print("Name:", name)
print("Age:", age)
print("City:", city)

이 파일을 student_info.py라는 이름으로 저장한 뒤 실행합니다.

Windows:

bash
python student_info.py

macOS/Linux:

bash
python3 student_info.py

출력:

Student Information
-------------------
Name: Alice
Age: 25
City: New York

이 스크립트는 다음을 보여 줍니다.

  • 변수를 만드는 방법(변수에 대해서는 3장에서 더 자세히 배웁니다.)
  • 여러 개의 print() 문 사용
  • 문자열과 변수 값을 함께 출력하는 방법

1.4.7) 스크립트 파일 작성 시 좋은 습관

지금 단계에서부터 익혀 두면 좋은 습관들이 있습니다.

  1. 설명적인 파일 이름 사용하기: 파일 이름은 하는 일을 잘 나타내는 것이 좋습니다. student_info.pytest.pyprogram1.py보다, 나중에 파일 목록에서 봤을 때 무엇을 하는 프로그램인지 기억하기 좋습니다.

  2. 스크립트 정리하기: Python 프로젝트 전용 폴더를 하나 만들어, 스크립트를 여기저기 흩어 두지 말고 한곳에 모아 두는 것이 좋습니다. 나중에 찾기도 쉽고, 관리도 편합니다.

  3. 주석 달기: 각 스크립트의 맨 위에는 그 파일이 무슨 일을 하는지 간단한 주석을 달아 두는 것이 좋습니다. 나중에 다시 볼 때 도움이 되고, 다른 사람이 코드를 이해하는 데도 도움이 됩니다.

  4. 한 스크립트에 한 가지 역할: 하나의 파일이 한 가지 주요 작업만 하도록 구성하는 것이 좋습니다. 서로 상관없는 일을 한 파일에 모두 넣으면 이해하기도, 관리하기도 어려워집니다.

  5. 자주 테스트하기: 코드를 작성할 때는 자주 실행해 보는 것이 좋습니다. 100줄을 모두 쓰고 나서 테스트하기보다는, 몇 줄마다 실행해 보면서 에러를 더 일찍, 더 쉽게 찾는 편이 좋습니다.

1.5) 에러와 트레이스백 첫 살펴보기

프로그래밍에서 에러는 자연스러운 부분입니다. 초보자부터 전문가까지 모든 프로그래머는 정기적으로 에러를 만납니다. 에러 메시지를 읽고 이해하는 능력은 문제를 빠르게 해결하고, 자신 있게 프로그래밍하는 데 중요한 기술입니다.

1.5.1) 에러의 종류

Python에서는 두 가지 주요 에러 유형을 구분합니다.

문법 에러(Syntax Errors): 코드를 작성한 방식, 즉 Python 문법 규칙을 어겼을 때 생기는 에러입니다. Python은 코드를 실행하기 전에 이런 에러를 감지합니다. 글을 쓸 때 문법을 틀리는 것처럼, Python은 여러분이 “무슨 말을 하려는지”조차 이해하지 못하는 상태입니다.

예외(Exceptions): 코드를 실행하는 도중에 발생하는 에러입니다. 문법은 맞지만, 실행 과정에서 문제가 생긴 것입니다. 예외는 런타임 문제에 비유할 수 있습니다. Python이 여러분의 지시를 이해는 했지만, 그것을 수행하는 과정에서 문제가 생긴 것입니다.

각각을 예제로 살펴보겠습니다.

1.5.2) 문법 에러

문법 에러(syntax error)는 Python 규칙을 따르지 않는 코드를 썼을 때 발생합니다. Python은 여러분이 작성한 코드를 이해하지 못하기 때문에, 실행 자체를 시작할 수 없습니다.

예제 1: 콜론 빠뜨리기

syntax_error1.py라는 파일을 만듭니다.

python
# syntax_error1.py
# This code has a syntax error
 
if 5 > 3
    print("Five is greater than three")

이 파일을 다음과 같이 실행하면:

bash
python syntax_error1.py

다음과 같은 메시지가 나타납니다.

  File "syntax_error1.py", line 4
    if 5 > 3
            ^
SyntaxError: expected ':'

Python은 여러 가지 정보를 알려 줍니다.

  • 어느 파일에 문제가 있는지: syntax_error1.py
  • 몇 번째 줄에 문제가 있는지: 4번째 줄
  • 그 줄에서 어디쯤 문제가 있는지: ^ 표시로 위치를 알려 줍니다.
  • 에러 종류: SyntaxError
  • 도움이 되는 설명: expected ':' (콜론이 필요하다는 뜻입니다.)

문제는 if 문 끝에 콜론(:)을 붙이지 않았기 때문입니다. 올바른 코드는 다음과 같습니다.

python
# syntax_error1_fixed.py
# Fixed version
 
if 5 > 3:
    print("Five is greater than three")

출력:

Five is greater than three

예제 2: 따옴표가 맞지 않을 때

python
# syntax_error2.py
# Another syntax error example
 
message = "Hello, World!'
print(message)

이 코드를 실행하면:

  File "syntax_error2.py", line 4
    message = "Hello, World!'
              ^
SyntaxError: unterminated string literal (detected at line 4)

문제는 문자열이 큰따옴표(")로 시작했는데 작은따옴표(')로 끝났다는 점입니다. Python에서는 문자열을 둘러싼 따옴표 종류가 앞뒤가 같아야 합니다. 다음과 같이 고쳐야 합니다.

python
# syntax_error2_fixed.py
# Fixed version
 
message = "Hello, World!"
print(message)

출력:

Hello, World!

1.5.3) 런타임 예외(Runtime Exceptions)

런타임 예외(runtime exceptions)(보통 줄여서 그냥 "예외(exceptions)"라고 합니다)는 문법은 맞지만, 실행 도중에 문제가 생겼을 때 발생합니다.

예제 1: NameError

python
# name_error.py
# This code will cause a NameError
 
print(greeting)

이 파일을 다음과 같이 실행하면:

bash
python name_error.py

다음과 같은 메시지가 나타납니다.

Traceback (most recent call last):
  File "name_error.py", line 4, in <module>
    print(greeting)
          ^^^^^^^^
NameError: name 'greeting' is not defined

이런 메시지를 트레이스백(traceback)이라고 부릅니다. 내용을 하나씩 살펴보겠습니다.

  • "Traceback (most recent call last):"는 이어지는 부분이 에러가 어디서 났는지 보여 주는 트레이스백이라는 뜻입니다.
  • 파일과 줄 위치: File "name_error.py", line 4, in <module>은 어느 파일의 몇 번째 줄에서 문제가 났는지 알려 줍니다.
  • 문제가 된 코드: print(greeting) 줄이 그대로 나옵니다.
  • 에러 타입: NameError는 변수 이름 관련 에러라는 뜻입니다.
  • 에러 설명: name 'greeting' is not defined는 정의되지 않은 변수를 사용하고 있다는 설명입니다.

이 에러를 고치려면, 변수를 사용하기 전에 먼저 정의해야 합니다.

python
# name_error_fixed.py
# Fixed version
 
greeting = "Hello!"
print(greeting)

출력:

Hello!

예제 2: TypeError

python
# type_error.py
# This code will cause a TypeError
 
number = 5
text = "The number is "
result = text + number
print(result)

이 코드를 실행하면:

Traceback (most recent call last):
  File "type_error.py", line 6, in <module>
    result = text + number
             ~~~~~^~~~~~~~
TypeError: can only concatenate str (not "int") to str

이 에러 메시지는 문자열과 정수를 직접 더할 수 없다고 말합니다. Python은 여러분이 “수학적인 덧셈”을 하고 싶은 것인지, 아니면 “문자열을 이어 붙이고 싶은 것인지”를 알 수 없습니다.

이 문제를 해결하려면 숫자를 문자열로 바꿔야 합니다.

python
# type_error_fixed.py
# Fixed version
 
number = 5
text = "The number is "
result = text + str(number)
print(result)

출력:

The number is 5

예제 3: ZeroDivisionError

0으로 나누면 어떻게 될까요?

python
# zero_division.py
# This code will cause a ZeroDivisionError
 
result = 10 / 0
print(result)

실행하면:

Traceback (most recent call last):
  File "zero_division.py", line 4, in <module>
    result = 10 / 0
             ~~~^~~
ZeroDivisionError: division by zero

이 에러는 말 그대로입니다. 0으로는 나눌 수 없습니다. 수학적으로 정의되지 않은 연산이기 때문에 Python이 에러를 발생시킵니다.

1.5.4) 트레이스백을 효과적으로 읽는 방법

트레이스백을 만났을 때는 아래에서 위로 읽는 것이 좋습니다. 맨 아래 줄이 어떤 에러가 났는지를 알려 주고(에러 타입과 메시지), 그 위쪽 줄들이 에러가 발생하기까지 어떤 함수 호출이 이어졌는지를 보여 주기 때문입니다. 우리가 지금 다루는 단순한 프로그램에서는, 대부분 맨 아래 줄만 잘 보면 충분합니다.

  1. 맨 아래부터 보기: 에러 타입과 에러 메시지를 먼저 봅니다.
  2. 에러 이해하기: Python이 무엇이 잘못되었다고 말하는지 생각합니다.
  3. 위치 찾기: 어느 파일의 몇 번째 줄인지 확인합니다.
  4. 코드 확인하기: 해당 줄을 코드에서 찾아 살펴봅니다.
  5. 필요하다면 위쪽까지 거슬러 올라가기: 어떤 경우에는 Python이 가리키는 줄 바로 위의 코드가 실제 문제인 경우도 있습니다.

1.5.5) 초보자에게 흔한 에러들

Python을 배우면서 자주 보게 될 에러 몇 가지를 미리 짚고 넘기겠습니다.

들여쓰기(Indentation) 에러:

Python은 들여쓰기(줄 앞의 공백이나 탭)를 사용해 코드 블록을 구분합니다. 들여쓰기가 잘못되어 있으면 에러가 발생합니다.

python
# indentation_error.py
# Incorrect indentation
 
print("First line")
    print("Second line")  # This line is incorrectly indented

에러:

  File "indentation_error.py", line 5
    print("Second line")
    ^
IndentationError: unexpected indent

철자 실수(스펠링):

Python은 대소문자를 구분합니다. Printprint는 완전히 다른 이름입니다.

python
# spelling_error.py
# Incorrect capitalization
 
Print("Hello")  # Should be print, not Print

에러:

Traceback (most recent call last):
  File "spelling_error.py", line 4, in <module>
    Print("Hello")
    ^^^^^
NameError: name 'Print' is not defined

괄호 빠뜨리기:

Python 3에서는 print를 사용할 때 괄호가 필요합니다.

python
# missing_parentheses.py
# Missing parentheses
 
print "Hello"  # Should be print("Hello")

에러:

  File "missing_parentheses.py", line 4
    print "Hello"
          ^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

Python의 에러 메시지가 얼마나 친절한지 볼 수 있습니다. “print(...)를 쓰려던 것 아니냐”고 해결책까지 제안해 주고 있습니다.

1.5.6) 에러를 다루는 전략

에러를 만났을 때는 다음과 같이 해 보십시오.

  1. 당황하지 않기: 에러는 매우 자연스러운 일입니다. 모든 프로그래머가 매일같이 봅니다.

  2. 에러 메시지를 꼼꼼히 읽기: Python 에러 메시지는 대체로 꽤 친절합니다. 무엇이, 어디서 잘못되었는지를 알려 줍니다.

  3. 줄 번호 확인하기: Python이 가리키는 줄 번호로 가서 코드를 확인합니다.

  4. 주변 줄도 같이 보기: 때로는 문제의 원인이 그 줄 바로 위에 있는 경우도 많습니다.

  5. 자주 있는 실수부터 점검: 콜론 누락, 따옴표 짝 안 맞음, 들여쓰기 문제, 철자 오류 같은 것들이 매우 흔합니다.

  6. 작게 고치고 자주 테스트하기: 한 번에 여러 곳을 고치기보다는, 한 가지씩 고치고 매번 실행해 보는 것이 좋습니다.

  7. REPL 활용하기: 잘 모르겠는 코드 조각은 REPL에서 따로 떼어내 실험해 볼 수 있습니다.

  8. 에러 메시지를 검색하기: 이해가 되지 않는 에러 메시지가 있다면, 그대로 인터넷에 검색해 보십시오. 보통 다른 누군가가 이미 같은 문제를 겪고, 답을 찾아 두었을 가능성이 큽니다.

1.5.7) 에러와 수정 과정을 모두 보는 예제

여러 개의 에러가 섞여 있는 스크립트를 하나 보고, 차근차근 고쳐 보겠습니다. 이 프로그램은 학생의 정보를 출력하고, 10년 뒤 나이를 계산해서 보여 주도록 작성된 코드입니다.

원본(에러 있음):

python
# buggy_student.py
# This program has several errors
 
student_name = "Alice
student_age = 25
 
print("Name:", student_name)
print("Age:" student_age)
print("In 10 years, you will be", student_age + "10")

이 코드를 실행하면 여러 개의 에러가 순차적으로 나타납니다. 하나씩 고쳐 보겠습니다.

에러 1: 닫히지 않은 문자열

  File "buggy_student.py", line 4
    student_name = "Alice
                   ^
SyntaxError: unterminated string literal (detected at line 4)

수정: 끝에 큰따옴표를 추가합니다.

python
student_name = "Alice"

에러 1을 고치면, 이번에는 에러 2: 콤마 누락이 나타납니다.

  File "buggy_student.py", line 8
    print("Age:" student_age)
                 ^^^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

수정: 문자열과 변수 사이에 콤마를 추가합니다.

python
print("Age:", student_age)

에러 2를 고치면, 이번에는 에러 3: 타입 에러가 나타납니다.

Traceback (most recent call last):
  File "buggy_student.py", line 9, in <module>
    print("In 10 years, you will be", student_age + "10")
                                      ~~~~~~~~~~~~^~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'

수정: "10"을 정수로 바꿉니다.

python
print("In 10 years, you will be", student_age + 10)

최종 수정 버전:

python
# buggy_student_fixed.py
# Fixed version of the program
 
student_name = "Alice"
student_age = 25
 
print("Name:", student_name)
print("Age:", student_age)
print("In 10 years, you will be", student_age + 10)

출력:

Name: Alice
Age: 25
In 10 years, you will be 35

이 예제에서 보듯이, 에러를 고치는 과정은 보통 반복적입니다. 하나를 고치고 실행해 보면, 그다음 에러가 나타납니다. 이것은 아주 정상적인 과정입니다.

1.6) 대화형 셸과 스크립트 파일, 언제 무엇을 쓸까?

이제 REPL과 스크립트 파일을 모두 배웠으니, “언제 어떤 것을 써야 할까?”라는 의문이 생길 수 있습니다. 두 가지 모두 매우 유용하고, 숙련된 Python 프로그래머들은 둘 다 자주 사용합니다. 각각을 언제 쓰면 좋은지 알면 더 효율적으로 개발할 수 있습니다.

1.6.1) 이런 상황에서는 대화형 셸(REPL)을 사용하기

1. 새로운 개념을 배울 때

새로운 것을 배우고 있을 때, REPL은 즉각적인 피드백을 제공합니다.

python
>>> # Testing string methods
>>> text = "hello world"
>>> text.upper()
'HELLO WORLD'
>>> text.title()
'Hello World'
>>> text.capitalize()
'Hello world'

파일을 만들지 않고도 다양한 메서드를 실험하고 결과를 즉시 확인할 수 있습니다.

2. 작은 코드 조각 테스트

프로그램에 코드를 추가하기 전에, REPL에서 먼저 테스트할 수 있습니다.

python
>>> # Testing a calculation
>>> price = 19.99
>>> quantity = 3
>>> total = price * quantity
>>> total
59.97
>>> # Looks good, now I can add this to my script

3. 빠른 계산

REPL은 항상 사용할 수 있는 계산기입니다.

python
>>> # How many seconds in a day?
>>> 24 * 60 * 60
86400
>>> # What's 15% of 250?
>>> 250 * 0.15
37.5

4. 디버깅

스크립트가 제대로 동작하지 않을 때, REPL을 사용해 코드 일부를 개별적으로 테스트할 수 있습니다.

python
>>> # My script isn't working. Let me test this part:
>>> numbers = [1, 2, 3, 4, 5]
>>> sum(numbers) / len(numbers)
3.0
>>> # This works, so the problem must be elsewhere

참고: 리스트(list)에 대해서는 13장에서 배웁니다. 이 예제는 REPL이 코드 조각을 테스트하는 데 어떻게 도움이 되는지를 보여 줍니다.

1.6.2) 이런 상황에서는 스크립트 파일 사용하기

1. 나중에도 계속 사용할 프로그램을 만들 때

다시 실행하고 싶은 코드는 스크립트 파일에 넣는 것이 좋습니다.

python
# temperature_converter.py
# A program to convert Fahrenheit to Celsius
 
fahrenheit = 98.6
celsius = (fahrenheit - 32) * 5/9
print("Temperature:", fahrenheit, "°F is", round(celsius, 1), "°C")

출력:

Temperature: 98.6 °F is 37.0 °C

이 스크립트는 필요할 때마다 다시 실행할 수 있고, 나중에 수정하기도 쉽습니다.

2. 여러 줄짜리 프로그램을 작성할 때

REPL에서도 여러 줄 코드를 작성할 수 있지만, 어느 정도 길이가 있는 코드에는 불편합니다. 이런 경우 스크립트 파일을 사용하는 것이 좋습니다.

python
# grade_calculator.py
# Calculate final grade from multiple scores
 
homework = 85
midterm = 78
final = 92
 
# Calculate weighted average
final_grade = (homework * 0.3) + (midterm * 0.3) + (final * 0.4)
 
print("Final Grade:", final_grade)

출력:

Final Grade: 85.3

3. 다른 사람과 코드를 공유할 때

스크립트 파일은 쉽게 공유할 수 있지만, REPL 세션은 그대로 공유하기 어렵습니다.

python
# greeting.py
# A simple greeting program
 
name = input("What is your name? ")
print("Hello,", name + "! Welcome to Python.")

참고: input() 함수에 대해서는 2장에서 다룰 것입니다. 이 예제는 스크립트가 어떻게 공유 가능한 프로그램이 되는지를 보여 줍니다.

이 파일을 다른 사람에게 보내면, 그 사람도 자신의 컴퓨터에서 곧바로 실행해 볼 수 있습니다.

4. 재사용 가능한 도구를 만들 때

여러 번 사용할 도구를 만든다면, 스크립트 파일로 만들어 두는 것이 좋습니다.

python
# file_counter.py
# Count files in a directory
 
import os
 
directory = "."  # Current directory
files = [f for f in os.listdir(directory) if os.path.isfile(f)]
print("Number of files:", len(files))

참고: 모듈 import에 대해서는 22장에서, 리스트 내포(list comprehension)에 대해서는 34장에서 배웁니다. 이 예제는 스크립트가 재사용 가능한 도구처럼 쓰일 수 있음을 보여 줍니다.

5. 복잡한 로직을 개발할 때

여러 개의 함수나 클래스, 복잡한 로직이 들어가는 코드는 스크립트 파일에 넣는 것이 좋습니다.

python
# password_checker.py
# Check password strength
 
def check_password_strength(password):
    """Check if a password meets basic requirements."""
    if len(password) < 8:
        return "Too short"
    if not any(c.isupper() for c in password):
        return "Needs uppercase letter"
    if not any(c.isdigit() for c in password):
        return "Needs number"
    return "Strong password"
 
# Test the function
test_password = "MyPass123"
result = check_password_strength(test_password)
print("Password '" + test_password + "':", result)

출력:

Password 'MyPass123': Strong password

참고: 함수(function)에 대해서는 19장에서 배웁니다. 이 예제는 스크립트가 어떻게 더 복잡한 로직을 담을 수 있는지를 보여 줍니다.

6. 작업을 자동화할 때

반복적인 작업을 자동화할 때도 스크립트가 알맞습니다.

python
# backup_reminder.py
# Remind user to backup files
 
import datetime
 
today = datetime.date.today()
day_of_week = today.strftime("%A")
 
if day_of_week == "Friday":
    print("Don't forget to backup your files!")
else:
    print("Backup reminder: Next backup on Friday")

참고: datetime 모듈에 대해서는 39장에서 배웁니다. 이 예제는 스크립트가 일상 작업을 자동화하는 데 어떻게 사용될 수 있는지를 보여 줍니다.

1.6.3) 실용적인 작업 흐름

전문 Python 프로그래머들은 보통 REPL과 스크립트 파일을 서로 보완하면서 사용합니다.

예시 작업 흐름:

  1. REPL에서 탐색: 새로운 개념이나 계산을 REPL에서 먼저 시험해 봅니다.
  2. REPL에서 프로토타입 작성: 간단한 동작이 제대로 되는지 작은 버전을 만들어 봅니다.
  3. 스크립트로 옮기기: 잘 동작하는 코드가 생기면 스크립트 파일로 옮깁니다.
  4. 스크립트에서 확장: 여기에 기능을 더하고, 에러 처리를 추가하고, 구조를 정리합니다.
  5. REPL로 디버깅: 스크립트에 문제가 생기면, 일부분을 REPL에서 따로 떼어내 테스트해 봅니다.
  6. 스크립트 완성: 프로그램을 완성하고, 테스트하고, 저장해 둡니다.

1.6.4) 구체적인 예로 보는 작업 흐름

실제 예를 통해 이 작업 흐름을 살펴보겠습니다. 원이 있을 때, 그 넓이(면적)를 계산하는 프로그램을 만들고 싶다고 가정해 보겠습니다.

1단계: REPL에서 탐색

python
>>> # What's the formula? Area = π * r²
>>> # Let me use a simple approximation for π
>>> 3.14159 * 5 * 5
78.53975
>>> # Looks right!

2단계: 스크립트 만들기

이제 잘 동작하는 것을 확인했으니, circle_area.py라는 스크립트를 만듭니다.

python
# circle_area.py
# Calculate the area of a circle
 
radius = 5
pi = 3.14159
area = pi * radius * radius
 
print("Radius:", radius)
print("Area:", area)

출력:

Radius: 5
Area: 78.53975

3단계: 스크립트 확장하기

여러 반지름에 대해 면적을 계산하게 확장해 보겠습니다.

python
# circle_area_enhanced.py
# Calculate area for multiple circles
 
radii = [3, 5, 7, 10]
pi = 3.14159
 
for radius in radii:
    area = pi * radius * radius
    print("Circle with radius", radius, "has area", round(area, 2))

출력:

Circle with radius 3 has area 28.27
Circle with radius 5 has area 78.54
Circle with radius 7 has area 153.94
Circle with radius 10 has area 314.16

참고: for 반복문(loop)에 대해서는 11장에서 배웁니다. 2장에서는 사용자 입력을 받아 이 프로그램을 더 상호작용적으로 만드는 방법을 보게 될 것입니다.

이와 같은 “REPL에서 실험하고, 스크립트로 정리하는” 작업 흐름은 많은 Python 프로그램이 개발되는 방식입니다.

1.6.5) 핵심 정리

REPL의 강점:

  • 즉각적인 피드백
  • 학습에 적합함
  • 빠른 테스트에 적합함
  • 탐색에 유용함
  • 파일 관리가 필요 없음

REPL의 한계:

  • 코드가 저장되지 않음
  • 여러 줄 코드에는 다소 불편함
  • 쉽게 공유할 수 없음
  • 복잡한 프로그램에는 적합하지 않음

스크립트 파일의 강점:

  • 코드가 영구적으로 저장됨
  • 쉽게 수정·편집할 수 있음
  • 다른 사람과 공유할 수 있음
  • 복잡한 프로그램에 적합함
  • 반복 실행이 쉬움
  • 자동화에 사용할 수 있음

스크립트 파일의 한계:

  • 파일을 만들고 관리해야 함
  • 실행해야만 결과를 볼 수 있음
  • 간단한 테스트에는 약간 부담이 될 수 있음

가장 좋은 접근법은 둘 다 사용하는 것입니다. REPL은 학습, 테스트, 탐색에 사용하고, 스크립트 파일은 보관하고, 공유하고, 반복해서 실행해야 하는 모든 코드에 사용하는 식입니다.

1.7) 이 책에서 사용하는 Python 버전(그리고 그게 중요한 이유)

Python은 여러 해에 걸쳐 크게 발전해 왔고, 버전에 따라 동작이 조금씩 다를 수 있습니다. Python 버전에 대한 이해는, 혼란을 줄이고 코드가 예상대로 동작하도록 하는 데 도움이 됩니다.

“왜 Python 버전에 이렇게 시간을 쓰는지” 궁금할 수 있습니다. 이유는 간단합니다. 인터넷에서 보게 될 Python 코드나 튜토리얼, 문서를 접할 때, 그 코드가 어떤 버전을 기준으로 작성된 것인지 알아야 하기 때문입니다. 버전을 이해하고 있으면, 코드가 오래되어 지금은 동작하지 않는 경우를 인식하고, 어떤 것이 예상대로 동작하지 않을 때 혼란을 줄일 수 있습니다.

1.7.1) Python 2 vs Python 3

Python 역사에서 가장 큰 분기점은 Python 2와 Python 3 사이의 차이입니다.

Python 2는 2000년에 출시되어 오랫동안 주된 버전이었습니다. 하지만 기존 코드를 깨뜨리지 않고는 고칠 수 없는 설계상의 문제가 몇 가지 있었습니다.

Python 3는 이러한 문제를 해결하기 위해 2008년에 주요 개편 버전으로 출시되었습니다. 하지만 Python 2와의 하위 호환성이 없어서, Python 2용으로 작성된 코드가 수정 없이 Python 3에서 그대로 실행되지 않는 경우가 많았습니다.

꽤 오랫동안 두 버전이 공존했지만, Python 2는 2020년 1월 1일부로 지원이 종료(end-of-life) 되었습니다. 이는 다음을 의미합니다.

  • Python 2에 대한 업데이트나 보안 패치가 더 이상 나오지 않습니다.
  • 새로운 Python 개발은 모두 Python 3 기준으로 이루어집니다.
  • 주요 라이브러리는 모두 Python 3로 옮겨 갔습니다.
  • 지금 Python을 새로 배우면서 Python 2를 공부하는 것은 권장되지 않습니다.

이 책은 Python 3만을 사용합니다. 모든 예제 코드는 Python 3용으로 작성되었으며, Python 2에서는 제대로 동작하지 않을 수 있습니다.

1.7.2) Python 3의 마이너 버전들

Python 3 안에도 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12와 같은 여러 마이너 버전이 있습니다. 각 마이너 버전은 새로운 기능과 개선 사항을 추가하지만, 기본적으로 이전 Python 3 버전과의 하위 호환성을 유지합니다.

이 책은 Python 3.11 이상을 기준으로 작성되었습니다. 그러나 대부분의 예제는 Python 3.8 이상이라면 잘 동작할 것입니다.

내 Python 버전을 확인하려면 다음과 같이 합니다.

bash
python --version  # Windows
python3 --version  # macOS/Linux

대략 다음과 같은 출력이 나올 것입니다.

Python 3.11.5

만약 다음과 같이 나온다면:

Python 2.7.18

Python 2를 사용하고 있는 것입니다. 이 경우 1.2절에 나온 방법대로 Python 3를 새로 설치해야 합니다.

1.7.3) 마주칠 수 있는 주요 차이점

오래된 Python 튜토리얼이나 인터넷에 있는 코드(특히 2020년 이전의 튜토리얼과 Stack Overflow 답변)를 보다 보면, Python 3에서는 그대로 사용할 수 없는 Python 2 코드를 보게 될 수 있습니다. 자주 보이는 차이를 몇 가지 정리해 보겠습니다.

1. print 문 vs print 함수

Python 2:

python
print "Hello, World!"  # No parentheses

Python 3:

python
print("Hello, World!")  # Parentheses required

Python 3에서는 print가 함수이므로 괄호가 필요합니다. 가장 눈에 띄는 차이 중 하나입니다.

2. 나눗셈 동작 방식

이러한 변화는 Python을 더 일관성 있고 안전하게 만들기 위해 도입되었습니다. 예를 들어 print를 함수로 만든 덕분에 일반 함수처럼 다룰 수 있고, / 연산이 항상 실수 나눗셈을 하도록 만든 덕분에 흔한 버그의 원인을 줄였습니다.

Python 2:

python
>>> 5 / 2
2  # Integer division
>>> 5.0 / 2
2.5  # Float division

Python 3:

python
>>> 5 / 2
2.5  # Always float division
>>> 5 // 2
2  # Integer division (floor division)

Python 3에서는 /가 항상 실수 나눗셈을 합니다. 정수 나눗셈을 하고 싶다면 //를 사용해야 합니다.

3. input() 함수

Python 2:

python
name = raw_input("Enter your name: ")  # Returns string
age = input("Enter your age: ")  # Evaluates input as Python code (dangerous!)

Python 3:

python
name = input("Enter your name: ")  # Always returns string
age = int(input("Enter your age: "))  # Convert to int if needed

Python 3에서는 input()이 항상 문자열을 반환하기 때문에 더 안전하고 일관성이 좋습니다.

4. 문자열과 유니코드

Python 3는 텍스트(유니코드)를 Python 2보다 훨씬 잘 처리합니다. Python 3에서는 모든 문자열이 기본적으로 유니코드이므로, 여러 언어를 섞어 쓰거나 국제화된 텍스트를 처리할 때 더 수월합니다.

1.7.4) Python 3 버전별 주요 기능

각 Python 3 버전은 서로 다른 기능들을 도입했습니다. 꼭 알아야 할 정도만 살펴보겠습니다.

Python 3.6 (2016년 12월):

  • 문자열 포매팅을 위한 f-string 도입(이 책에서도 많이 사용할 예정입니다.)
python
# f_string_example.py
name = "Alice"
print("Hello, " + name + "!")

출력:

Hello, Alice!

참고: f-string에 대해서는 6장에서 배웁니다. 지금은 +를 사용해 간단하게 문자열을 이어 붙이고 있습니다.

Python 3.8 (2019년 10월):

  • 대입 표현식(walrus 연산자 :=) 도입(40장에서 다룰 예정입니다.)

Python 3.10 (2021년 10월):

  • matchcase를 사용하는 구조적 패턴 매칭 도입(12장에서 다룰 예정입니다.)

Python 3.11 (2022년 10월):

  • 크게 개선된 에러 메시지
  • 성능 향상
  • 예외 처리 개선

Python 3.12 (2023년 10월):

  • 추가적인 성능 향상
  • 새로운 타입 애너테이션 기능
  • f-string 문법 개선

1.7.5) 어떤 버전을 사용하는 것이 좋을까?

가능하다면 Python 3.11 이상을 사용하는 것을 권장합니다. 이유는 다음과 같습니다.

  1. 더 나은 에러 메시지: Python 3.11에서는 에러 메시지가 크게 개선되어 초보자에게 특히 도움이 됩니다.
  2. 더 나은 성능: Python 3.11은 이전 버전보다 실행 속도가 빠릅니다.
  3. 최신 기능 사용 가능: 최신 Python 기능들을 모두 사용할 수 있습니다.
  4. 미래 지향성: Python 3.11 기준으로 작성된 코드는 향후 버전에서도 잘 동작할 가능성이 높습니다.

그래도 이 책을 학습하는 데에는 Python 3.8 이상이면 충분합니다. 핵심 개념은 변하지 않습니다.

1.7.6) 기능이 내 버전에서 지원되는지 확인하기

비교적 오래된 Python 버전을 사용하고 있는데 어떤 예제 코드가 동작하지 않는다면, 해당 기능이 언제 도입되었는지 확인해 볼 필요가 있습니다.

예를 들어 Python 3.5 이하를 사용하고 있다면, f-string 대신 이전 방식의 문자열 포매팅을 사용해야 할 수 있습니다.

python
# format_example.py
# Works in all Python 3 versions
name = "Alice"
print("Hello, {}!".format(name))

출력:

Hello, Alice!

1.7.7) 최신 상태 유지하기

Python은 대략 1년에 한 번씩 새로운 마이너 버전을 출시합니다. 매번 바로 업그레이드해야 하는 것은 아니지만, 어느 정도 최신 상태를 유지하는 것이 좋습니다.

  • 몇 달에 한 번 정도 새 버전이 나왔는지 확인합니다.
  • 릴리스 노트를 읽으며 어떤 새로운 기능이 추가되었는지 살펴봅니다.
  • 특히 보안 업데이트가 나왔다면, 가능하면 업그레이드하는 것이 좋습니다.
  • 업그레이드 후에는 코드가 잘 동작하는지 테스트해 봅니다.

Python 릴리스와 문서는 https://www.python.org/에서 확인할 수 있습니다.

1.7.8) 이 책에서의 버전 호환성

이 책 전반에서:

  • 모든 예제 코드는 Python 3.11+에서 동작합니다.
  • 대부분의 예제는 Python 3.8+에서도 잘 동작합니다.
  • 특정 버전 이상이 필요한 기능은 명시할 것입니다(예: "이 기능은 Python 3.10+가 필요합니다").
  • 필요하다면 예전 버전에서도 사용할 수 있는 대체 방법도 적절한 경우 함께 소개합니다.

이 책의 코드를 Python 3.11 이상의 환경에서 입력하면, 책에 나온 그대로 동작하리라고 기대하고 따라와도 좋습니다.

1.7.9) 온라인에서 마주칠 수 있는 Python 2 코드에 대하여

Python 관련 내용을 인터넷에서 검색하다 보면, Python 2 코드 예제를 보게 될 수도 있습니다. 이를 알아보는 방법을 정리해 보겠습니다.

Python 2 코드의 흔한 특징:

  • 괄호 없는 print: print "Hello"
  • raw_input() 함수 사용
  • 5 / 2의 결과가 2(정수 나눗셈)
  • "Hello %s" % name 형식의 이전 문자열 포매팅
  • 코드에 "Python 2" 또는 2.x 버전을 언급한 주석

이럴 때 할 일:

  • Python 3 버전의 예제를 찾아봅니다.
  • 검색 키워드에 "python 3"를 추가해 검색합니다.
  • 글 작성 날짜를 확인합니다. 2020년 이전 글이라면 Python 2일 가능성이 높습니다.
  • 공식 Python 3 문서를 활용합니다. https://docs.python.org/3/

축하합니다! 이제 1장을 모두 마쳤습니다. 이제 다음 내용을 알게 되었습니다.

  • Python이 무엇이고 어떻게 동작하는지
  • Python을 설치하고 인터프리터를 실행하는 방법
  • Python 대화형 셸(REPL)을 사용해 실험하는 방법
  • Python 스크립트 파일을 만들고 실행하는 방법
  • 에러 메시지와 트레이스백을 읽고 이해하는 방법
  • REPL과 스크립트 파일을 각각 언제 사용하면 좋은지
  • 어떤 Python 버전을 사용해야 하는지, 그리고 그게 왜 중요한지

이제 2장으로 넘어갈 준비가 되었습니다. 2장에서는 첫 번째 완성된 Python 프로그램을 작성하면서, print() 함수를 더 자세히 살펴보고, 사용자 입력도 받아 보게 됩니다. 이 장에서 쌓은 기초는 앞으로 배울 모든 내용의 바탕이 될 것입니다.

© 2025. Primesoft Co., Ltd.
support@primesoft.ai