2.3 C
Seoul
수요일, 11월 27, 2024

spot_img

파이썬 주소록 프로젝트

아이폰이나 안드로이드폰을 보면 이름, 전화번호, 이메일 등을 저장하고 관리할 수 있는 주소록이 기본으로 제공됩니다. 이번 절에서는 파이썬을 이용해 주소록을 관리하는 프로그램을 직접 개발해 보겠습니다.

PyCharm을 실행한 후 그림 8.21과 같이 ‘Contact’라는 이름의 프로젝트를 생성합니다.

그림 8.21 Contact 프로젝트 생성

Contact 프로젝트에 contact.py 파일을 추가한 후 다음과 같이 기본 코드를 작성합니다. 그리고 Ctrl + F9 키를 눌러 화면에 ‘Contact’라는 문자열이 정상적으로 출력되는지 확인합니다.

def run():
    print("Contact")

if __name__ == "__main__":
    run()

아이폰이나 안드로이드폰의 연락처 프로그램을 살펴보면 연락처에는 이름, 전화번호, 이메일, 주소 등을 입력할 수 있습니다. 이를 파이썬에서 제공하는 기본 자료형으로 표현하기보다 하나의 클래스로 정의하는 것이 좋습니다.

6장에서 배운 클래스를 이용해 다음과 같이 ‘Contact’라는 이름의 클래스를 정의하겠습니다. 클래스 인스턴스를 생성할 때 이름, 전화번호, 이메일, 주소를 입력받을 수 있게 생성자를 선언하고 인스턴스 변수에 저장된 정보를 화면에 출력하기 위해 print_info라는 메서드도 정의했습니다.

class Contact:
    def __init__(self, name, phone_number, e_mail, addr):
        self.name = name
        self.phone_number = phone_number
        self.e_mail = e_mail
        self.addr = addr

    def print_info(self):
        print("Name: ", self.name)
        print("Phone Number: ", self.phone_number)
        print("E-mail: ", self.e_mail)
        print("Address: ", self.addr)

정의한 Contact 클래스가 제대로 동작하는지 확인하기 위해 앞서 작성한 run 함수를 수정해 연락처를 입력하고 입력된 정보를 화면에 출력해 보겠습니다. 이를 위해 다음과 같이 Contact 클래스에 대한 인스턴스를 생성합니다.

def run():
    kim = Contact('김일구', '010-8812-1193', 'ilgu.kim@python.com', 'Seoul')
    kim.print_info()

지금까지 작성한 전체 코드는 다음과 같습니다.

class Contact:
    def __init__(self, name, phone_number, e_mail, addr):
        self.name = name
        self.phone_number = phone_number
        self.e_mail = e_mail
        self.addr = addr

    def print_info(self):
        print("Name: ", self.name)
        print("Phone Number: ", self.phone_number)
        print("E-mail: ", self.e_mail)
        print("Address: ", self.addr)

def run():
    kim = Contact('김일구', '010-8812-1193', 'ilgu.kim@python.com', 'Seoul')
    kim.print_info()

if __name__ == "__main__":
    run()

PyCharm에서 Ctrl + F9 또는 Ctrl + F5를 눌러 지금까지 작성한 프로그램이 정상적으로 동작하는지 확인해보기 바랍니다. 그림 8.22와 같이 run 함수에서 입력한 값이 정상적으로 출력되면 됩니다.

그림 8.22 연락처 정보 출력

2) 사용자로부터 데이터 입력받기

이번 절에서는 사용자로부터 데이터를 입력받아 보겠습니다. 파이썬에서 사용자로부터 데이터를 입력 받을 때는 input 함수를 사용합니다. 사용자로부터 데이터를 입력받는 함수인 set_contact 함수를 새로 정의하고 run 함수에서 set_contact 함수를 호출하도록 코드를 변경해 봅시다.

class Contact:
    def __init__(self, name, phone_number, e_mail, addr):
        self.name = name
        self.phone_number = phone_number
        self.e_mail = e_mail
        self.addr = addr

    def print_info(self):
        print("Name: ", self.name)
        print("Phone Number: ", self.phone_number)
        print("E-mail: ", self.e_mail)
        print("Address: ", self.addr)

