25. 05. 08 공부일지

behumble·2025년 5월 8일

공부일지

목록 보기
9/20

회고

  • 클래스는 객체지향(편리함)을 추구한다. "내가 만든 코드는 객체지향적이었을까?" 라는 질문을 받는다면 내 대답은 "NO"다. 코드가 꼬인다. 생각을 하고 코드의 전체적인 흐름을 짜는 것은 어느정도 익숙해졌다. 그렇지만 쓰지를 못한다. 생각만 하는 것은 의미없다. 생각을 코드를 통해 표현할 수 있게 노력하자.
  • 오늘 같은 클래스 친구를 통해 벨로그에서 파이썬 코드에 색깔을 넣을 수 있다고 들었다....... 하하하하 얼른 다 수정해야지.😂😂😂😂😂😂😂

필기

성적_클래스(김성재풀이)

  • 클래스를 두개로 쪼개야 했는데 멍청하게 하나로 풀었다. 어찌어찌 풀긴했지만 객체지향이 아니라고 생각한다. 강사님 풀이를 보면서 클래스를 쪼개는것에 집중을 해야겠다.
# 이름, 국어, 영어, 수학, 총점, 평균, 학점이 나오는 객체지향을 만들어라
# 입력 : 이름, 국어, 영어, 수학
# 계산 : 총점 = 국어 + 영어 + 수학, 평균 = 총점 / 3, 학점은 기준에 따라 분류
# 출력 : 이름, 국어, 영어, 수학, 총점, 평균, 학점(탭 사용)

class GradeProcessing:
    def __init__(self):
        self.studentList = []
        
    def input(self): #입력
        name = input("이름 : ")
        while True:
            kor = int(input("국어 : "))
            if kor > 100 or kor < 0:
                print("0~100사이의 숫자로 입력하세요")
                continue
            eng = int(input("영어 : "))
            if eng > 100 or eng < 0:
                print("0~100사이의 숫자로 입력하세요")
                continue
            math = int(input("수학 : "))
            if math > 100 or math < 0:
                print("0~100사이의 숫자로 입력하세요")
                continue
            break
        return {"name" : name, "kor" : kor, "eng" : eng, "math" : math}
        
    def cal_total(self, student): #총점계산
        total = student["kor"] + student["eng"] + student["math"]
        return total
    
    def cal_avg(self, total):
        avg = total / 3
        return avg
        
    def grade_check(self, avg): #등급체크
        if avg >= 90:
            grade = "A"
        elif avg >= 80:
            grade = "B"
        elif avg >= 70:
            grade = "C"
        else:
            grade = "D, 재시험요망"
        return grade
    
    def processStart(self):
        print("성적처리 프로그램을 실행합니다.")
        
        while True:
            student = self.input()
            total = self.cal_total(student)
            avg = self.cal_avg(total)
            grade = self.grade_check(avg)
            
            student["total"] = total
            student["avg"] = avg
            student["grade"] = grade
            
            self.studentList.append(student)
            
            print(f"이름 : {student['name']}, 총점 : {student['total']}, 평균 : {student['avg']}, 학점 : {student['grade']}")
            
            keepGoing = input("계속하시려면 y, 종료하시려면 n을 눌러주세요. ").lower()
            if keepGoing == "y":
                continue
            else:
                keepGoing == "n"
                break
        
        print("전체학생의 성적은 아래와 같습니다.")
        for stu in self.studentList:
            print(f"이름 : {stu["name"]}", end = "\t")
            print(f"국어 : {stu["kor"]}", end = "\t")
            print(f"영어 : {stu["eng"]}", end = "\t")
            print(f"수학 : {stu["math"]}", end = "\t")
            print(f"총점 : {stu["total"]}", end = "\t")
            print(f"평균 : {stu["avg"]}", end = "\t")
            print(f"학점 : {stu["grade"]}")
            
        print("시험보느라 고생했습니다.")
        
g = GradeProcessing()
g.processStart()

성적_클래스(백현숙강사님풀이)

ScoreData1

#한사람 정보 - 데이터베이스 레코드 하나
#파이썬의 경우는 파일명과 클래스명은 아무 관계없다.
class ScoreData:
    def __init__(self, name = "홍길동", kor = 100, eng = 100, mat = 100):
        self.name = name
        self.kor = kor
        self.eng = eng
        self.mat = mat
        self.process()
         
    def process(self):
        self.total = self.kor + self.eng + self.mat
        self.avg = self.total / 3
        if self.avg >= 90:
            self.grade = "수"
        elif self.avg >= 80:
            self.grade = "우"
        elif self.avg >= 70:
            self.grade = "미"
        elif self.avg >= 60:
            self.grade = "양"
        else:
            self.grade = "가"
            
    def print(self):
        print(f"이름 : {self.name}", end = "\t")
        print(f"국어 : {self.kor}", end = "\t")
        print(f"영어 : {self.eng}", end = "\t")
        print(f"수학 : {self.mat}", end = "\t")
        print(f"총점 : {self.total}", end = "\t")
        print(f"평균 : {self.avg:.2f}", end = "\t")
        print(f"학점 : {self.grade}", end = "\n")
        
