반응형
📌 객체 모델 다이어그램 설명 (Python 코드 구현)
주어진 객체 모델을 기반으로 학생(Student) 성적 관리 시스템을 Python으로 구현하겠습니다.
1. 객체 모델 분석
🔹 주요 클래스
- Student (Model - Entity)
- 학생의 이름, 점수, 총점, 평균을 관리하는 클래스
- 총점과 평균을 계산하는 메서드 포함
- StudentManage (Control)
- students 리스트를 관리하는 컨트롤러 역할
- 학생을 추가하고 출력하는 기능 포함
- StudentUI (View)
- 최대 학생 수(MAX) 정의
- 학생 추가 및 성적 테이블을 출력하는 기능 포함
2. Python 코드 구현
class Student:
"""학생 정보를 저장하는 엔티티 클래스 (Model)"""
def __init__(self, name, scores):
self.name = name
self.scores = scores.copy() # 원본 데이터 보호 (깊은 복사)
self.total_score = 0
self.average = 0.0
self.calculate_total()
self.calculate_average()
def calculate_total(self):
"""총점 계산"""
self.total_score = sum(self.scores)
def calculate_average(self):
"""평균 계산 (빈 리스트 예외 처리)"""
self.average = self.total_score / len(self.scores) if self.scores else 0
def __str__(self):
"""학생 정보를 포맷된 문자열로 반환"""
ret_str = f'{self.name:<10}'
for v in self.scores:
ret_str += f'{v:5}'
ret_str += f'{self.total_score:6}'
ret_str += f'{self.average:8.2f}'
return ret_str
class StudentManage:
"""학생 리스트를 관리하는 컨트롤러 클래스 (Control)"""
def __init__(self):
self.students = [] # 학생 객체 리스트
def append_student(self, student):
"""새로운 학생 추가"""
self.students.append(student)
def print_students(self):
"""학생 리스트를 반환"""
return self.students
class StudentUI:
"""학생 정보를 입력받고 출력하는 UI 클래스 (View)"""
MAX = 5 # 최대 학생 수
def __init__(self, manager):
self.manager = manager # StudentManage 인스턴스 연결
def append_student(self):
"""학생 정보를 입력받아 추가"""
if len(self.manager.students) >= self.MAX:
print("더 이상 학생을 추가할 수 없습니다!")
return
name = input("학생 이름 입력: ")
scores = []
for i in range(2): # 2개의 점수 입력
score = int(input(f"\t점수[{i+1}] 입력: "))
while score < 0 or score > 100:
print(f"\t\tError: 점수 범위는 0~100 입니다.")
score = int(input(f"\t점수[{i+1}] 입력: "))
scores.append(score)
student = Student(name, scores)
self.manager.append_student(student)
print("학생 정보가 추가되었습니다!")
def print_score_table(self):
"""학생 성적표 출력"""
print("\n=== 학생 성적표 ===")
print(f'{"이름":<10}{"점수1":5}{"점수2":5}{"총점":6}{"평균":8}')
print("-" * 35)
for student in self.manager.print_students():
print(student)
# 실행 코드
if __name__ == "__main__":
manager = StudentManage() # 컨트롤러 객체 생성
ui = StudentUI(manager) # UI 객체 생성
while True:
print("\n1. 학생 추가")
print("2. 성적표 출력")
print("3. 종료")
choice = input("선택: ")
if choice == "1":
ui.append_student()
elif choice == "2":
ui.print_score_table()
elif choice == "3":
print("프로그램 종료!")
break
else:
print("잘못된 입력입니다. 다시 선택하세요.")
3. 실행 예제
🔹 입력
1. 학생 추가
2. 성적표 출력
3. 종료
선택: 1
학생 이름 입력: 김철수
점수[1] 입력: 85
점수[2] 입력: 90
학생 정보가 추가되었습니다!
선택: 1
학생 이름 입력: 이영희
점수[1] 입력: 95
점수[2] 입력: 88
학생 정보가 추가되었습니다!
선택: 2
🔹 출력
=== 학생 성적표 ===
이름 점수1 점수2 총점 평균
-----------------------------------
김철수 85 90 175 87.50
이영희 95 88 183 91.50
4. 클래스 구조 정리
클래스 역할 주요 메서드
Student (Model) | 학생 정보 관리 | calculate_total(), calculate_average(), __str__() |
StudentManage (Control) | 학생 리스트 관리 | append_student(), print_students() |
StudentUI (View) | 사용자 입력 및 출력 | append_student(), print_score_table() |
5. 주요 개선점
- 객체 지향적 구조 적용
- Model-View-Control 구조를 활용하여 기능별로 클래스를 나눔
- Student (Model) → StudentManage (Control) → StudentUI (View)
- 입력 유효성 검사 추가
- 점수가 0~100 범위를 벗어나면 재입력 요청
- 최대 학생 수 제한 (MAX = 5) 적용
- 학생이 5명을 초과하면 더 이상 추가할 수 없도록 제한
🚀 결론
- 객체 지향적 설계를 적용하여 학생 성적 관리 프로그램을 만들었습니다.
- Model-View-Control을 분리하여 유지보수성 및 확장성이 뛰어난 구조로 개발하였습니다.
'십대를 위한 코딩 > 십대를 위한 파이썬' 카테고리의 다른 글
파이썬 딕셔너리(Dictionary) 메서드 정리 (0) | 2025.02.18 |
---|---|
딕셔너리의 .items() 메서드는 어떻게 생겼을까? (1) | 2025.02.17 |
파이썬의 내장형 클래스 쉽게 이해하기 (1) | 2025.02.15 |
파이썬 클래스의 캡슐화(Encapsulation) (1) | 2025.02.14 |
파이썬 셸(Python Shell, REPL)과 IDLE 에디터(IDLE, Integrated Development and Learning Environment) (1) | 2025.02.14 |