def set_contact():
    name = input("Name: ")
    phone_number = input("Phone Number: ")
    e_mail = input("E-mail: ")
    addr = input("Address: ")
    print(name, phone_number, e_mail, addr)

def run():
    set_contact()

if __name__ == "__main__":
    run()

수정한 코드를 실행하면 PyCharm의 아래쪽에 위치하는 실행 창을 통해 데이터를 입력할 수 있습니다. 데이터 입력이 완료되면 set_contact 함수의 마지막 라인에 있는 print 코드로 인해 지금까지 입력된 데이터가 화면에 출력됩니다. 그림 8.23과 같이 입력한 데이터와 출력된 데이터를 비교해 정상적으로 데이터가 변수에 저장되는지 확인해 봅시다.

그림 8.23 데이터 입력

3) 메인 메뉴 구성하기

여러분이 작성할 연락처 프로그램은 기본적으로 연락처 입력, 연락처 출력, 연락처 삭제, 종료 기능을 제공합니다. 작성된 연락처 프로그램은 계속 실행 상태를 유지하다가 사용자로부터 종료 명령을 받으면 프로그램이 종료해야 합니다. 이번 절에서는 이러한 기본 실행 구조를 파이썬 코드로 작성해 보겠습니다.

작성한 프로그램이 한 번 실행됐을 때 종료하지 않은 상태로 계속 실행되게 하려면 무한 루프를 사용해야 합니다. 파이썬에서는 ‘while 1’이라는 구문을 사용하면 프로그램이 계속 실행되도록 만들 수 있습니다. 하지만 사용자로부터 종료 명령을 받았을 때는 프로그램이 종료해야겠지요? 이를 위해서는 while 문 내부에서 if 문을 사용해 조건에 따라 while 문이 종료하도록 만들면 됩니다.

여기서 while 문은 결국 반복문이기 때문에 이를 종료하려면 반복문을 빠져나오면 됩니다. 이러한 용도로 사용하는 구문이 바로 break 문입니다. 지금까지 설명한 내용을 코드로 작성하면 다음과 같습니다. 참고로 지금부터는 지면상 새로 추가된 부분이나 수정된 코드만 표시하겠습니다.

def print_menu():
    print("1. 연락처 입력")
    print("2. 연락처 출력")
    print("3. 연락처 삭제")
    print("4. 종료")
    menu = input("메뉴선택: ")
    return int(menu)

def run():
    while 1:
        menu = print_menu()
        if menu == 4:
            break

지금까지 작성한 프로그램을 실행해 봅니다. 그림 8.24는 현재까지 작성된 프로그램을 실행한 화면입니다. run 함수는 print_menu 함수를 호출하기 때문에 화면에 메인 메뉴가 출력됩니다. print_menu 함수는 input 함수를 통해 사용자로부터 메뉴를 입력받은 후 int라는 내장 함수를 통해 정수로 변환한 후 반환합니다.

run 함수에서는 사용자가 입력한 메뉴 값이 4와 같은지 확인하고 메뉴 값이 4일 때는 break를 사용해 무한 루프를 빠져나옵니다. 그림 8.24와 같이 여러분이 1번 메뉴를 선택했다면 while 문의 반복 구조로 인해 다시 한 번 화면에 메뉴가 출력됩니다. 이때4를 입력하면 정상적으로 프로그램이 종료됨을 확인할 수 있습니다.

그림 8.24 프로그램의 메인 루프 테스트

4) 연락처 입력 동작 시키기

이번에는 1번 메뉴인 ‘연락처 입력’ 기능이 정상적으로 동작하도록 프로그램을 변경해 보겠습니다. 먼저 사용자가 입력한 연락처 정보를 이용해 Contact 클래스 인스턴스를 생성하고 생성된 인스턴스를 반환하도록 set_contact 함수를 수정하겠습니다. set_contact 함수의 마지막 두 줄에서 Contact 클래스의 인스턴스를 생성하고 이를 반환하는 것을 확인할 수 있습니다.

