새로 사람을 알게 되면 이름과 전화번호를 주고받는다. 기억해야할 연락처가 많더라도 휴대전화의 연락처 관리 프로그램이 사람 대신 기억해 주니 문제 없다. 프로그래머의 관점에서, 그 많은 이름과 전화번호를 기억하게 하려면 프로그램을 어떻게 만들어야 할까? 컴퓨터가 데이터를 기억하도록 하려면 변수를 사용하면 된다. 하지만 변수만으로 연락처 저장 프로그램을 만들 수 있을지는 한 번 생각해 보자.

연락처(기억해야 하는 데이터)는 사람의 이름과 전화번호로 구성된다. 다음 코드에서는 이름을 name 이라는 변수에, 전화번호를 phone 이라는 변수에 각각 기억하도록 했다.

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

name  = '홍길동'
phone = '01234567890'

좋은 출발이긴 하다만, 이 코드로는 한 사람의 연락처밖에 기억하지 못한다. 여러 개의 연락처를 기억하도록 하려면 다음과 같이 변수 이름에 번호를 붙여두는 것이 좋겠다.

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

# 첫 번째 연락처
name_1  = '홍길동'
phone_1 = '01234567890'

# 두 번째 연락처
name_2  = '임꺽정'
phone_2 = '01234567891'

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

... (계속)

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

  • 문제점 1: 연락처의 개수만큼 프로그래머가 작성해야 할 코드의 양이 늘어나는데, 너무 불편하다.
  • 문제점 2: 임의의 개수의 연락처를 기억해야 한다면 임의의 수 만큼의(무한한 양의) 코드를 작성해야 한다.
  • 문제점 3: namephone은 연락처라는 한 데이터의 구성요소인데, 각각 다른 변수로 구분되어 있어 별개의 데이터처럼 보인다.

데이터 하나를 변수(이름) 하나에 대입하여 다루는 방법은 다뤄야 할 데이터의 수가 적고 원자적일 때 효과적이다. 데이터의 양이 많거나 집합적일 때는 컬렉션을 활용해야 한다. 컬렉션을 사용하면 이름, 전화번호 같은 원자 데이터를 연락처와 연락처 목록이라는 집합 데이터로 다룰 수 있다.

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