회고
- 클래스는 객체지향(편리함)을 추구한다. "내가 만든 코드는 객체지향적이었을까?" 라는 질문을 받는다면 내 대답은 "NO"다. 코드가 꼬인다. 생각을 하고 코드의 전체적인 흐름을 짜는 것은 어느정도 익숙해졌다. 그렇지만 쓰지를 못한다. 생각만 하는 것은 의미없다. 생각을 코드를 통해 표현할 수 있게 노력하자.
- 오늘 같은 클래스 친구를 통해 벨로그에서 파이썬 코드에 색깔을 넣을 수 있다고 들었다....... 하하하하 얼른 다 수정해야지.😂😂😂😂😂😂😂
필기
성적_클래스(김성재풀이)
- 클래스를 두개로 쪼개야 했는데 멍청하게 하나로 풀었다. 어찌어찌 풀긴했지만 객체지향이 아니라고 생각한다. 강사님 풀이를 보면서 클래스를 쪼개는것에 집중을 해야겠다.
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
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):
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()
def modify(self):
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):
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):
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):
cnt=1
while cnt<=3:
v = random.randint(0,9)
if v not in self.computer:
self.computer[cnt]=v
cnt +=1
def init_person(self):
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):
strike = 0
ball = 0
out = 0
for i in range(1, 4):
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):
flag = False
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.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의 사용에 유의하자.
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......]등으로 위에 함수를 한번에 모아놓고 인덱스에 맞게 출력해서 사용하셨다. 이게 더 간단한거 같지만 적지를 못하네 아오 진짜.
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 : 인덱스와 객체를 같이 가져올 수 있는 파이썬 기초 함수
- 아래의 내용을 참고하자.

class Worker():
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():
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):
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()