def set_contact():
    name = input("Name: ")
    phone_number = input("Phone Number: ")
    e_mail = input("E-mail: ")
    addr = input("Address: ")
    contact = Contact(name, phone_number, e_mail, addr)
    return contact

현재 set_contact 함수는 단순히 함수가 정의된 상태입니다. 이 함수가 정상적으로 동작하려면 어디선가 해당 함수를 호출해야 합니다. set_contact 함수는 사용자로부터 연락처를 입력받을 때 사용하는 함수이므로 사용자가 ‘1. 연락처 입력’ 메뉴를 선택했을 때 run 함수에서 set_contact 함수를 호출하면 됩니다.

다음과 같이 기존에 작성된 run 함수를 수정해 사용자가 1번 메뉴를 선택했을 때 set_contact 함수를 호출하도록 변경해 봅시다. 그리고 set_contact 함수의 반환값인 Contact 인스턴스를 저장하기 위해 contact_list라는 이름의 리스트 자료구조를 생성하고 해당 리스트에 생성된 인스턴스를 추가해 봅시다.

def run():
    contact_list = []
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 4:
            break

예제 8.1은 지금까지 작성한 코드입니다. 중간중간 코드를 수정하다가 흐름을 놓친 분들은 다음의 전체 코드를 살펴보시기 바랍니다.

class Contact:
    def __init__(self, name, phone_number, e_mail, addr):
        self.name = name
        self.phone_number = phone_number
        self.e_mail = e_mail
        self.addr = addr

    def print_info(self):
        print("Name: ", self.name)
        print("Phone Number: ", self.phone_number)
        print("E-mail: ", self.e_mail)
        print("Address: ", self.addr)

def set_contact():
    name = input("Name: ")
    phone_number = input("Phone Number: ")
    e_mail = input("E-mail: ")
    addr = input("Address: ")
    contact = Contact(name, phone_number, e_mail, addr)
    return contact

def print_menu():
    print("1. 연락처 입력")
    print("2. 연락처 출력")
    print("3. 연락처 삭제")
    print("4. 종료")
    menu = input("메뉴선택: ")
    return int(menu)

def run():
    contact_list = []
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 4:
            break

if __name__ == "__main__":
    run()

*예제 8.1 주소록 관리 프로그램의 소스코드(소스코드: book/ch08/01.py)

예제 8.1의 코드를 실행한 후 그림 8.25와 같이 1번 메뉴를 선택해 연락처를 입력하고 4번 메뉴를 선택해 프로그램을 종료해 봅시다. 아직은 연락처 출력 기능이 없으므로 정상적으로 입력됐는지는 확인할 수 없지만 현 시점에서는 일단 에러가 발생하지 않는 것이 중요합니다.

그림 8.25 주소록 프로그램의 중간 실행 결과

앞서 프로그램이 실행될 때 contact_list는 그림 8.26과 같이 입력된 ‘테스트1’에 대한 데이터를 가진 인스턴스를 바인딩하게 됩니다. 물론 4번 메뉴를 통해 프로그램을 종료하면 메모리에 할당된 모든 데이터가 자동으로 삭제됩니다.

그림 8.26 contact_list 상태

5) 연락처 출력하기

이번에는 연락처를 출력하는 기능을 추가해 보겠습니다. 앞서 작성한 코드에서 연락처는 Contact라는 클래스의 인스턴스 형태로 저장되며, 인스턴스는 contact_list라는 이름의 리스트를 통해 순서대로 저장됩니다. 즉, 입력된 연락처를 모두 출력하려면 contact_list에 있는 인스턴스에 저장된 정보를 출력하면 되는 것입니다.

이미 여러분은 Contact 클래스를 정의할 때 인스턴스 변수의 데이터를 화면에 출력하는 메서드인 print_info 함수를 정의해 놓았습니다. 따라서 연락처를 출력하는 함수는 다음과 같이 간단히 구현할 수 있습니다.

def print_contact(contact_list):
    for contact in contact_list:
        contact.print_info()

