Python

프로젝트: 간단한 주소록 관리 시스템

Chansman 2025. 3. 14. 00:34

# 📚 간단한 주소록 관리 시스템

## ✅ 프로젝트 개요

**목표:**
- 사용자로부터 연락처 정보를 입력받아 관리하고, 원하는 조건에 따라 연락처를 검색할 수 있는 간단한 주소록 관리 시스템을 구현합니다.

**기능:**
1. **연락처 추가**: 사용자의 이름, 전화번호, 이메일 주소를 입력받아 주소록에 추가합니다.
2. **연락처 목록 보기**: 저장된 모든 연락처의 정보를 화면에 출력합니다.
3. **연락처 검색**: 사용자로부터 검색 키워드를 입력받아, 해당 키워드가 이름에 포함된 연락처 정보를 출력합니다.
4. **연락처 삭제**: 사용자로부터 이름을 입력받아, 해당하는 연락처 정보를 주소록에서 삭제합니다.
5. **연락처 정렬**: 연락처 목록을 이름 순서로 정렬하여 출력합니다.
6. **제너레이터를 이용한 연락처 순회**: 주소록에 저장된 연락처를 순회하는 제너레이터 함수를 구현합니다.

**구현 상세:**
- 주소록 데이터는 리스트 내에 딕셔너리 형태로 저장됩니다.
- 각 기능은 별도의 함수로 구현됩니다.
- 함수의 기본 활용, 기본 매개변수, 람다, 제너레이터 등을 적절히 활용합니다.

## ✅ 과제 목록

### 🔹 [과제 1: 연락처 추가 함수 `add_contact`]
- **목표:** 사용자의 이름, 전화번호, 이메일 주소를 입력받아 주소록에 추가합니다.
- **설명:**
  - `name`: 이름을 나타내는 문자열입니다.
  - `phone`: 전화번호를 나타내는 문자열입니다.
  - `email`: 이메일 주소를 나타내는 문자열입니다. 기본값은 빈 문자열입니다.
  - 연락처 정보를 딕셔너리 형태로 생성하여 `address_book` 리스트에 추가합니다.
  - 추가된 연락처 정보를 출력합니다.

 

python

address_book = []

def add_contact(name: str, phone: str, email: str = '') -> None:
    contact = {
        'name': name,
        'phone': phone,
        'email': email
    }
    address_book.append(contact)
    print(f"[연락처 추가 완료] 이름: {name}, 전화번호: {phone}, 이메일: {email}")

 

### 🔹 [과제 2: 연락처 목록 보기 함수 `view_contacts`]
- **목표:** 저장된 모든 연락처의 정보를 화면에 출력합니다.
- **설명:**
  - `address_book` 리스트를 순회하며 각 연락처 정보를 출력합니다.
  - 주소록이 비어있을 경우, 이를 알리는 메시지를 출력합니다.

```python
def view_contacts() -> None:
    if not address_book:
        print("[주소록이 비어있습니다]")
    else:
        print("\n[현재 저장된 연락처 목록]")
        for contact in address_book:
            print(f"이름: {contact['name']}, 전화번호: {contact['phone']}, 이메일: {contact['email']}")


### 🔹 [과제 3: 연락처 검색 함수 `search_contacts`]
- **목표:** 사용자로부터 검색 키워드를 입력받아, 해당 키워드가 이름에 포함된 연락처 정보를 출력합니다.
- **설명:**
  - `keyword`: 검색 키워드를 나타내는 문자열입니다.
  - `address_book` 리스트를 순회하며, 이름에 키워드가 포함된 연락처를 찾아 출력합니다.
  - 검색 결과가 없을 경우, 이를 알리는 메시지를 출력합니다.

```python
def search_contacts(keyword: str) -> None:
    results = [contact for contact in address_book if keyword in contact['name']]
    
    if not results:
        print(f"[검색 결과 없음] 키워드 '{keyword}'로 검색된 연락처가 없습니다.")
    else:
        print(f"[검색 결과] 키워드 '{keyword}'로 검색된 연락처 목록:")
        for contact in results:
            print(f"이름: {contact['name']}, 전화번호: {contact['phone']}, 이메일: {contact['email']}")
```


### 🔹 [과제 4: 연락처 삭제 함수 `delete_contact`]
- **목표:** 사용자로부터 이름을 입력받아, 해당하는 연락처 정보를 주소록에서 삭제합니다.
- **설명:**
  - `name`: 삭제할 연락처의 이름을 나타내는 문자열입니다.
  - `address_book` 리스트에서 해당 이름을 가진 연락처를 제거합니다.
  - 이름은 대소문자 구분 없이 처리됩니다.
  - 삭제된 후의 주소록 상태를 출력합니다.

 

```python
def delete_contact(name: str) -> None:
    global address_book
    original_length = len(address_book)
    address_book = [contact for contact in address_book if contact['name'].lower() != name.lower()]

    if len(address_book) < original_length:
        print(f"[삭제 완료] 이름이 '{name}'인 연락처가 삭제되었습니다.")
    else:
        print(f"[삭제 실패] 이름이 '{name}'인 연락처가 존재하지 않습니다.")
    
    view_contacts()


