객체를 이용한 프로그램으로 객체는 속성과 기능으로 구성된다.
객체 (Object) = 속성 (Attribute) + 기능 (Function)
✅ 객체 사용은 코드 재사용, 모듈화에 좋다.
✅ 클래스 만들기
class Car: # 클래스 선언
def __init__(self,color,length): # 생성자, 속성
self.color = col
self.length = len
def doStop(self): # 멈추는 기능
print('STOP!!')
def doStart(self): # 출발하는 기능
print('START!!')
def printCarInfo(self): #차량의 정보를 나타내는 함수
print(f'self.color: {self.color}')
print(f'self.length: {self.length}')
car1 = Car('red', 200) #car1 는 색상은 빨강 길이는 200
car2 = Car('blue', 300) #car2 는 색상은 파랑 길이는 300
car1.printCarInfo()
car2.printCarInfo()
self.color: red self.length: 200 self.color: blue self.length: 300
class Car:
def __init__(self, color, length):
self.color = color
self.length = length
def printCarInfo(self):
print(f'self.color: {self.color}')
print(f'self.length: {self.length}')
car1 = Car('red', 200)
car1.printCarInfo()
car1.color = 'green' #car1의 색깔을 'green'으로 바꿈
car1.length = '400' #car1의 길이를 '400'으로 바꿈
car1.printCarInfo()
self.color: red self.length: 200 #car1 바꾸기전 self.color: green self.length: 400 #car2 바꾼후
✅ 변수는 객체의 메모리 주소를 저장하고 이를 이용해 객체를 참조한다.
✅ 얕은 복사
얕은 복사란, 객체 주소를 복사하는 것으로 객체 자체가 복사되지 않는다.✅ 깊은 복사
깊은 복사란, 객체 자체를 복사하는 것으로 또 하나의 객체가 만들어진다.
class Car:
def __init__(self, color, length):
self.color = color
self.length = length
def printCarInfo(self):
print(f'self.color: {self.color}')
print(f'self.length: {self.length}')
car1 = Car('red', 200)
car1.printCarInfo()
car2 = car1 # 얕은 복사
car2.printCarInfo()
car2.color = 'green' #car2의 색깔을 'green'으로 바꿈
car2.length = '400' #car2의 길이를 '400'으로 바꿈
car1.printCarInfo()
car2.printCarInfo()
self.color: red self.length: 200 self.color: red self.length: 200 self.color: green self.length: 400 self.color: green self.length: 400
car2의 정보를 바꾸면 car1 또한 동일하게 정보가 바뀌는 것을 확인할 수 있다.
class Car:
def __init__(self, color, length):
self.color = color
self.length = length
def printCarInfo(self):
print(f'self.color: {self.color}')
print(f'self.length: {self.length}')
car1 = Car('red', 200)
car1.printCarInfo()
# 깊은 복사
import copy
car2 = copy.copy(car1)
car2.printCarInfo()
car2.color = 'green' #car2의 색깔을 'green'으로 바꿈
car2.length = '400' #car2의 길이를 '400'으로 바꿈
car1.printCarInfo()
car2.printCarInfo()
self.color: red self.length: 200 self.color: red self.length: 200 self.color: red self.length: 200 self.color: green self.length: 400
이번 결과에서는 car2가 새로운 객체를 만들었기 때문에 car1이 바뀌지 않는 것을 확인할 수 있다.
상속
클래스는 또 다른 클래스를 상속해 내 것처럼 사용할 수 있다.
class normalCar:
def drive(self):
print('[NormalCar] drive() called!!')
def back(self):
print('[NormalCar] back() called!!')
class turboCar(normalCar) : # 클래스 상속
def turbo(self):
print('[TurboCar] turbo() called!!')
myTurboCar = turboCar()
myTurboCar.turbo()
myTurboCar.drive()
myTurboCar.back()
[TurboCar] turbo() called!!
[NormalCar] drive() called!!
[NormalCar] back() called!!
✅ 객체가 생성될 때 생성자를 호출하면 __init__()
가 자동 호출된다.
class Calculator :
def __init__(self):
print('[Calculator] __init__() called!!')
>
cal = Calculator() # 생성자 호출
[Calculator] __init__() called!!
✅ __init__()
가 속성을 초기화 한다.
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}')
실습
중간고사 클래스와 기말고사 클래스를 상속관계로 만들고 각각의 점수를 초기화하자. 또한 총점 및 평균을 반환하는 기능도 만들어보자.
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 printScore(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 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 getAverage(self):
return self.getTotalScore() / 6
A1 = endExam(10,20,30,40,50,60)
print(endExam.printScore(A1)) # 각 점수 반환
print(endExam.getTotalScore(A1)) # 총점 반환
print(endExam.getAverage(A1)) # 평균 반환
[EndExam] __init__() [MidExam __init__() mid_kor_score : 10 mid_eng_score : 20 mid_mat_score : 30 None 210 35.0
class car1:
def drive(self):
print('drive() method called')
class car2:
def turbo(self):
print('turbo() method called')
class car3:
def curve(self):
print('curve() method called')
class car(car1, car2, car3): # 다중 상속
def __init__(self):
pass
myCar = car()
myCar.drive()
myCar.turbo()
myCar.curve()
drive() method called turbo() method called curve() method called
오버라이딩
하위 클래스에서 상위 클래스의 메서드를 재정의(override) 하는 행위
class robot: # 상위 클래스
def __init__(self, c, h, w):
self.color = c
self.height = h
self.weight = w
def fire(self):
print('총알 발사!!')
class newRobot(robot) : # 하위 클래스
def __init__(self, c, h, w):
super().__init__(c, h, w)
def fire(self):
print('레이저 발사!!') # 오버 라이드
robot1 = newRobot('red',100,200)
robot1.fire()
레이저 발사!!
추상클래스
상위 클래스에서 하위 클래스에 메서드 구현을 강요한다.
from abc import ABCMeta
from abc import abstractmethod
class airPlane(metaclass=ABCMeta):
@abstractmethod
def flight(self):
pass
class airliner(airPlane):
def flight(self): # 메서드 구체화
print('시속 400km/h 비행')
❓ 추상 클래스는 왜 사용하나요??
상위 클래스를 하위 클래스에서 입맛에 맞게 사용할 때 사용.