print_contact 함수는 Contact 인스턴스를 저장하고 있는 리스트를 인자를 입력받은 후 for 문을 이용해 리스트에 저장된 인스턴스를 순회합니다. 이때 각 인스턴스에서 print_info 메서드를 호출합니다.

연락처 출력 기능은 메인 메뉴에서 ‘2. 연락처 출력’을 선택했을 때 수행돼야 합니다. 따라서 다음과 같이 run 함수도 수정합니다.

def run():
    contact_list = []
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 2:
            print_contact(contact_list)
        elif menu == 4:
            break

지금까지 작성한 프로그램을 실행해 봅시다. 먼저 1번 메뉴를 선택한 후 임의로 연락처 정보를 입력하고 2번 메뉴를 선택하면 그림 8.27과 같이 입력된 정보가 정상적으로 출력되는 것을 확인할 수 있습니다.

그림 8.27 연락처 출력 기능 확인

6) 연락처 삭제하기

이번에는 입력된 연락처를 삭제하는 기능을 추가해 보겠습니다. 연락처를 삭제하려면 삭제하고자 하는 연락처의 이름을 입력받은 후 연락처 리스트에서 해당 이름을 찾아서 지우면 됩니다.

연락처 리스트에서 연락처를 삭제하기 위해 다음과 같이 delete_contact 함수를 작성합니다. 이 함수는 연락처 리스트와 삭제할 이름을 인자로 입력받습니다. delete_contact 함수는 연락처 리스트에 저장된 인스턴스 중 삭제하고자 하는 연락처 이름과 같은 연락처가 있는지 확인한 후 같은 연락처가 있을 때 해당 연락처를 삭제합니다.

def delete_contact(contact_list, name):
    for i, contact in enumerate(contact_list):
        if contact.name == name:
            del contact_list[i]

연락처를 삭제하는 함수를 작성했다면 이번에는 run 함수를 수정하겠습니다. 연락처 삭제는 ‘3. 연락처 삭제’ 메뉴를 선택했을 때 동작하는데, 이때 삭제할 연락처의 이름(Name)을 한 번 더 입력받습니다.

삭제할 연락처의 이름을 입력받았다면 연락처 리스트와 삭제할 이름을 delete_contact 함수의 인자로 전달하면 해당 함수를 통해 연락처가 삭제됩니다.

def run():
    contact_list = []
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 2:
            print_contact(contact_list)
        elif menu == 3:
            name = input("Name: ")
            delete_contact(contact_list, name)
        elif menu == 4:
            break

지금까지 작성한 주소록 프로젝트의 전체 소스코드는 예제 8.2와 같습니다. 여러분이 입력한 코드와 틀린 부분이 없는 확인하고 틀린 부분이 없다면 작성한 프로그램을 실행해 보기 바랍니다.

프로그램이 정상적으로 동작하는지 확인하기 위해 여러 명의 연락처를 입력해 보기 바랍니다. 그리고 그중 일부 연락처를 삭제한 후 연락처도 출력해 보기 바랍니다. 어떤가요? 지금까지 배운 파이썬의 기본 문법을 활용하고 프로그램을 단계별로 나눠서 작성하니 조금 복잡해 보이는 프로그램도 어렵지 않게 작성할 수 있지요?

class Contact:
    def __init__(self, name, phone_number, e_mail, addr):
        self.name = name
        self.phone_number = phone_number
        self.e_mail = e_mail
        self.addr = addr

    def print_info(self):
        print("Name: ", self.name)
        print("Phone Number: ", self.phone_number)
        print("E-mail: ", self.e_mail)
        print("Address: ", self.addr)

def set_contact():
    name = input("Name: ")
    phone_number = input("Phone Number: ")
    e_mail = input("E-mail: ")
    addr = input("Address: ")
    contact = Contact(name, phone_number, e_mail, addr)
    return contact

def print_contact(contact_list):
    for contact in contact_list:
        contact.print_info()

def delete_contact(contact_list, name):
    for i, contact in enumerate(contact_list):
        if contact.name == name:
            del contact_list[i]

