기초

화면에 Hello World를 출력해본 것으로는 부족하죠? 더 다양한 프로그램을 만들어 보고 싶을 것입니다. 사용자로부터 정보를 입력받고, 처리한 뒤 결과물을 출력해 주는 프로그램을 만들어 보고 싶으시죠? 파이썬에서는 상수들과 변수들을 활용하여 이러한 일을 할 수 있습니다. 이 장에서는 이외에 몇 가지 기본 기능들에 대해서도 다뤄 볼 것입니다.

주석

주석은 # 문자로 시작하는 한 줄짜리 짧은 문장입니다. 소스 코드를 읽는 사람들을 위해 개발자의 의견을 적어두는 용도로 자주 사용됩니다.

예제:

print('hello world') # Note that print is a function

또는

# Note that print is a function
print('hello world')

프로그램을 작성할 때 주석을 가능한 많이 사용하시기 바랍니다.

  • 미리 가정하고 넘어간 것들에 대한 설명

  • 중요한 결정사항에 대한 설명

  • 중요한 세부사항에 대한 설명

  • 해결하고자 하는 문제에 대한 설명

  • 앞으로 극복하려고 하는 상황에 대한 설명 등등.

코드는 어떻게? 라는 물음에 답하지만, 주석은 왜? 라는 물음에 답해야 합니다(영문).

주석은 여러분의 프로그램을 읽는 사람들에게 여러분이 작성한 프로그램이 무엇을 하는 프로그램인지 쉽게 파악할 수 있도록 도움을 주는 역할을 합니다. 프로그램을 작성하고 한 6개월쯤 지난 뒤에는 여러분이 작성한 주석에 도움을 받는 사람이 여러분 자신이 될 수도 있다는 점을 꼭 기억하세요!

리터럴 상수

리터럴 상수는 5, 1.23과 같은 숫자나, 'This is a string' 혹은 "It’s a string!" 과 같은 문자의 나열을 말합니다.

이것들이 리터럴 상수라고 불리우는 이유는 이것들이 프로그램 내에 직접 문자 형태로(literally) 지정되는 값들이기 때문입니다. 이러한 값들은 한 번 지정되면 변하지 않습니다. 예를 들면 숫자 2는 언제나 자기 자신이 2라는 숫자임을 나타내며 어떤 다른 의미도 갖지 않습니다. 이들은 한번 지정되면 그 값을 변경할 수 없기 때문에 상수입니다. 특별히 이러한 값들을 리터럴 상수라고 부릅니다.

숫자형

숫자형에는 정수형(Integer)과 부동 소수점 숫자형(Float)의 두 가지 종류가 있습니다.

정수형 숫자의 예는 2입니다. 이것은 단순히 2라는 숫자를 의미하는 것입니다. 부동 소수점 숫자의 예는 3.23, 52.3E-4와 같은 값입니다. E 표기법은 E 뒤의 값이 10의 지수임을 나타냅니다. 예를 들어 52.3E-452.3 * 10^-4^라는 값을 의미합니다.

숙련된 프로그래머들을 위한 주석

파이썬에서는 long형이 따로 없습니다. 대신 int형에 어떤 크기의 정수든지 담을 수 있습니다.

문자열

문자열이란 문자나열을 뜻합니다. 문자열은 간단하게 말하자면 문자들의 집합입니다. 여러분은 아마 앞으로 작성하게 될 거의 모든 파이썬 프로그램에서 문자열을 사용하게 될 것입니다. 따라서 아래 항목들을 주의깊게 살펴보세요.

작은 따옴표

문자들을 작은 따옴표로 묶어서 이것이 문자열임을 표현할 수 있습니다. 예를 들어 'Quote me on this'와 같이 하면 됩니다. 작은 따옴표 안쪽의 모든 공백 문자, 즉 띄어쓰기나 탭 등은 입력한 그대로 유지됩니다.

큰 따옴표