if __name__ == "__main__":
    s = ScoreData()
    s.print() 

ScoreData2

  • fucList에 함수를 담아 사용하는 법을 통해 함수의 길이를 줄일 수 있다.
from ScoreData1 import ScoreData
#ScoreData.py 파일에서 ScoreData 클래스를 가져와라 

class ScoreManager:
    def __init__(self): #생성자-파이썬에서는 변수도 만들고 
                        #첫 시작시 준비작업 
        self.scoreList = [
            ScoreData(),
            ScoreData("조승연", 90, 80, 90),
            ScoreData("안세영", 80, 80, 70),
            ScoreData("김연경", 90, 90, 90),
            ScoreData("김연아", 100, 80, 100)
        ]
    
    def printAll(self):
        for s in self.scoreList:
            s.print()

    def menuDisplay(self):
        print("--------")
        print("  메뉴   ")
        print("--------")
        print("1. 추가  ")
        print("2. 출력  ")
        print("3. 검색  ") #이름
        print("4. 수정  ") #이름
        print("5. 삭제  ") #이름
        print("6. 정렬  ") #총점 내림차순으로 
        print("0. 종료  ")
        print("--------")
        
    def append(self):
        sc =  ScoreData() #객체 생성 
        sc.name = input("이름 : ")
        sc.kor = int(input("국어 : "))
        sc.eng = int(input("영어 : "))
        sc.mat = int(input("수학 : "))
        sc.process()
        self.scoreList.append(sc)
        
    def search(self): #3. 검색
        name = input("찾는 이름 : ")
        #filter는 두번째 매개변수로 전달된= list를 받아서 첫번째 매개변수로 전달된 함수를 호출한다.
        #lambda 매개변수 하나(scoreList에 저장된 객체 하나), 반환은 True 또는 Flase
        resultList = list(filter(lambda x : name in x.name, self.scoreList))
        if len(resultList) == 0:
            print("찾는 이름이 없습니다.")
            return
        
        #enumerate 함수가 list를 전달하면 index와 객체 tuple을 반환
        for i, s in enumerate(resultList):
            print(f"[{i}]", end = " ")
            s.print()
    
    def modify(self): #4. 수정
        name = input("찾는 이름 : ")
        resultList = list(filter(lambda x : name in x.name, self.scoreList))
        if len(resultList) == 0:
            print("찾는 이름이 없습니다.")
            return

        for i, s in enumerate(resultList):
            print(f"[{i}]", end = " ")
            s.print()
        sel = int(input("수정할 대상은(번호) : "))
        item = resultList[sel]
        item.name = input("이름 : ")
        item.kor = int(input("국어 : "))
        item.eng = int(input("영어 : "))
        item.mat = int(input("수학 : "))
        item.process() #다시 계산하기
            
    def remove(self): #5. 삭제
        name = input("찾는 이름 : ")
        resultList = list(filter(lambda x : name in x.name, self.scoreList))
        if len(resultList) == 0:
            print("찾는 이름이 없습니다.")
            return
        for i, s in enumerate(resultList):
            print(f"[{i}]", end = " ")
            s.print()
        sel = int(input("삭제대상(번호) : "))
        self.scoreList.remove(resultList[sel])
    
    def sort(self): #6. 정렬
        #원본은 내비두고 정렬한 결과만 출력하기
        #key에 전달해야하는 람다는 매개변수하나 반환값, 정렬을 할 수 있는 데이터타입
        #>,< 연산이 가능하다.
        resultList = sorted(self.scoreList, key = lambda item : item.total, reverse = True)
        for i in resultList:
            i.print()
            
    def start(self):
        #함수주소를 배열에 저장하고 호출함
        funcList =[None, self.append, self.printAll, self.search, self.modify, self.remove, self.sort]    
        while True:
            self.menuDisplay()
            choice = int(input("선택 : "))
            if choice > 0 and choice < len(funcList):
                funcList[choice]()
            elif choice == 0:
                return print("프로그램을 종료합니다.")
            else:
                print("잘못된 메뉴입니다.")