def print_menu():
    print("1. 연락처 입력")
    print("2. 연락처 출력")
    print("3. 연락처 삭제")
    print("4. 종료")
    menu = input("메뉴선택: ")
    return int(menu)

def run():
    contact_list = []
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 2:
            print_contact(contact_list)
        elif menu == 3:
            name = input("Name: ")
            delete_contact(contact_list, name)
        elif menu == 4:
            break

if __name__ == "__main__":
    run()

예제 8.2 주소록 프로젝트의 전체 소스코드(소스코드: book/ch08/02.py)

3) 주소록 프로젝트의 기능 향상

이번 절에서는 8.2절에서 작성한 연락처 관리 프로그램에 저장 기능을 추가해 보겠습니다. 지금까지 작성한 주소록 프로그램은 프로그램을 종료하면 입력된 모든 연락처가 사라집니다. 이는 입력받은 연락처가 Contact 클래스의 인스턴스로서 메모리에 할당됐다가 프로그램이 종료되면 메모리에 있는 모든 변수가 삭제되기 때문입니다.

이러한 문제를 해결하려면 어떻게 해야 할까요? 가장 간단한 방법은 프로그램이 종료되는 시점을 기준으로 유효한 연락처의 정보를 모두 파일로 저장하는 것입니다. 파일 입출력은 7장에서 살펴봤기 때문에 바로 해당 기능을 추가해 보겠습니다.

8.2절에서 구현한 메인 메뉴의 기능과 달리 파일 출력 기능은 메인 메뉴를 통해 제공되는 기능이 아닙니다. 단지 프로그램이 종료될 때 종료 시점에 유효한 데이터를 파일로 출력하면 됩니다. 반대로 프로그램이 실행될 때는 기존에 저장된 연락처를 불러와야(Load) 합니다.

1) 연락처 저장 함수 작성하기

맨 먼저 작성해볼 함수는 프로그램이 종료될 때 유효한 연락처 정보를 파일로 저장하는 store_contact라는 함수입니다. 이 함수는 contact_list라는 리스트를 입력받은 후 해당 리스트에 있는 Contact 인스턴스를 순회하면서 데이터를 파일로 저장합니다.

def store_contact(contact_list):
    f = open("contact_db.txt", "wt")
    for contact in contact_list:
        f.write(contact.name + '\n')
        f.write(contact.phone_number + '\n')
        f.write(contact.e_mail + '\n')
        f.write(contact.addr + '\n')
    f.close()

store_contact 함수는 함수가 호출될 때 먼저 ‘contact_db.txt’라는 이름의 텍스트 파일을 ‘wt’ 모드로 엽니다. 그런 다음 contact_list를 순회하면서 각 인스턴스의 정보를 write 함수를 통해 출력합니다. 이때 출력되는 각 정보가 파일에서 각 라인 단위로 저장되도록 ‘\n’을 사용했습니다. contact_list의 모든 데이터를 파일로 출력했다면 f.close()를 통해 파일을 닫습니다.

파일로 저장하는 기능은 프로그램이 종료될 때 호출하면 되므로 기존에 작성된 run 함수를 수정합니다.

def run():
    contact_list = []
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 2:
            print_contact(contact_list)
        elif menu == 3:
            name = input("Name: ")
            delete_contact(contact_list, name)
        elif menu == 4:
            store_contact(contact_list)
            break

수정된 프로그램을 실행한 후 그림 8.28과 같이 연락처를 하나 입력하고 프로그램을 종료해 봅시다.

그림 8.28 연락처 입력 후 종료

그림 8.29와 같이 PyCharm의 프로젝트 화면을 보면 contact_db.txt라는 이름의 파일이 생성된 것을 확인할 수 있습니다.

그림 8.29 생성된 파일 확인

해당 파일의 이름을 더블클릭하면 그림 8.30과 같이 PyCharm의 에디터 화면에서 생성된 텍스트 파일의 내용을 확인할 수 있습니다. 참고로 contact_db.txt 파일은 프로젝트 소스코드가 존재하는 디렉터리에 생성되는데, PyCharm에서는 이를 프로젝트 뷰에서 바로 보여주기 때문에 프로그램을 작성할 때보다 편리하게 파일 내용을 확인할 수 있습니다.