문자열을 큰 따옴표로 묶어서 표현해도 되는데, 이때 큰 따옴표로 둘러싸인 문자열은 작은 따옴표로 둘러싸인 문자열과 동일하게 취급됩니다. 예를 들면, "What's your name?"과 같습니다. (큰 따옴표로 둘러싸인 문자열 안에 작은 따옴표가 포함되어도 됩니다).

따옴표 세 개

여러 줄에 걸친 문자열은 세 개의 따옴표로 묶어서 표현할 수 있습니다 - (""" 또는 '''). 세 개의 따옴표로 묶여진 문자열 안에서는 작은 따옴표든 큰 따옴표든 마음대로 사용할 수 있습니다. 예를 들면 다음과 같습니다.

'''This is a multi-line string. This is the first line.
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''

문자열은 수정이 불가능함

여러분이 문자열을 한 번 만들면, 그 문자열의 내용은 더 이상 변경할 수 없습니다. 좀 불편할 수도 있다고 생각할 수도 있겠습니다만, 사실은 그렇지 않습니다. 책의 뒷부분에서 여러 프로그램 예시를 통해 왜 이것이 큰 제약이 아닌지 살펴볼 것입니다.

C/C++ 프로그래머들을 위한 주석

파이썬에서는 char형이 따로 구분되어 있지 않습니다. 파이썬에서는 이것이 딱히 필요가 없습니다. 곧 여러분도 char 형을 찾지 않게 될 것입니다.

Perl/PHP 프로그래머들을 위한 주석

파이썬에서는 작은 따옴표나 큰 따옴표로 묶인 문자열을 동일하게 취급합니다. 둘 사이에 어떤 차이도 없습니다.

문자열 포맷팅

문자열을 생성하려고 할 때, 종종 다른 정보들을 포함하여 생성하고 싶을 때가 있습니다. 이것을 문자열 포맷팅이라고 하며, 이를 위해 format()을 이용합니다.

다음을 str_format.py 라는 이름으로 저장하세요.

age = 20
name = 'Swaroop'

print('{0} was {1} years old when he wrote this book'.format(name, age))
print('Why is {0} playing with that python?'.format(name))

실행 결과:

$ python str_format.py
Swaroop was 20 years old when he wrote this book
Why is Swaroop playing with that python?

동작 원리

먼저 중괄호로 표현된 특별한 표시들이 포함된 문자열을 만들고, 그 후에 문자열의 format 메소드를 사용하여 이 표시들을 format 메소드에 주어진 인자들로 치환한 것입니다.

위 예시에서는 문자열 내에서 첫번째로 {0} 이 사용되었으며 이것은 format 메소드에 주어진 첫번째 인자, 즉 변수 name에 해당됩니다. 마찬가지로, 두번째 사용된 표시는 {1} 이며 이것은 format 메소드에 주어진 두번째 인자인 age에 해당됩니다. 파이썬은 숫자를 셀 때 항상 0 부터 세기 시작한다는 점에 유의하세요. 즉, 첫번째 인자의 인덱스는 0 이며, 두번째는 1 입니다.

또한 다음과 같이 문자열 더하기를 이용하여 동일한 결과를 얻을 수도 있습니다.

name + ' is ' + str(age) + ' years old'

그러나 이것은 척 보기에도 깔끔하지 못하며, 작성 중 실수하기도 쉽습니다. 또 이 경우 숫자 변수를 str 함수를 써서 일일이 명시적으로 문자열로 변환해주어야 하지만, format 메소드를 이용할 경우에는 이를 알아서 자동으로 변환해 줍니다. 또 format 메소드를 이용할 경우 변수들을 신경쓰지 않고 문자열의 내용을 수정하기 쉬우며, 문자열에 신경쓰지 않고도 변수의 위치나 순서 등을 변경하기가 더 쉽습니다.

중괄호 안에 주어진 숫자는 생략할 수 있습니다. 다음 예제를 확인하세요.

age = 20
name = 'Swaroop'

print('{} was {} years old when he wrote this book'.format(name, age))
print('Why is {} playing with that python?'.format(name))

위 프로그램 또한 동일한 결과를 출력합니다.

파이썬의 format은 중괄호 표시의 위치에 주어진 인자들의 값을 치환해 넣습니다. 이때, 중괄호 표시에 다음과 같이 좀 더 상세히 세부사항을 지정할 수도 있습니다.

# 소수점 이하 셋째 자리까지 부동 소숫점 숫자 표기 (0.333)
print('{0:.3f}'.format(1.0/3))
# 밑줄(_)로 11칸을 채우고 가운데 정렬(^)하기 (___hello___)
print('{0:_^11}'.format('hello'))
# 사용자 지정 키워드를 이용해 문자열 표기
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python'))

실행 결과:

0.333
___hello___
Swaroop wrote A Byte of Python

지금까지 문자열 포맷팅에 대해 알아보았습니다. 여기서 print 명령은 언제나 주어진 문자열의 끝에 "줄바꿈" 문자 (\n) 을 덧붙인다는 것 또한 기억하세요. 따라서 print 명령을 호출할 때마다 그 다음에 호출한 print 명령의 내용은 항상 그 다음 줄에 출력됩니다. 이것을 막기 위해서는 print 함수의 인자 end를 공백으로 지정하면 됩니다.

print('a', end='')
print('b', end='')

실행 결과:

ab

또는 end를 한 칸 공백으로 지정하면 다음과 같이 됩니다.

print('a', end=' ')
print('b', end=' ')
print('c')

실행 결과:

a b c

이스케이프(Escape) 문자

여러분이 작은 따옴표(')를 포함하고 있는 문자열을 정의하고 싶다고 해 봅시다. 이 경우 어떻게 이 문자열을 정의하면 될까요? 예를 들면 "What's your name?" 과 같은 문자열을 정의하는 것입니다. 물론 큰 따옴표를 써서 "What's your name?"이라고 하면 되겠지만, 'What's your name?'과 같이 작은 따옴표를 사용하기는 어렵습니다. 왜냐면 이 경우 문자열의 시작과 끝이 어디부터 어디까지인지 모호해지기 때문이죠. 따라서 우리는 문자열 안에 포함된 작은 따옴표가 문자열의 끝을 의미하는 작은 따옴표가 아니라는 것을 파이썬에게 알려줘야 합니다. 이것은 이스케이프 문자라 불리우는 것을 이용하면 해결할 수 있습니다. 사용법은 작은 따옴표 앞에 \ 문자(enter 키 위에 있습니다)를 붙여 \' 와 같은 방식으로 표기하면 됩니다. 이를 이용하면, 위의 문자열은 'What\'s your name?' 과 같이 표기할 수 있습니다.

마찬가지로, 큰 따옴표로 지정된 문자열 안에 포함된 큰 따옴표도 마찬가지로 이스케이프 문자를 이용하여 표기할 수 있습니다. 문자열 안에 \ 문자를 표기하고 싶을 경우에는 \\ 라 표기하면 됩니다.

한편 두 줄에 걸친 문자열을 정의하고 싶을 경우 어떻게 하면 될까요? 한가지 방법은 위에서 다루었듯이 따옴표 세 개로 문자열을 정의할 수 있고, 또 다른 방법은 이스케이프 문자를 활용하여 줄바꿈 문자 (newline character) \n 로 줄바꿈을 표현할 수도 있습니다. 다음 예제를 확인하세요.

'This is the first line\nThis is the second line'

또 한가지 유용한 이스케이프 문자는 \t로 표현되는 탭 문자입니다. 이외에도 여러가지 이스케이프 문자를 이용한 유용한 다른 표기들이 있지만, 일단은 가장 유용하게 쓰이는 것 몇 가지만 알려 드리겠습니다.

문자열을 정의할 때 줄의 끝에 문자를 붙여 주면, 그 다음 줄에 정의된 문자열을 끊김없이 이어 붙여 문자열을 정의하게 됩니다. 예를 들면 다음과 같습니다.

"This is the first sentence. \
This is the second sentence."

위 예제는 다음 예제와 동일합니다.

"This is the first sentence. This is the second sentence."

순 문자열(Raw String)

문자열 내에 포함된 이스케이프 문자 등을 처리하지 않고 그대로 출력하고 싶을 때, 문자열 앞에 r 또는 R 문자를 붙여 순 문자열임을 표기합니다. 다음 예제를 확인하세요.

r"Newlines are indicated by \n"

정규 표현식 사용자를 위한 주석

정규 표현식을 사용할 때는 항상 순 문자열을 사용하세요. 그렇지 않으면 문자열 내에 이스케이프 문자가 너무 많아져 알아볼 수 없게 될지도 모릅니다. 순 문자열을 사용하면, '\\1'r'\1'로 짧게 표기가 가능합니다.

변수

리터럴 상수만 사용하여 프로그램을 작성할 수는 없습니다. 뭔가 정보를 담고, 수정할 수 있는 어떤 공간이 필요할 것입니다. 즉, 변수를 이용하는 것이 좋습니다. 변수는 이름 그대로 할 수 있는 공간을 말하며, 여기에는 무엇이든 저장할 수 있습니다. 변수들은 단순히 정보를 저장할 때 사용되는 컴퓨터 내부의 기억 장치의 작은 부분을 가져다가 적당한 이름을 붙여 사용하는 것입니다. 리터럴 상수와는 달리, 변수들은 프로그램 내에서 여러 방법을 통해 변경되고 사용되기 때문에 한눈에 알아보기 쉬운 이름을 지어 줍시다.

식별자

변수 이름은 식별자의 한 예입니다. 식별자무언가를 식별하기 위해 주어진 그것의 이름을 말합니다. 식별자를 짓는데는 다음과 같은 규칙이 있습니다.

  • 식별자의 첫 문자는 알파벳 문자 (ASCII 대/소문자 혹은 유니코드 문자)이거나 밑줄 (_) 이어야 합니다.

  • 나머지는 문자 (ASCII 대/소문자 혹은 유니코드 문자), 밑줄 (_), 또는 숫자 (0-9)가 될 수 있습니다.

  • 식별자는 대/소문자를 구분합니다. 예를 들어, mynamemyName은 다릅니다. 전자의 n은 소문자이고, 후자의 N은 대문자입니다.

  • 올바른 식별자 이름은 i, name_2_3 등과 같습니다. 올바르지 않은 식별자 이름은 2things, this is spaced out, my-name, >a1b2_c3 등입니다.

자료형

변수는 여러 가지 자료형의 값을 담을 수 있습니다. 가장 간단한 자료형의 예는 앞에서 이야기한 숫자형과 문자열입니다. 뒷장에서, 클래스를 이용한 사용자 정의 자료형을 만드는 법 또한 배우게 될 것입니다.

객체

파이썬에서 사용되는 모든 것은 객체(object)입니다. 그것(the something)라고 표현하는 대신, "그 객체(the object)" 라고 말합니다.

객체 지향 프로그래머들을 위한 주석:

파이썬은 강력한 객체 지향 언어로써 숫자, 문자, 함수 등등 모든 것을 객체로 취급합니다.

이제 리터럴 상수들과 함께 변수를 사용하는 방법을 알아보도록 하겠습니다. 다음 예제를 저장한 후 실행하여 봅시다.

파이썬 프로그램 작성하기

이제부터, 다음과 같이 파이썬 프로그램을 저장하고 실행하도록 합시다:

PyCharm을 이용할 경우

  1. PyCharm을 실행합니다.

  2. 적당한 파일명을 입력하고, 새 파일을 만듭니다.

  3. 예제로 주어진 프로그램 코드를 입력합니다.

  4. 현재 파일을 우클릭하고 실행(Run)을 누릅니다.

NOTE: 프로그램을 실행할 때 명령줄 인수(command line arguments)와 함께 실행하고 싶을 경우, 메뉴의 RunEdit Configurations을 누르고 Script parameters: 섹션에 인수를 입력해 준 뒤 OK 버튼을 누르면 됩니다:

다른 편집기를 이용할 경우

  1. 사용하고자 하는 편집기를 실행합니다.

  2. 예제 프로그램을 입력합니다.

  3. 적당한 파일명을 짓고 저장합니다.

  4. python program.py와 같이 파이썬 인터프리터를 통해 프로그램을 실행합니다.

예제: 변수와 리터럴 상수 사용하기

다음 프로그램을 입력 후 실행하세요.

# Filename : var.py
i = 5
print(i)
i = i + 1
print(i)

s = '''This is a multi-line string.
This is the second line.'''
print(s)

실행 결과:

5
6
This is a multi-line string.
This is the second line.

동작 원리

위 프로그램의 동작 원리는 다음과 같습니다. 먼저, 리터럴 상수 5를 변수 i에 할당 연산자 (=)를 이용하여 할당하였습니다. 이러한 한 줄을 명령(statement)이라고 부르는데, 이 경우 변수명 i에 값 5를 할당하였기 때문입니다. 다음으로, i에 할당된 값을 print 명령을 이용하여 출력합니다. 그러면 변수에 지정된 값이 화면에 나타납니다.

그리고 i에 할당된 값에 1을 더한 후 그 값을 다시 변수에 할당합니다. 이제 이 값을 출력하면, 예상대로, 6이라는 값이 출력됨을 알 수 있습니다.

리터럴 문자열 상수 또한 앞에서 설명한 과정과 동일한 과정을 거쳐 변수 s에 저장된 후 화면에 출력됩니다.

정적 언어 프로그래들을 위한 주석

파이썬에서는 변수에 값을 할당함으로써 자동으로 해당 변수가 생성되며 곧바로 사용할 수 있습니다. 따로 변수의 자료형을 지정할 필요도 없고, 미리 변수를 선언할 필요도 없습니다.

논리적/물리적 명령행

물리적 명령행이란 프로그램 코드 내에 직접 표현된 한 줄을 의미하는 반면, 논리적 명령행은 파이썬 인터프리터 관점에서의 한 명령 단위를 의미합니다. 파이썬은 각각의 물리적 명령행이 곧 논리적 명령행일 것이라고 내부적으로 간주하고 프로그램을 실행합니다.

논리적 명령행이란 예를 들면 print 'hello world' 같은 것입니다. 만약 이것이 실제 코드 상으로도 한 줄로 표현되어 있다면 (편집기에서 보이는 그대로를 말합니다), 이 한 줄은 물리적 명령행이라고도 말할 수 있을 것입니다.

일반적으로 파이썬으로 프로그래밍할 경우, 한 명령을 한 행에 적어 전체적인 코드를 파악하기 쉽게 작성하기를 권합니다.

만약 여러분이 한 물리적 명령행에 둘 이상의 논리적 명령행을 넣고 싶다면, 세미콜론 (;)을 이용하여 논리적 명령행의 끝을 명시적으로 파이썬 인터프리터에게 알려줄 수 있습니다. 다음 예제를 확인하세요.

i = 5
print(i)

위 예제는 다음과 같은 뜻이고

i = 5;
print(i);

마찬가지로 아래와도 같은 뜻이며

i = 5; print(i);

아래와도 같습니다.

i = 5; print(i)

하지만, 저는 여러분이 한 물리적 명령행에 두 개 이상의 논리적 명령행을 사용하지 말 것을 강력히 추천합니다. 즉, 세미콜론을 사용하지 말아 주세요. 사실, 저는 파이썬 프로그램을 작성할 때 세미콜론을 한번도 사용해 본 적이 없고, 또 다른 사람이 사용하는 것을 본 적도 없습니다.

한 명령행이 너무 길어서 보기가 불편한 경우, 백슬래시 문자(\)를 이용하여 한 논리적 명령행을 여러 물리적 명령행으로 나눌 수 있습니다. 이를 명시적 행간 결합이라 부릅니다.

s = 'This is a string. \
This continues the string.'
print(s)

실행 결과:

This is a string. This continues the string.

다음과 같이 쓸 수도 있습니다.

i = \
5

위 예제는 다음과 같습니다.

i = 5

가끔, 백슬래시 없이 행간을 합칠 수 있는 경우도 있습니다. 이것은 명령행의 중간에 괄호가 있을 때, 즉 대괄호나 중괄호를 열었을 경우 괄호를 닫을 때까지 백슬래시 없이도 모두 같은 명령행으로 간주됩니다. 이것은 비명시적 행간 결합(implicit line joining)이라고 부릅니다. 뒷장에서 리스트를 사용하여 프로그램을 작성할 때 이런 경우를 보게 될 것입니다.

들여쓰기

파이썬에서 공백은 중요한 역할을 합니다. 특히, 한 행의 앞에 붙어있는 공백이 정말 중요합니다. 즉, 파이썬에서는 들여쓰기가 매우 중요합니다. 한 논리적 명령행의 앞에 붙어있는 공백 (빈 칸 혹은 탭)은 논리적 명령행의 들여쓰기 단계를 의미하며, 이것은 한 명령의 범위를 구분하는 데 사용됩니다.

같은 들여쓰기 단계에 있는 명령들은 반드시 같은 들여쓰기를 사용해야 합니다. 이러한 같은 들여쓰기를 사용하고 있는 명령들의 집합을 블록(block) 이라고 부릅니다. 뒷장에서 예제를 통해 블록에 대해 다루게 될 것입니다.

지금 여러분이 기억하셔야 할 것은 잘못된 들여쓰기는 오류를 일으킨다는 것입니다. 다음 예제를 봅시다.

i = 5
# 다음 행에서 오류가 발생합니다! 행 앞에 잘못된 공백이 한 칸 있습니다.
 print('Value is', i)
print('I repeat, the value is', i)

위 예제를 실행하면 다음과 같이 오류가 발생합니다.

  File "whitespace.py", line 3
    print('Value is', i)
    ^
IndentationError: unexpected indent

두번째 행 앞에 공백이 한칸 있다는 점을 확인하세요. 위와 같은 오류는 파이썬이 우리에게 프로그램의 문법이 잘못되었음을, 즉 프로그램이 잘못 작성되었다는 것을 알려 주는 것입니다. 이 오류가 의미하는 것은 여러분이 임의로 새 블록을 시작할 수 없음 을 의미합니다. 새 블록을 시작할 수 있는 경우에 대해 흐름 제어(control flow)에서 다루게 될 것입니다.

들여쓰기 하는 법

들여쓰기를 할 때에는 한번에 공백 4개를 이용하세요. 이것은 파이썬 언어에서 공식적으로 추천하는 방법입니다. 좋은 편집기들은 이 사항을 자동으로 준수합니다. 또, 들여쓰기를 할 때에는 항상 같은 개수의 공백을 사용해야 한다는 점에 유의하시기 바랍니다.

정적 언어 프로그래머들을 위한 주석

파이썬은 블록 구분을 위해 들여쓰기를 사용하며, 중괄호를 사용하지 않습니다. 파이썬에서 from __future__ import braces 명령을 실행하여 자세한 사항을 확인하세요.

요약

지금까지 파이썬의 여러 기본적인 특징에 대해 배워보았습니다. 이제 흐름 제어와 같이 좀 더 재미있는 부분에 대해 배워 보도록 하겠습니다. 다음 장으로 넘어가기 전, 이 장에서 배운 내용에 대해 미리 익숙해져 두기를 바랍니다.

Last updated