if __name__ =="__main__":
    sm = ScoreManager()
    sm.start()

야구_클래스(백현숙강사님풀이)

GameData

import random 

class Baseball:
    def __init__(self):
        self.computer = [-1, -1, -1, -1] #아무값도 없다를 리스트로 표현 
        self.person = [-1, -1, -1, -1] #아무값도 없다를 리스트로 표현
        self.count=0 #몇번했는지를 저장하기 위한 변수 
        self.personList=[]
    
    def init_computer(self): #컴퓨터 랜덤 숫자 3개 생성, 중복불가
        cnt=1 
        while cnt<=3:
            v = random.randint(0,9)
            if v not in self.computer:# self.computer에서 v의 중복여부 확인
                self.computer[cnt]=v 
                cnt +=1
          
    def init_person(self): #사람 숫자 입력해서 split으로 리스트로 형태 변경
        s = input("숫자 3개(0~9사이의)를 입력하세요(예시 0 1 2)")
        numberList = s.strip().split(" ")
        self.person[1] = int( numberList[0])
        self.person[2] = int( numberList[1])
        self.person[3] = int( numberList[2])

    def getResult(self): #스트라이크, 볼, out개수
        strike = 0
        ball = 0
        out = 0

        for i in range(1, 4): #스트라이크, 볼, out 판단단
            if self.person[i] in self.computer :
                if self.computer[i] == self.person[i]:
                    strike+=1
                else:
                    ball+=1  
            else:
                out+=1
        return strike, ball, out

    def start(self): #3strike 이거나 5번의 기회를 다 사용했을 경우에 종료한다 
        flag = False #아직 3strike가 아님을 나타내기위한 변수 
        self.init_computer()
        print(self.computer) 
        while  flag==False and self.count<=5:
            self.init_person()
            strike, ball, out = self.getResult()
            print(f"strike:{strike} bal:{ball} out:{out}")
            self.personList.append( 
                 {"person":[x for x in self.person], 
                "strike":strike, "ball":ball, "out":out})
            if strike == 3:
                flag = True 
            self.count+=1


if __name__ == "__main__":
    b = Baseball()
    # b.init_computer()
    # b.init_person()
    # print(b.computer)
    # print(b.person)
    # print(b.getResult())    
    b.start()

GameMain

from GameData import Baseball

class GameMain:
    def __init__(self):
        self.gameList = []
    
    def start(self):
        while True:
            print("1.게임시작")
            print("2.통계")
            print("0.종료")
            sel = input("선택 : ")
            if sel =="1":
                self.gamestart() 
            elif sel=="2":
                self.showStatistics()
            else:
                return 
            
    def gamestart(self):
        b = Baseball()
        b.start() 
        self.gameList.append(b)
    
    def showStatistics(self): #통계계
        for b in self.gameList:
            print(b.computer)
            for item in b.personList:
                print(item["person"], item["strike"], 
                       item["ball"], item["out"], b.count)


if __name__ == "__main__":
    g = GameMain()
    g.start()

복습

gpt를 이용한 유사예제

학생 출결 관리_객체지향

  • Student와 StudentManager의 클래스에 어떤 함수를 넣을지에 대한 부분에서 많이 헤맸다. 기초적인 클래스를 하나만들고, 그 위에 얹는 느낌..?으로 클래스를 만들어봐야겠다.
  • search, remove 함수를 계속 못만들고있다. filter와 lambda의 사용에 유의하자.
# 🔹 요구사항
# 학생 이름과 출석 일수를 입력받는다.
# 출석 일수가 15일 이상이면 "개근", 10일 이상이면 "양호", 그 외는 "주의"로 표시한다.
# 학생 정보를 추가, 검색, 삭제, 전체 출력할 수 있다.

class Student:
    def __init__(self, name, come):
        self.name = name
        self.come = come
        self.grade = self.check_grade()
        
    def check_grade(self):
        if self.come >= 15:
            return "개근"
        elif self.come >= 10:
            return "양호"
        else:
            return "주의"

    def print_info(self):
        print(f"{self.name}, {self.come}, {self.grade}")
        