그림 8.30 생성된 파일 내용 확인

2) 연락처 불러들이기

앞서 프로그램이 종료될 때 유효한 연락처를 파일로 저장하는 기능을 구현했습니다. 이번에는 이와 반대로 이전에 파일로 저장돼 있던 연락처 정보를 프로그램이 시작될 때 불러들이는 기능을 구현해 보겠습니다.

파일로부터 연락처를 로드하는 함수의 이름은 load_contact입니다. 이 함수 역시 contact_list를 인자로 받으며, 함수 내부에서 ‘contact_db.txt’ 파일을 열어서 해당 파일을 라인 단위로 저장된 이름, 전화번호, 이메일, 주소로 읽어 들여 Contact 클래스의 인스턴스를 생성합니다. 그런 다음 생성한 인스턴스를 contact_list에 추가합니다.

def load_contact(contact_list):
    f = open("contact_db.txt", "rt")
    lines = f.readlines()
    num = len(lines) / 4
    num = int(num)

    for i in range(num):
        name = lines[4*i].rstrip('\n')
        phone = lines[4*i+1].rstrip('\n')
        email = lines[4*i+2].rstrip('\n')
        addr = lines[4*i+3].rstrip('\n')
        contact = Contact(name, phone, email, addr)
        contact_list.append(contact)
    f.close()

load_contact 함수는 먼저 readlines 함수를 이용해 파일에 있는 모든 데이터를 읽습니다. 연락처 하나당 4줄의 데이터가 존재하므로 파일에서 읽어 들인 전체 라인 수를 4로 나누어 몇 개의 데이터가 존재하는지 확인합니다. 나눗셈 연산을 수행하면 num 값이 실수가 되는데, 이 값을 int 내장 함수를 사용해 정수형으로 형변환합니다.

for 문에서는 num의 개수만큼 루프를 돌면서 lines 리스트에 저장된 데이터를 읽어 들여 Contact 클래스의 인스턴스를 생성하고 생성한 인스턴스를 contact_list에 추가합니다.

앞서 설명한 것처럼 파일로 저장된 연락처를 불러오는 것은 연락처 관리 프로그램이 실행될 때 이뤄져야 합니다. 따라서 다음과 같이 run 함수가 시작하는 부분에서 load_contact 함수를 호출하면 됩니다.

def run():
    contact_list = []
    load_contact(contact_list)
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 2:
            print_contact(contact_list)
        elif menu == 3:
            name = input("Name: ")
            delete_contact(contact_list, name)
        elif menu == 4:
            store_contact(contact_list)
            break

예제 8.3은 지금까지 작성한 주소록 프로젝트의 최종 코드입니다. 해당 코드는 파일 입출력 기능을 추가로 수행함으로써 프로그램이 종료되더라도 프로그램이 실행된 시점의 데이터를 하드디스크에 저장할 수 있습니다. 또한 프로그램이 시작될 때 하드디스크에 저장된 파일을 읽어 들여 프로그램이 종료되던 시점의 데이터를 그대로 복원하는 기능을 제공합니다.

class Contact:
    def __init__(self, name, phone_number, e_mail, addr):
        self.name = name
        self.phone_number = phone_number
        self.e_mail = e_mail
        self.addr = addr

    def print_info(self):
        print("Name: ", self.name)
        print("Phone Number: ", self.phone_number)
        print("E-mail: ", self.e_mail)
        print("Address: ", self.addr)

def set_contact():
    name = input("Name: ")
    phone_number = input("Phone Number: ")
    e_mail = input("E-mail: ")
    addr = input("Address: ")
    contact = Contact(name, phone_number, e_mail, addr)
    return contact

def print_contact(contact_list):
    for contact in contact_list:
        contact.print_info()

def delete_contact(contact_list, name):
    for i, contact in enumerate(contact_list):
        if contact.name == name:
            del contact_list[i]

