#python #anaconda #jupyter-notebook #visual-code #html #css #javascript #http 제목클래스에 대한 이해2020-06-13 16:45작성자주민하 학생아무래도 첫 코딩이라 절차적 프로그래밍도 이해하기 버거울텐데, 당장 개체지향적인 부분도 학습하기에는 힘들 것이라고 생각합니다.그렇기 때문에 클래스, 개체라는 것을 이해하기 위한 간단한 글을 작성합니다.한 번 직접 클래스를 구현해볼까요?흠... 뭐를 만들어볼까요?한 번 경희대학교 교수 / 직원 / 학생을 포함하는 인원관리 프로그램에 사용할 개체를 설계해볼까요?그렇다면 우선적으로 생각해야하는 것은, 이러한 인원들이 가질 "상태"와 "동작"입니다.우선 학생을 예를 들어 만들어볼까요?상태- 이름- 학번- 학년- 학적- 전공- 남은 휴학신청 가능 횟수- 트랙- 현 학기 수강 학점- 현 학기 수강목록동작- 수강신청- 휴학신청- 트랙신청- 학과신청순서대로 설명해보겠습니다.우선 상태입니다이름: 학생의 이름입니다학번: 학생을 구분하게 해주는 고유번호입니다.학년: 학생의 현재 학년입니다학적: 휴학 상태인지, 재학 상태인지를 나타냅니다전공: 주전공을 갖습니다남은 휴학기간: 남은 휴학신청 가능 횟수를 의미합니다. 휴학신청은 1회 1학기라고 가정합니다. 현 학기 수강 학점: 현 학기에 수강 가능한 학점이 몇 점인지를 의미합니다현 학기 수강 목록: 현 학기 수강 중인 과목들을 의미합니다이제 동작을 봅시다수강신청: 만약 재학 중이고, 수강 가능한 학점이 남아있다면 수강신청을 할 수 있습니다휴학신청: 만약 휴학 가능 횟수가 남아있다면, 현재 학기 휴학 신청을 할 수 있습니다.학과신청: 주전공을 신청할 수 있습니다실제로 구현을 하기 전에 제일 우선적으로 고려해야하는 것은 바로 "생성자"입니다.생성자라는 것은 말 그대로 한 개체를 생성하는 것으로, 생성하는 순간 그 개체는 유효해야합니다.즉,# main.py minha = Student() minha.name = "Minha, Ju" # 이름 minha.student_id = "2017103760" # 학번 minha.year = 2 # 학년 minha.is_attending = True # 재학 여부 minha.major = Major.SOFTWARE_CONVERGENCE # 전공 minha.remaining_school_break_terms = 6 # 남은 휴학 가능 학기 개수 minha.current_semester_remaining_credits = 18 # 이번 학기 남은 수강 가능 학점 만약 위와 같이 개체를 초기화해준다면, 새로운 개체를 만들 때마다 수정을 해줘야할 것입니다.나중에 만약 학교에서 부전공을 가능하게 만들어 전공은 이제 list로 만들거나, 따로 부전공이라는 상태를 추가해야한다면, 지금까지 코드에서 작성한 위의 코드를 전부 수정해야합니다.그 뿐만 아니라, 개체는 생성 그 순간부터 유효해야합니다.minha라는 개체가 생성 후에 "minha, ju"라는 이름과 2017103760라는 학번이 부여되는건 매우 이상합니다.그렇기 때문에 생성자를 만들어주어야겠죠?# Student.py class Student: def __init__(self, name, student_id, year): self.name = name self.student_id = student_id self.year = year self.is_attending = True self.major = None self.remaining_school_break_terms = 6 self.current_semester_remaining_credits = 18 # main.py minha = Student("Minha, Ju", "2017103760", 2) print("Name: {}\nStudent ID: {}\nYear: {}".format(minha.name, minha.student_id, minha.year)) print("Is Attending School?: {}\nMajor: {}".format(minha.is_attending, minha.major)) print("Remaining School Break Terms: {}".format(minha.remaining_school_break_terms)) print("Current Semester Remaining Credits: {}".format(minha.current_semester_remaining_credits)) Name: Minha, Ju Student ID: 2017103760 Year: 2 Is Attending School?: True Major: None Remaining School Break Terms: 6 Current Semester Remaining Credits: 18 위와 같이 결과가 나올 것입니다.그렇다면 이제 몇 가지 동작을 만들어주어야겠죠?# Student.py class Student: def __init__(self, name, student_id, year): self.name = name self.student_id = student_id self.year = year self.is_attending = True self.major = None self.remaining_school_break_terms = 6 self.current_semester_remaining_credits = 18 self.current_enrolling_courses = [] def sign_up_course(self, course): if (self.is_attending): # 재학 중일 때 if (self.current_semester_remaining_credits > course.credit # 학점이 남을 때 and course.student_count > 0 # 해당 교과목 인원이 남을 때 and course.available_year <= self.year): # 해당 교과목 수강 가능 학년일 때 self.current_semester_remaining_credits -= course.credit self.current_enrolling_courses.append(course) def take_school_break(self): if (self.is_attending): # 재학 중일 때 if (self.remaining_school_break_terms > 0): # 휴학 신청 가능 횟수가 남아있다면 self.remaining_school_break_terms -= 1 self.is_attending = False self.current_enrolling_courses.clear() self.current_semester_remaining_credits = 0 def apply_major(self, major): if (self.major == None and self.is_attending): # 현재 전공이 없으며 재학 중일 때 self.major = major # main.py minha = Student("Minha, Ju", "2017103760", 2) minha.take_school_break() if (minha.is_attending): print(minha.name + " is attending school!") else: print(minha.name + " is taking a school break!") minha.apply_major("SOFTWARE_CONVERGENCE") if (minha.major != None): print(minha.name + " is " + minha.major) else: print(minha.name + " has no major") Minha, Ju is taking a school break! Minha, Ju has no major 생각보다 매우 단순합니다.근데 여기서 교수 개체를 추가하려고 합니다교수 개체는 좀 단순하게,상태로는 이름과 학과를 갖고,동작으로는 학생 상담이 있다고 해보지요# Professor.py class Professor: def __init__(self, name, major): self.name = name self.major = major def consult_student(self, student): if (isinstance(student, Student)): if (student.major == self.major): print("Professor " + self.name + " consulted student " + student.name) # main.py minha = Student("Minha, Ju", "2017103760", 2) minha.apply_major("SOFTWARE_CONVERGENCE") sungwon = Professor("Sungwon, Lee", "SOFTWARE_CONVERGENCE") sungwon.consult_student(minha) Professor Sungwon, Lee consulted student Minha, Ju 매우 간단하죠?하지만 코드 자체에서 프로그래머로서 용납할 수 없는 부분이 있네요.바로 코드 중복입니다.이름과 학과는 둘 다 중복이 되는데, 이거를 굳이 서로 다른 두 개체 말고, 하나로 합치면 어떨까요? 그리고 각각 학생과 교수는 이 새롭게 합친 이 클래스를 상속받는거에요# Person.py class Person: def __init__(self, name, major=None): self.name = name self.major = major 이제 Person을 상속받은 Student와 Professor을 볼까요?# Student.py class Student(Person): def __init__(self, name, student_id, year): super().__init__(name) self.student_id = student_id self.year = year self.is_attending = True self.remaining_school_break_terms = 6 self.current_semester_remaining_credits = 18 self.current_enrolling_courses = [] ... # Professor.py class Professor(Person): def __init__(self, name, major): super().__init__(name, major) ... 어차피 실행 결과는 같습니다.개체 설계는 이런 과정으로 이루어집니다.상태와 동작을 파악하고해당 개체가 완전하게 만드는 생성자를 설계하고이에 알맞게 상태를 초기화해주고동작을 위의 상태들을 기반으로 작성해줍니다기타 질문 있으시면 언제나 환영합니다 목록수정삭제답변글쓰기 댓글 [17] 댓글작성자(*)비밀번호(*)내용(*) 댓글 등록 더보기이전기말 기출문제 코드 질문qwe2020-06-13다음기말 기출문제 질문qwe2020-06-13 Powered by MangBoard | 워드프레스 쇼핑몰 망보드