우리는 새로운 사람을 만나면 이름과 전화번호를 주고받는다. 그리고 휴대전화에 연락처를 입력해 둔다. 프로그래머의 관점에서, 그 많은 이름과 전화번호를 기억하게 하려면 프로그램을 어떻게 만들어야 할까? 이미 배웠듯이, 컴퓨터가 데이터를 기억하도록 하려면 변수를 사용하면 된다. 하지만 변수만으로 될까?

연락처(기억해야 하는 데이터) 하나는 이름과 전화번호로 구성된다. 이름을 name 이라는 변수에, 전화번호를 phone 이라는 변수에 각각 기억하도록 해 보자.

코드 5-1 변수를 이용한 연락처 관리 프로그램 1

name  = '박연오'
phone = '01012345678'

이 방법으로는 연락처를 하나밖에 저장하지 못한다. 새로운 연락처를 name, phone에 대입하면 이전에 저장한 연락처를 지워질 것이다. 여러 개의 연락처를 기억하도록 할 방법이 없을까? 다음과 같이 변수 이름에 번호를 붙여 보자.

코드 5-2 변수를 이용한 연락처 관리 프로그램 2

# 첫 번째 연락처
name_1  = '박연오'
phone_1 = '01012345678'

# 두 번째 연락처
name_2  = '이진수'
phone_2 = '01011001010'

# 세 번째 연락처 (비어 있는 자리)
name_3  = None
phone_3 = None

... (계속)

변수에 번호를 붙이면 여러 개의 연락처를 저장할 수 있다. 수는 무한하고 변수의 이름은 필요한 만큼 길어질 수 있으니 필요한만큼 숫자를 붙여 변수를 만들기만 하면 된다. 하지만 여러 가지 신경쓰이는 점이 있다.

  • 문제점 1: 연락처를 많이 저장하도록 하려면 그만큼 많은 코드를 작성해야 한다.
  • 문제점 2: 필요한 연락처 개수를 미리 알지 못한다면, 코드를 몇 줄이나 작성해 두어야 할 지 알 수 없다.
  • 문제점 3: namephone은 연락처라는 한 데이터의 구성요소인데, 각각 다른 변수로 구분되어 있어 별개의 데이터처럼 보인다.

데이터 하나를 변수 하나에 대입하여 다루는 방법은 다뤄야 할 데이터의 수가 적고 원자적일 때 효과적이다. 데이터의 양이 많거나 데이터가 집합의 성격을 띨 때는 컬렉션을 활용해야 한다. 이름, 전화번호라는 원자 데이터를 컬렉션에 담아 연락처를 나타내는 하나의 데이터로 묶을 수 있다. 또, 이 연락처 여러 개를 연락처 목록 하나에 나열할 수도 있다.

파이썬이 제공하는 컬렉션에는 크게 시퀀스, 매핑, 집합이 있다. 시퀀스는 연속적인 데이터를 다루기 위한 것으로 문제점 1과 문제점 2를 해결할 수 있게 해준다. 문제점 3은 키를 이용해 데이터를 관리하는 매핑을 사용해 해결할 수 있다. 한편, 집합은 수학의 집합에서 차용한 것으로 중복 없는 데이터를 관리하거나 집합 연산을 수행할 때 유용하다.