7. 기초

화면에 Hello World를 출력하는 것만으로는 부족한가요? 여러분은 아마 더 많은 것을 해 보고 싶을 것입니다. 정보를 입력받고 처리한 뒤 결과물을 출력하는 프로그램을 만들고 싶을 테지요. 파이썬에서는 상수와 변수를 이용하여 이러한 일을 할 수 있습니다. 이 장에서는 이외에도 몇 가지 기본 기능도 살펴볼 것입니다.


7.1 주석

'주석 '은 # 문자 뒤에 따라오는 짧은 문장입니다. 주로 소스 코드를 읽는 사람을 위해 주석으로 설명을 남깁니다.

print 'hello world' # Note that print is a statement


# Note that print is a statement
print 'hello world'


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

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

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

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

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

  • 앞으로 극복하려고 하는 문제에 대한 설명 등




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

Code tells you how, comments should tell you why.


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



옮김이 주_ 주석을 한글로 남길 경우, 혹은 여러분의 파이썬 프로그램에 한글이 들어갈 경우 프로그램의 첫번째 줄 혹은 두 번째 줄에는 반드시 다음과 같이 파일의 인코딩에 대한 정보가 주석 형태로 들어가야 합니다.

~python # coding=cp949 ~


cp949는 마이크로소프트에서 제정한 한글 표현 방식을 뜻합니다(codepage 949). 파일이 UTF-8형식으로 저장되는 경우 다음과 같이 작성합니다.

~python # coding=utf-8 ~


자세한 사항은 PEP 0263 및 뒤에서 다룰 유니코드 섹션을 참고하세요.



7.2 리터럴 상수

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

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


7.3 숫자형

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

정수형 숫자의 예는 2입니다. 이것은 단순히 2라는 숫자를 의미하는 것입니다.

부동 소수점 숫자의 예는 3.2352.3E-4`와 같은 값입니다. E 표기법은 E 뒤의 값이 10의 지수임을 나타냅니다. 예를 들어 `52.3E-4는 +52.3*10-4+라는 값을 의미합니다.


NOTE

숙련된 프로그래머들을 위한 주석파이썬에서는 long 형이 따로 없습니다. 대신, int 형에 어떤 크기의 정수든지 담을 수 있습니다.



7.4 문자열

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


7.4.1 작은 따옴표

여러분은 작은 따옴표를 이용하여 문자열을 지정할 수 있습니다. 예를 들어 'Quote me on this' 와 같이 하면 됩니다. 모든 공백 문자, 즉 띄어쓰기나 탭 등은 입력한 그대로 유지됩니다.


7.4.2 큰 따옴표

큰 따옴표로 둘러싸인 문자열은 작은 따옴표로 둘러싸인 문자열과 같게 취급됩니다. 예를 들면, "What’s your name?"과 같습니다 (큰 따옴표로 둘러싸인 문자열 안에 작은 따옴표가 포함되어도 됩니다).


7.4.3 따옴표 세 개

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

'''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."
'''


7.4.4 문자열은 수정이 불가

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


NOTE

C/C++ 프로그래머를 위한 파이썬에서는 char 형이 따로 구분되어 있지 않습니다. 파이썬에서는 이것이 딱히 필요가 없습니다. 곧 여러분도 char 형을 찾지 않게 될 것입니다.


NOTE

Perl/PHP 프로그래머를 위한 파이썬에서는 작은 따옴표와 큰 따옴표로 둘러싸인 문자열을 동일하게 취급합니다. 둘 사이에 어떤 차이도 없습니다.



7.4.5 문자열 포맷팅

문자열 생성 시 다른 정보들을 포함하여 생성하고 싶을 때가 있습니다. 이것을 문자열 포맷팅이라고 하며, 이를 위해 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)
str_format.py


실행 결과는 다음과 같습니다.

$ 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'


그러나 이것은 척 보기에도 깔끔하지 못하며, 작성 중 실수하기도 쉽습니다. 또 각 변수를 일일이 명시적으로 문자열로 변환해주어야 하지만, 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')
# 사용자 지정 키워드를 이용해 (Swaroop wrote A Byte of Python) 표기
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 "a",
print "b",


실행 결과는 다음과 같습니다.

a b


7.4.6 이스케이프Escape 문자

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

앞의 문자열을 정의하는 또 다른 방법은 큰 따옴표를 사용하여 "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."


7.4.7 순 문자열

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

r"Newlines are indicated by \n"



NOTE

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



7.5 변수

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


7.6 식별자 이름 짓기

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

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

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

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

  • 올바른 식별자 이름은 iname_2_3 등과 같습니다. 올바르지 않은 식별자 이름은 2thingsthis is spaced outmy-name>a1b2_c3 등입니다.


7.7 자료형

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


7.8 객체

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


NOTE

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



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


7.9 파이썬 프로그램 작성하기

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


7.10 PyCharm을 이용할 경우

① PyCharm 을 실행합니다.

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

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

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



NOTE

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

PyCharm command line arguments



7.11 다른 편집기를 이용할 경우

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

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

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

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


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

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

# 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에 할당 연산자 (=)를 이용하여 할당하였습니다. 이러한 한 줄을 명령이라고 부르는데, 변수명 i를 값 5에 할당하는 행위를 지정한 것이기 때문입니다. 다음으로 i에 할당된 값을 print 명령을 이용하여 출력합니다. 그러면 변수에 지정된 값이 화면에 나타납니다.

그리고 i에 할당된 값에 1+을 더한 후 그 값을 다시 변수에 할당합니다. 이제 이 값을 출력하면 예상대로 +6이라는 값이 출력될 것입니다.

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


NOTE

프로그램을 실행할 때 명령줄 인수와 함께 실행하고 싶을 경우, 메뉴의 [Run] → [Edit Configurations] 을 누르고 [Script parameters] 섹션에 인수를 입력한 후 OK 버튼을 누르면 됩니다:



7.13 논리적/물리적 명령행

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

논리적 명령행이란, 예를 들면 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.



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

print \
i


앞의  예제는 다음과 같습니다.

print i

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


7.14 들여쓰기

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

즉, 같은 들여쓰기 단계에 있는 명령은 반드시 같은 들여쓰기를 사용해야 하는 것입니다. 이처럼 같은 들여쓰기를 사용하고 있는 명령의 집합을 블록block 이라고 부릅니다. 차후 예제를 통해 블록에 대해 더 깊이 알아볼 것입니다.

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

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


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

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


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


NOTE

프로그램을 실행할 때 명령줄 인수와 함께 실행하고 싶을 경우, 메뉴의 [Run] → [Edit Configurations] 을 누르고 [Script parameters] 섹션에 인수를 입력한 후 OK 버튼을 누르면 됩니다:



들여쓰기 하는 법

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



NOTE

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



7.15 요약

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