십대를 위한 코딩/십대를 위한 파이썬

객체 모델 다이어그램 설명 (Python 코드 구현)

forSilver 2025. 2. 15. 23:04
반응형

📌 객체 모델 다이어그램 설명 (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. 주요 개선점

  1. 객체 지향적 구조 적용
    • Model-View-Control 구조를 활용하여 기능별로 클래스를 나눔
    • Student (Model) → StudentManage (Control) → StudentUI (View)
  2. 입력 유효성 검사 추가
    • 점수가 0~100 범위를 벗어나면 재입력 요청
  3. 최대 학생 수 제한 (MAX = 5) 적용
    • 학생이 5명을 초과하면 더 이상 추가할 수 없도록 제한

🚀 결론

  • 객체 지향적 설계를 적용하여 학생 성적 관리 프로그램을 만들었습니다.
  • Model-View-Control을 분리하여 유지보수성 및 확장성이 뛰어난 구조로 개발하였습니다.