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

2025. 3. 14. 00:34·Python

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

## ✅ 프로젝트 개요

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

**기능:**
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()

'Python' 카테고리의 다른 글

PYTHON - 예외처리와 모듈 (Chapter 7-34. try except 구문)  (0) 2025.03.14
PYTHON - 예외처리와 모듈 (Chapter 7-1. 오류 종류와 기본 예외 처리)  (0) 2025.03.14
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) 심화 문제풀이  (0) 2025.03.13
📌 Python 학습 과정 – 이해와 반복의 중요성  (0) 2025.03.13
✅ 개발자로서 실력을 향상시키는 방법 (함수와 내장 함수 활용)  (0) 2025.03.13
'Python' 카테고리의 다른 글
  • PYTHON - 예외처리와 모듈 (Chapter 7-34. try except 구문)
  • PYTHON - 예외처리와 모듈 (Chapter 7-1. 오류 종류와 기본 예외 처리)
  • [[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) 심화 문제풀이
  • 📌 Python 학습 과정 – 이해와 반복의 중요성
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (758) N
      • Python (32)
      • 프로젝트 (82) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chinanightlife
    btsreunion
    gpterror
    self-growth
    classaction
    youngprofessionals
    life reflection
    RM
    chatgpterror
    smartphonedurability
    뷔
    homebartrend
    btsjungkook
    btsdischarge
    americaparty
    lawsuitculture
    titaniumcase
    basalcellcarcinoma
    trumpmuskclash
    newpoliticalparty
    bts
    college reunions
    global politics
    livebroadcast
    remittance
    urbantrends
    hotcoffeecase
    travel ban
    btscomeback
    americanlaw
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
프로젝트: 간단한 주소록 관리 시스템
상단으로

티스토리툴바