### 🔹 [과제 5: 연락처 정렬 함수 `sort_contacts`]
- **목표:** 연락처 목록을 이름 순서로 정렬하여 출력합니다.
- **설명:**
  - `address_book` 리스트를 이름 순서로 정렬합니다.
  - 람다 함수를 사용하여 정렬 키를 지정합니다.
  - 정렬 후 정렬되었음을 알리는 메시지를 출력합니다.

 

```python
def sort_contacts() -> None:
    address_book.sort(key=lambda contact: contact['name'].lower())
    print("[정렬 완료] 이름 순으로 연락처가 정렬되었습니다.")
    view_contacts()
```



### 🔹 [과제 6: 제너레이터를 이용한 연락처 순회 함수 `contact_generator`]
- **목표:** 주소록에 저장된 연락처를 순회하는 제너레이터 함수를 구현합니다.
- **설명:**
  - `address_book` 리스트를 순회하며 각 연락처를 제너레이터로 반환합니다.
  - 제너레이터는 메모리를 효율적으로 사용하며, 순회 시마다 하나의 연락처를 반환합니다.

 

```python
def contact_generator():
    for contact in address_book:
        yield contact
```


### 🔹 [과제 7: 메인 함수 `main`]
- **목표:** 프로그램의 주요 로직을 실행합니다.
- **설명:**
  - 사용자에게 모드를 선택하도록 요청합니다.
  - "추가" 모드에서는 연락처를 추가하고, "보기" 모드에서는 연락처 목록을 출력하며, "검색" 모드에서는 연락처를 검색하고, "삭제" 모드에서는 연락처를 삭제하고, "정렬" 모드에서는 연락처를 정렬합니다.
  - 프로그램이 종료될 때까지 사용자 입력을 계속 받아들입니다.

 

# 주소록 데이터 저장을 위한 리스트
address_book = []

# 연락처 추가 함수
def add_contact(name: str, phone: str, email: str = '') -> None:
    contact = {
        'name': name,
        'phone': phone,
        'email': email
    }
    address_book.append(contact)
    print(f"[연락처 추가 완료] 이름: {name}, 전화번호: {phone}, 이메일: {email}")

# 연락처 목록 보기 함수
def view_contacts() -> None:
    if not address_book:
        print("[주소록이 비어있습니다]")
    else:
        print("\n[현재 저장된 연락처 목록]")
        for contact in address_book:
            print(f"이름: {contact['name']}, 전화번호: {contact['phone']}, 이메일: {contact['email']}")

# 연락처 검색 함수
def search_contacts(keyword: str) -> None:
    results = [contact for contact in address_book if keyword in contact['name']]
    
    if not results:
        print(f"[검색 결과 없음] 키워드 '{keyword}'로 검색된 연락처가 없습니다.")
    else:
        print(f"[검색 결과] 키워드 '{keyword}'로 검색된 연락처 목록:")
        for contact in results:
            print(f"이름: {contact['name']}, 전화번호: {contact['phone']}, 이메일: {contact['email']}")

# 연락처 삭제 함수
def delete_contact(name: str) -> None:
    global address_book
    original_length = len(address_book)
    address_book = [contact for contact in address_book if contact['name'].lower() != name.lower()]

    if len(address_book) < original_length:
        print(f"[삭제 완료] 이름이 '{name}'인 연락처가 삭제되었습니다.")
    else:
        print(f"[삭제 실패] 이름이 '{name}'인 연락처가 존재하지 않습니다.")
    
    view_contacts()

# 연락처 정렬 함수
def sort_contacts() -> None:
    address_book.sort(key=lambda contact: contact['name'].lower())
    print("[정렬 완료] 이름 순으로 연락처가 정렬되었습니다.")
    view_contacts()

# 제너레이터를 이용한 연락처 순회 함수
def contact_generator():
    for contact in address_book:
        yield contact

# 메인 함수
def main():
    while True:
        mode = input("\n[모드 선택] 추가, 보기, 검색, 삭제, 정렬, 종료 중 선택하세요: ").strip().lower()
        
        if mode == "추가":
            name = input("이름을 입력하세요: ")
            phone = input("전화번호를 입력하세요: ")
            email = input("이메일을 입력하세요 (선택): ")
            add_contact(name, phone, email)
        elif mode == "보기":
            view_contacts()
        elif mode == "검색":
            keyword = input("검색할 이름을 입력하세요: ")
            search_contacts(keyword)
        elif mode == "삭제":
            name = input("삭제할 이름을 입력하세요: ")
            delete_contact(name)
        elif mode == "정렬":
            sort_contacts()
        elif mode == "종료":
            print("[프로그램 종료]")
            break
        else:
            print("[오류] 잘못된 입력입니다. 다시 선택하세요.")

if __name__ == "__main__":
    main()