추가: by 변, 강, 윤, 권, 나도
예시를 통해 이해해보자.
클래스(class) : 추상화
된 어떤 타입, 개념
객체(object, 오브젝트) : 클래스를 기반으로 만들어진 특정 대상
속성
과 기능
으로 구성된다. 속성(attribute | 멤버변수) : 객체를 나타내는(or 표현되는) 특징
변수
(매개변수)를 통해 생성메서드(method, 기능, 행동, 동작 | 메소드, 메쏘드 | 함수, 클래스 함수, 멤버함수, 인스턴스 함수) : 클래스가 가지는 함수
, 클래스(또는 클래스의 객체)가 행하는 행동
함수
를 사용하여 만듬생성자(constructor) : 생성자는 객체 지향 프로그래밍에서 객체의 초기화를 담당하는 서브루틴을 가리킨다. 생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고, 필요에 따라 자원을 할당하기도 한다. 객체의 생성 시에 호출되기 때문에 생성자라는 이름이 붙었다.
생성자 함수(__init__) :클래스 이름과 같은 함수, 클래스 내부에 __init__
이라는 함수(def)를 만들어 사용
추상화(abstraction) :프로그램에서 필요한 요소만 사용해서 객체를 표현하는 것
객체를 이용한 프로그램으로, 객체는
속성
과기능
으로 구성된다.
변수
) 와 데이터를 다루는 연산(함수
)를 하나로 캡슐화(encapsulation)하여 클래스로 표현메서드를 만드는 법 (생성자를 선언하는 방법과 동일하다)
class 클래스 이름:
def 메서드 이름(self, 추가적인 매개변수):
pass
자기자신
을 나타내는 딕셔너리, 식별자
)class Car:
def __init__(self, color, length):
self.color = color
self.length = length
def doStop(self):
print('STOP!!')
def doStart(self):
print('START!!')
def printCarInfo(self):
print(f'color: {self.color}')
print(f'length: {self.length}')
car1 = Car('red', 200)
car2 = Car('blue', 300)
car1.printCarInfo()
car2.printCarInfo()
class AirPlane:
def __init__(self, color, length, weight):
self.color = color
self.length = length
self.weight = weight
def takeOff(self):
print('take-off')
def landing(self):
print('landing')
def printAriPlaneInfo(self):
print(f'color: {self.color}')
print(f'length: {self.length}')
print(f'weight: {self.weight}')
airPlane1 = AirPlane('red', 200, 2000)
airPlane2 = AirPlane('blue', 150, 2200)
airPlane3 = AirPlane('green', 180, 2100)
airPlane4 = AirPlane('white', 220, 1900)
airPlane5 = AirPlane('black', 210, 2300)
airPlane1.printAriPlaneInfo()
airPlane2.printAriPlaneInfo()
airPlane3.printAriPlaneInfo()
airPlane4.printAriPlaneInfo()
airPlane5.printAriPlaneInfo()
class NewGenerationPC:
def __init__(self, name, cpu, memory, ssd):
self.name = name
self.cpu = cpu
self.memory = memory
self.ssd = ssd
def doExcel(self):
print('EXCEL RUN!!')
def doPhotoshop(self):
print('PHOTOSHOP RUN!!')
def printPCInfo(self):
print(f'name: {self.name}')
print(f'cpu: {self.cpu}')
print(f'memory: {self.memory}')
print(f'ssd: {self.ssd}')
myPc = NewGenerationPC('myPC', 'i5', '16G', '256G')
friendPc = NewGenerationPC('friendPC', 'i7', '32G', '512G')
myPc.printPCInfo()
friendPc.printPCInfo()
myPc.cpu = 'i9'
myPc.memory = '64G'
myPc.ssd = '1T'
myPc.printPCInfo()
friendPc.printPCInfo()
계산기 클래스를 만들고 사칙연산을 실행해 보자.
class Calculator:
def __init__(self):
self.number1 = 0
self.number2 = 0
self.result = 0
def add(self):
self.result = self.number1 + self.number2
return self.result
def sub(self):
self.result = self.number1 - self.number2
return self.result
def mul(self):
self.result = self.number1 * self.number2
return self.result
def div(self):
self.result = self.number1 / self.number2
return self.result
calculator = Calculator()
calculator.number1 = 10
calculator.number2 = 20
print(f'calculator.add(): {calculator.add()}')
print(f'calculator.sub(): {calculator.sub()}')
print(f'calculator.mul(): {calculator.mul()}')
print(f'calculator.div(): {calculator.div()}')
calculator.number1 = 3
calculator.number2 = 5
print(f'calculator.add(): {calculator.add()}')
print(f'calculator.sub(): {calculator.sub()}')
print(f'calculator.mul(): {calculator.mul()}')
print(f'calculator.div(): {calculator.div()}')
객체 생성에 대해서 좀 더 자세히 살펴보자!
__init__
이라는 함수(def)를 만들어 사용생성자를 선언하는 법
class 클래스 이름:
def __init__(self, 추가적인 매개변수):
pass
class Calculator:
def __init__(self):
print('[Calculator] __init__() called!!')
cal = Calculator()
class Calculator:
def __init__(self, n1, n2):
print('[Calculator] __init__() called!!')
self.num1 = n1
self.num2 = n2
cal = Calculator(10, 20)
print(f'cal.num1: {cal.num1}')
print(f'cal.num2: {cal.num2}')
메모리와 객체에 대한 이해
by 변 ch06_05
객체 복사에 대한 이해
다른 클래스의 기능을 내 것처럼 사용하자!
class P_Class:
def __init__(self, pNum1, pNum2):
print('[pClass] __init__()')
self.pNum1 = pNum1
self.pNum2 = pNum2
class C_Class(P_Class):
def __init__(self, cNum1, cNum2):
print('[cClass] __init__()')
# P_Class.__init__(self, 100, 200)
super().__init__(100, 200)
self.cNum1 = cNum1
self.cNum2 = cNum2
cls = C_Class(10, 20)
print(f'cls.cNum1: {cls.cNum1}')
print(f'cls.cNum2: {cls.cNum2}')
print(f'cls.pNum1: {cls.pNum1}')
print(f'cls.pNum2: {cls.pNum2}')
class MidExam:
def __init__(self, s1, s2, s3):
print('[MidExam] __init__()')
self.mid_kor_score = s1
self.mid_eng_score = s2
self.mid_mat_score = s3
def printScores(self):
print(f'mid_kor_score: {self.mid_kor_score}')
print(f'mid_eng_score: {self.mid_eng_score}')
print(f'mid_mat_score: {self.mid_mat_score}')
class EndExam(MidExam):
def __init__(self, s1, s2, s3, s4, s5, s6):
print('[EndExam] __init__()')
super().__init__(s1, s2, s3)
self.end_kor_score = s4
self.end_eng_score = s5
self.end_mat_score = s6
def printScores(self):
super().printScores()
print(f'end_kor_score: {self.end_kor_score}')
print(f'end_eng_score: {self.end_eng_score}')
print(f'end_mat_score: {self.end_mat_score}')
def getTotalScore(self):
total = self.mid_kor_score + self.mid_eng_score + self.mid_mat_score
total += (self.end_kor_score + self.end_eng_score + self.end_mat_score)
return total
def getAverageScore(self):
return self.getTotalScore() / 6
exam = EndExam(85, 90, 88, 75, 85, 95)
exam.printScores()
print(f'Total: {exam.getTotalScore()}')
print(f'Average: {round(exam.getAverageScore(), 2)}')
2개 이상의 클래스를 상속한다.
class Car01:
def drive(self):
print('drive() method called!!')
class Car02:
def turbo(self):
print('turbo() method called!!')
class Car03:
def fly(self):
print('fly() method called!!')
class Car(Car01, Car02, Car03):
def __int__(self):
pass
myCar = Car()
myCar.drive()
myCar.turbo()
myCar.fly()
class BasicCalculator:
def add(self, n1, n2):
return n1 + n2
def sub(self, n1, n2):
return n1 - n2
def mul(self, n1, n2):
return n1 * n2
def div(self, n1, n2):
return n1 / n2
class DeveloperCalculator:
def mod(self, n1, n2):
return n1 % n2
def flo(self, n1, n2):
return n1 // n2
def exp(self, n1, n2):
return n1 ** n2
class Calculator(BasicCalculator, DeveloperCalculator):
def __int__(self):
pass
myCal = Calculator()
print(f'myCal.add(10, 20): {myCal.add(10, 20)}')
print(f'myCal.sub(10, 20): {myCal.sub(10, 20)}')
print(f'myCal.mul(10, 20): {myCal.mul(10, 20)}')
print(f'myCal.div(10, 20): {myCal.div(10, 20)}')
print(f'myCal.mod(10, 3): {myCal.mod(10, 3)}')
print(f'myCal.flo(10, 3): {myCal.flo(10, 3)}')
print(f'myCal.exp(10, 3): {myCal.exp(10, 3)}')
메서드를 재정의 한다!
class Robot:
def __init__(self, c, h ,w):
self.color = c
self.height = h
self.weight = w
def fire(self):
print('총알 발사!!')
def printRobotInfo(self):
print(f'color: {self.color}')
print(f'height: {self.height}')
print(f'weight: {self.weight}')
class NewRobot(Robot):
def __init__(self, c, h ,w):
super().__init__(c, h, w)
def fire(self):
super().fire()
print('레이저 발사!!')
myRobot = NewRobot('blue', 200, 300)
myRobot.printRobotInfo()
myRobot.fire()
삼각형 넓이를 계산하는 클래스를 만들고 이를 상속하는 클래스에서 getArea()를 오버라이딩 해서 출력 결과가 다음과 같을 수 있도록 클래스를 만들어보자.
class TriangleArea:
def __init__(self, w, h):
self.width = w
self.height = h
def printTriangleAreaInfo(self):
print(f'width: {self.width}')
print(f'height: {self.height}')
def getArea(self):
return self.width * self.height / 2
class NewTriangleArea(TriangleArea):
def __init__(self, w, h):
super().__init__(w, h)
def getArea(self):
return str(super().getArea()) + '㎠'
ta = NewTriangleArea(7, 5)
ta.printTriangleAreaInfo()
triangleArea = ta.getArea()
print(f'TriangleArea: {triangleArea}')
메서드 구현을 강요한다.
from abc import ABCMeta
from abc import abstractmethod
class AirPlane(metaclass=ABCMeta):
@abstractmethod
def flight(self):
pass
def forward(self):
print('전진!!')
def backward(self):
print('후진!!')
class Airliner(AirPlane):
def __init__(self, c):
self.color = c
def flight(self):
print('시속 400km/h 비행!!')
class fighterPlane(AirPlane):
def __init__(self, c):
self.color = c
def flight(self):
print('시속 700km/h 비행!!')
ap1 = Airliner('red')
ap1.flight()
ap1.forward()
ap1.backward()
ap2 = fighterPlane('blue')
ap2.flight()
ap2.forward()
ap2.backward()
계산기 추상 클래스를 만들고 이를 이용해서 새로운 계산기 클래스를 만들어 보자. 추상 클래스에는 덧셈, 뺄셈, 곱셈, 나눗셈 기능이 선언되어 있어야 한다.
class Calculator(metaclass=ABCMeta):
@abstractmethod
def add(self, n1, n2):
pass
@abstractmethod
def sub(self, n1, n2):
pass
@abstractmethod
def mul(self, n1, n2):
pass
@abstractmethod
def div(self, n1, n2):
pass
class ChildCalculator(Calculator):
def add(self, n1, n2):
print(n1 + n2)
def sub(self, n1, n2):
print(n1 - n2)
def mul(self, n1, n2):
print(n1 * n2)
def div(self, n1, n2):
print(n1 / n2)
childCal = ChildCalculator()
childCal.add(10, 20)
childCal.sub(10, 20)
childCal.mul(10, 20)
childCal.div(10, 20)
class DeveloperCalculator(Calculator):
def add(self, n1, n2):
print(n1 + n2)
def sub(self, n1, n2):
print(n1 - n2)
def mul(self, n1, n2):
print(n1 * n2)
def div(self, n1, n2):
print(n1 / n2)
def mod(self, n1, n2):
print(n1 % n2)
def flo(self, n1, n2):
print(n1 // n2)
devCal = DeveloperCalculator()
devCal.add(10, 20)
devCal.sub(10, 20)
devCal.mul(10, 20)
devCal.div(10, 20)
devCal.mod(10, 20)
devCal.flo(10, 20)
# 클래스를 선언합니다.
class Student:
# 클래스 변수
count = 0
students = []
# 클래스 함수
@classmethod
def print(cls):
print("------ 학생 목록 ------")
print("이름\t총점\t평균")
for student in cls.students:
print(str(student))
print("------- ------- -------")
# 인스턴스 함수
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
Student.count += 1
Student.students.append(self)
def get_sum(self):
return self.korean + self.math +\
self.english + self.science
def get_average(self):
return self.get_sum() / 4
def __str__(self):
return "{}\t{}\t{}".format(\
self.name,\
self.get_sum(),\
self.get_average())
# 학생 리스트를 선언합니다.
Student("윤인성", 87, 98, 88, 95)
Student("연하진", 92, 98, 96, 98)
Student("구지연", 76, 96, 94, 90)
Student("나선주", 98, 92, 96, 92)
Student("윤아린", 95, 98, 98, 98)
Student("윤명월", 64, 88, 92, 92)
Student("김미화", 82, 86, 98, 88)
Student("김연화", 88, 74, 78, 92)
Student("박아현", 97, 92, 88, 95)
Student("서준서", 45, 52, 72, 78)
# 현재 생성된 학생을 모두 출력합니다.
Student.print()