def load_contact(contact_list):
    f = open("contact_db.txt", "rt")
    lines = f.readlines()
    num = len(lines) / 4
    num = int(num)

    for i in range(num):
        name = lines[4*i].rstrip('\n')
        phone = lines[4*i+1].rstrip('\n')
        email = lines[4*i+2].rstrip('\n')
        addr = lines[4*i+3].rstrip('\n')
        contact = Contact(name, phone, email, addr)
        contact_list.append(contact)
    f.close()

def store_contact(contact_list):
    f = open("contact_db.txt", "wt")
    for contact in contact_list:
        f.write(contact.name + '\n')
        f.write(contact.phone_number + '\n')
        f.write(contact.e_mail + '\n')
        f.write(contact.addr + '\n')
    f.close()

def print_menu():
    print("1. 연락처 입력")
    print("2. 연락처 출력")
    print("3. 연락처 삭제")
    print("4. 종료")
    menu = input("메뉴선택: ")
    return int(menu)

def run():
    contact_list = []
    load_contact(contact_list)
    while 1:
        menu = print_menu()
        if menu == 1:
            contact = set_contact()
            contact_list.append(contact)
        elif menu == 2:
            print_contact(contact_list)
        elif menu == 3:
            name = input("Name: ")
            delete_contact(contact_list, name)
        elif menu == 4:
            store_contact(contact_list)
            break

if __name__ == "__main__":
    run()

예제 8.3 주소록 프로젝트의 최종 코드(소스코드: book/ch08/03.py)

3) 명령 프롬프트에서 프로그램 실행하기

지금까지 PyCharm을 통해 프로그램을 개발하고 동시에 실행해 보면서 프로그램을 작성했습니다. PyCharm을 이용해 프로그램을 작성하면 하드디스크에 파이썬 소스코드 형태로 프로그램이 저장됩니다. 이번 절에서는 윈도우의 명령 프롬프트를 이용해 직접 파이썬 코드를 실행해 보겠습니다.

윈도우에서 명령 프롬프트를 실행하려면 윈도우 시작 버튼을 누른 다음 [실행] → [cmd]를 입력하면 됩니다. 명령 프롬프트가 나타나면 지금까지 작성한 Contact 프로젝트 경로로 이동합니다. 저자의 PC를 기준으로 설명해 드리면 현재 프로젝트 파일은 ‘C:\Users\Jason\PyCharmProjects\Contact’ 에 있습니다. 따라서 다음과 같이 cd(change directory) 명령을 이용해 해당 디렉터리 경로로 이동합니다. 파이썬 프로젝트가 들어있는 곳으로 이동하고 나면 dir 명령어를 입력해 현재 디렉터리에 contact.py라는 파일이 있는지 확인합니다.

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Users\Jason>cd PycharmProjects

C:\Users\Jason\PycharmProjects>cd Contact

C:\Users\Jason\PycharmProjects\Contact>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 3E7A-5817

 C:\Users\Jason\PycharmProjects\Contact 디렉터리

2016-10-05  오전 08:18    <DIR>          .
2016-10-05  오전 08:18    <DIR>          ..
2016-10-05  오전 08:15             2,319 contact.py
               1개 파일               2,319 바이트
               2개 디렉터리  93,350,182,912 바이트 남음

C:\Users\Jason\PycharmProjects\Contact>

cd 명령어를 이용해 정상적으로 프로젝트 경로로 이동했다면 ‘python contact.py’를 입력해 파이썬 프로그램을 실행할 수 있습니다.

C:\Users\Jason\PycharmProjects\Contact>python contact.py
1. 연락처 입력
2. 연락처 출력
3. 연락처 삭제
4. 종료
메뉴선택:

프로그램을 개발하는 과정에서는 PyCharm과 같은 IDE 상에서 파이썬 프로그램을 직접 실행하지만 프로그램 개발이 완료된 후에는 방금 설명한 바와 같이 직접 파이썬 소스코드를 사용해 프로그램을 실행하게 됩니다.

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

Related Articles

Stay Connected

18,393FansLike
128,393FollowersFollow
81,934SubscribersSubscribe

Latest Articles