class StudentManager:
    
    def __init__(self):  
        self.studentList = []
    
    def append(self): # 이름, 출석일수 입력, 개근정도 판단
        name = input("이름 : ")
        come = int(input("출석 일수 : "))
        student = Student(name, come)
        self.studentList.append(student)
        
    def search(self): # 검색
        name = input("찾는 이름 : ")
        resultList = list(filter(lambda item : name in item.name, self.studentList))
        if resultList == 0:
            print("찾는 이름이 없습니다.")
        for i, s in enumerate(resultList):
            print({i}, end = "\t")
            s.print_info()

    def remove(self): # 삭제
        name = input("찾는 이름 : ")
        resultList = list(filter(lambda item : name in item.name, self.studentList))
        if resultList == 0:
            print("찾는 이름이 없습니다.")
        for i, s in enumerate(resultList):
            print({i}, end = "\t")
            s.print_info()
        sel = int(input("삭제할 인덱스 번호를 입력 : "))
        self.studentList.remove(resultList[sel])
    
    def printAll(self): # 출력
        if not self.studentList:
            print("출력값이 없습니다.")
        else:
            for s in self.studentList:
                s.print_info()
    
    def start(self):
        while True:
            print("1. 추가")
            print("2. 검색")
            print("3. 제거")
            print("4. 출력")
            print("0. 종료")
            sel = int(input("0~4중 하나의 숫자를 입력하세요 : "))
            if sel == 1:
                self.append()
            elif sel == 2:
                self.search()
            elif sel == 3:
                self.remove()
            elif sel == 4:
                self.printAll()
            else:
                break
        print("프로그램을 종료합니다.")
            
    
if __name__ == "__main__":
    smg = StudentManager()
    smg.start()

도서 관리 프로그램_객체지향

  • start 함수가 너무 길다. 비슷한 문제를 참고해보니, 강사님은 myfunc = [None, self.add_book......]등으로 위에 함수를 한번에 모아놓고 인덱스에 맞게 출력해서 사용하셨다. 이게 더 간단한거 같지만 적지를 못하네 아오 진짜.
# 요구사항
# BookManager 클래스와 Book 클래스를 만들어서 도서 정보를 추가/출력/검색/삭제할 수 있게 하세요.
# 🎯 기능 설명:

# Book 클래스
# 속성: 제목, 저자, 가격
# 메서드: 도서 정보 출력 (print_info)

# BookManager 클래스
# book_list: Book 객체들을 저장할 리스트
# add_book(): 도서 1권 정보 입력받아 리스트에 추가
# print_all(): 등록된 모든 도서 출력
# search_book(): 제목으로 도서 검색
# delete_book(): 제목으로 도서 삭제
# start(): 메뉴를 반복 출력하며 사용자의 선택 처리

class Book:
    def __init__(self, title, writer, price):
        self.title = title
        self.writer = writer
        self.price = price
        
    def print_info(self):
        print(f"{self.title}", end = " "),
        print(f"{self.writer}", end = " "),
        print(f"{self.price}", end = "\n")
        
class BookManager:
    def __init__(self): # 생성자
        self.bookList = []
    
    def add_book(self): # 추가
        title = input("제목 : ")
        writer = input("저자 : ")
        price = int(input("가격 : "))
        book = Book(title, writer, price)
        self.bookList.append(book)
    
    def search_book(self): # 검색
        title = input("검색할 책 제목 : ")
        resultList = list(filter(lambda item : title in item.title, self.bookList))
        if len(resultList) == 0:
            print("제목이 없습니다.")
        for i, t in enumerate(resultList):
            print(f"[{i}]", end = "\t")
            t.print_info()
            
    def delete_book(self): # 삭제
        title = input("검색할 책 제목 : ")
        resultList = list(filter(lambda item : title in item.title, self.bookList))
        if len(resultList) == 0:
            print("제목이 없습니다.")
        for i, t in enumerate(resultList):
            print(f"[{i}]", end = "\t")
            t.print_info()
            
        sel = int(input("검색할 인덱스 번호를 선택하세요 : "))
        item = resultList[sel]
        item.title = input("수정할 제목 : ")
        item.writer = input("수정할 저자 : ")
        item.price = input("수정할 가격 : ")
        self.bookList.append(item)
        
    def printAll(self): # 전체 출력
        for t in self.bookList:
            t.print_info()

    def start(self): #메뉴 반복하며 선택
        while True:
            print("1. 추가 ")
            print("2. 검색 ")
            print("3. 삭제 ")
            print("4. 출력")
            print("0. 종료")
            sel = int(input("해당되는 숫자를 입력하세요 : "))
            if sel == 1:
                self.add_book()
            elif sel == 2:
                self.search_book()
            elif sel == 3:
                self.delete_book()
            elif sel == 4:
                self.printAll()
            else:
                sel == 0
                return print("프로그램을 종료합니다.")
            
if __name__ == "__main__":
    bm = BookManager()
    bm.start()

직원 근태 및 급여_객체지향

  • enumerate : 인덱스와 객체를 같이 가져올 수 있는 파이썬 기초 함수
  • 아래의 내용을 참고하자.
