핵심 키워드
- class
- instance
- inheritance
학습 요약
- 클래스는 딥러닝 프로그램을 작성할 때 자주 사용된다.
- 클래스: 붕어빵 틀에 비유할 수 있다.
- 인스턴스: 붕어빵 틀에서 생성된 붕어빵에 비유할 수 있다.
- 간단히 사람(human)에 대한 정보를 담는 사람 클래스를 정의해 보자.
- 프로그램 내에서 두 명의 사람을 처리한다면?
- 각 사람은 나이(age)가 다를 수 있다.
class Human:
def __init__(self):
self.age = 0
def old(self):
self.age += 1
human1 = Human() # 사람 인스턴스 생성
human2 = Human() # 사람 인스턴스 생성
for i in range(10): # 10세
human1.old()
for i in range(20): # 20세
human2.old()
# 각 사람의 나이 출력
print(human1.age)
print(human2.age)
- 클래스(class)는 여러 정보를 하나의 객체에 담을 때 사용할 수 있다.
- 학생 관리 프로그램을 만들 때, 학생에 대한 정보는 다양하다.
- ① 학번, ② 이름, ③ 나이, ④ 성별, ⑤ 학과
- 학생 인스턴스를 생성함과 동시에 정보를 초기화할 수 있다.
- 생성자: 인스턴스가 생성될 때 자동으로 실행되는 init() 메서드를 의미한다.
- self는 인스턴스(instance) 자기 자신을 의미한다.
- 해당 인스턴스가 가지는 값과 함수의 인자 값을 구분하여 이해해야 한다.
- init() 함수 내부를 고려해 보자.
- self.name: 현재 인스턴스의 name 변수
- name: 함수의 파라미터로 넘어 온 name 변수
class Student:
def __init__(self, id, name, age, gender, department):
self.id = id
self.name = name
self.age = age
self.gender = gender
self.department = department
def show(self):
print("===== 학생 정보 =====")
print(f"학번: {self.id}")
print(f"이름: {self.name}")
print(f"나이: {self.age}")
print(f"성별: {self.gender}")
print(f"학과: {self.department}")
def add_age(self, offset):
self.age += offset
student1 = Student("20200001", "홍길동", 20, "남성", "컴퓨터공학과")
student2 = Student("20200002", "김순자", 21, "여성", "산업디자인공학과")
student3 = Student("20200003", "임꺽정", 23, "남성", "환경공학과")
student1.show()
student2.show()
student3.show()
- 각 인스턴스의 인스턴스 변수는 서로 다르다.
- 특정한 클래스(class)의 모든 인스턴스끼리 공유되는 정보가 필요하다면?
- 클래스 변수: 해당 클래스에서 전체적으로 공유되는 변수
- Client의 클래스 변수는 Client 클래스의 네임스페이스에 존재한다.
- 인스턴스 변수: 구체적인 하나의 인스턴스에서 사용되는 변수
- client1의 인스턴스 변수는 client1 인스턴스의 네임스페이스에 존재한다.
class Client:
client_cnt = 0
def __init__(self, id, name, age, gender, point):
self.id = id
self.name = name
self.age = age
self.gender = gender
self.point = point
Client.client_cnt += 1
def show(self):
print("===== 고객 정보 =====")
print(f"고객 번호: {self.id}")
print(f"이름: {self.name}")
print(f"나이: {self.age}")
print(f"성별: {self.gender}")
print(f"고객 점수: {self.point}")
print(f"현재 총 고객 수: {Client.client_cnt}")
def __del__(self):
Client.client_cnt -= 1
client1 = Client(1, "홍길동", 20, "남성", 1200)
client2 = Client(2, "김순자", 21, "여성", 300)
client3 = Client(3, "임꺽정", 23, "남성", 700)
client1.show()
client2.show()
client3.show()
print(f"[결과] 현재 총 고객 수: {Client.client_cnt}")
- 클래스의 **상속(inheritance)**은 체계적인 프로그램 개발을 위해 필요하다.
- 예를 들어 학교 관리 프로그램에서는 선생님(teacher)과 학생(student)에 대한 정보가 모두 활용된다.
- 이들은 공통적으로 이름(name), 나이(age) 등의 정보를 가지고 있다.
- 또한, 인적사항 정보를 출력하는 메서드를 둘 다 사용한다.
- 상속을 사용하여, 공통적으로 사용되는 변수를 매번 선언하지 않는다.
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def show_human(self):
print("===== 인적 사항 =====")
print(f"이름: {self.name}")
print(f"나이: {self.age}")
- 교사 클래스가 사람 클래스에 대한 정보를 상속 받기 위해서는 상속을 진행해야 한다.
- 기본적인 형식은 바로 다음과 같다.
class 자식 클래스 이름(부모 클래스 이름):
pass
- **super()**는 부모 클래스의 속성 및 메서드를 가져와야 할 때 사용할 수 있다.
- super.init() 메서드를 호출하면, 이것은 부모 클래스에서 정의되어 있던 생성자를 사용한다는 의미다.
class Teacher(Human):
def __init__(self, name, age, teacher_id, subject, salary):
super().__init__(name, age)
self.teacher_id = teacher_id
self.subject = subject
self.salary = salary
def show_teacher(self):
print("===== 교직원 카드 =====")
print(f"교직원 번호: {self.teacher_id}")
print(f"담당 과목: {self.subject}")
print(f"월급: {self.salary}")
teacher = Teacher("김순자", 40, 1, "사회", 450)
teacher.show_human()
teacher.show_teacher()
class Student(Human):
def __init__(self, name, age, student_id, grade, score):
super().__init__(name, age)
self.student_id = student_id
self.grade = grade
self.score = score
def show_student(self):
print("===== 학생 카드 =====")
print(f"학생 번호: {self.student_id}")
print(f"학년: {self.grade}")
print(f"점수: {self.score}")
student = Student("홍길동", 18, 1, 2, 95)
student.show_human()
student.show_student()
'AI > python' 카테고리의 다른 글
Series 51~130 문제 연습 (2) | 2024.10.25 |
---|---|
numpy 1~50 문제 연습 (0) | 2024.10.24 |