# 📚 간단한 주소록 관리 시스템
## ✅ 프로젝트 개요
**목표:**
- 사용자로부터 연락처 정보를 입력받아 관리하고, 원하는 조건에 따라 연락처를 검색할 수 있는 간단한 주소록 관리 시스템을 구현합니다.
**기능:**
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 |