# ✅ 객체지향 문제: "직원 근태 및 급여 계산 프로그램"
# 문제 설명:
# 회사의 직원들에 대해 출근일 수와 하루 급여를 입력받아 월급 총액을 계산하고, 
# 근태 기준에 따라 등급을 부여하는 프로그램을 객체지향 방식으로 작성하시오.
# 💡 요구사항
# 입력 메서드에서 이름, 출근일 수, 하루 급여를 입력받는다.
# 총급여는 출근일 × 하루 급여로 계산한다.
# 출근일 수에 따라 등급을 부여한다:
# 출근일이 20일 이상: "우수"
# 15일 이상 20일 미만: "양호"
# 15일 미만: "주의"
# 여러 명의 직원을 입력할 수 있게 한다.
# 각 직원의 이름, 총급여, 근태등급을 출력한다.

# 출력 결과
# 직원 이름: 김철수, 총급여: 2,000,000원, 근태 등급: 우수
# 직원 이름: 이영희, 총급여: 1,350,000원, 근태 등급: 양호

class Worker(): # 1. 생성자를 지정, 2. 1명 계산, 1명 출력을 만들기
    def __init__(self, name, work_day, day_pay):
        self.name = name
        self.work_day = work_day
        self.day_pay = day_pay
        self.process()
        self.workerList = []
    
    def process(self): #총급여, 출근일에 따른 등급 계산
        self.total = self.work_day * self.day_pay

        if self.work_day >= 20:
            self.grade =  "우수"
        elif self.work_day >=15:
            self.grade = "양호"
        else:
            self.work_day >= 15
            self.grade = "주의"

    def print(self): #출력함수 / 이름, 총급여, 근태등급 출력
        print(f"직원이름: {self.name}, 총급여: {self.total}원, 근태 등급: {self.grade}")
        
class WorkerManager(): #2. 생성자에 리스트를 만들어서, 2.여러명 계산할 수 있게 세팅(입력, 출력, 검색, 수정, 제거, 종료 등)
    def __init__(self):
        self.workerList = []
        
    def append(self):
        name = input("이름 : ")
        work_day = int(input("출근일 : "))
        day_pay = int(input("일급 : "))
        worker = Worker(name, work_day, day_pay)
        self.workerList.append(worker)
        
    def search(self): #검색함수, filter와 lambda를 활용, 리스트로 마지막에 감싸주기
        name = input("찾는이름은 : ")
        resultList = list(filter(lambda item : name in item.name, self.workerList))
        if resultList == 0:
            print("찾는 이름이 없습니다.")
        
        for i, w in enumerate(resultList):
            print(f"[{i}]", end = " ")
            w.print()
    
    def modify(self): #수정함수, 입력함수를 그대로 가져와서 수정할 내용만 추가작성
        name = input("찾는이름은 : ")
        resultList = list(filter(lambda x : name in x.name, self.workerList))
        if resultList == 0:
            print("찾는 이름이 없습니다.")
        
        for i, w in enumerate(resultList):
            print(f"[{i}]", end = " ")
            w.print()
        
        sel = int(input("수정할 대상은(번호) : "))
        item = resultList[sel]
        item.name = input("이름 : ")
        item.work_day = int(input("출근일 : "))
        item.day_pay = int(input("일급 : "))
        item.process()
    
    def remove(self): #제거함수, 입력함수를 그대로 가져와 제거할 내용만 추가작성
        name = input("찾는이름은 : ")
        resultList = list(filter(lambda x : name in x.name, self.workerList))
        if resultList == 0:
            print("찾는 이름이 없습니다.")
        
        for i, w in enumerate(resultList):
            print(f"[{i}]", end = " ")
            w.print()
        
        sel = int(input("삭제할 대상(번호) : "))
        self.workerList.remove(resultList[sel])
        
    def printAll(self):
        for w in self.workerList:
            w.print()
            
    def start(self):
        funcList = [None, self.append, self.printAll, self.search, self.modify, self.remove]
        while True:
            print("1. 입력")
            print("2. 출력")
            print("3. 검색")
            print("4. 수정")
            print("5. 제거")
            print("0. 종료")
            sel = int(input("숫자를 입력하세요 : "))
            if sel > 0 and sel < len(funcList):
                funcList[sel]()
            elif sel == 0:
                print("프로그램을 종료합니다.")
                break
            else:
                print("잘못된 메뉴입니다.")
        
                 
if __name__ == "__main__":
    wm = WorkerManager()
    wm.start()

0개의 댓글