객체와 메모리
class Robot:
def __init__(self, color, height, weight):
self.color = color
self.height = height
self.weight = weight
def printRobotInfo(self):
print(f'color: {self.color}')
print(f'height: {self.height}')
print(f'weight: {self.weight}')
rb1 = Robot('red', 200, 80) #객체 생성하여 레퍼런스변수에 담음
rb1.printRobotInfo() #rb1에 담긴 주소값으로 가서 기능 호출
rb2 = Robot('blue', 300, 120)
rb3 = rb1
rb3.printRobotInfo() #rb1에 있는 메모리주소가 카피
🔔 연습문제
scores = [int(input('국어 점수 입력: ')),
int(input('영어 점수 입력: ')),
int(input('수학 점수 입력: '))]
print(scores)
copyScores = scores.copy()
for idx, score in enumerate(copyScores):
result = score * 1.1
copyScores[idx] = 100 if result > 100 else result
print(f'이전 평균: {sum(scores) / len(scores)}')
print(f'이후 평균: {sum(copyScores) / len(copyScores)}')
💥enumerate()
리스트 인덱스와 값을 출력할 수 있는 함수 (결과값은 튜플)
a = ['a','b','c','d']
for i in enumerate(a):
print(i)
(인덱스, 값)
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
a = ['a','b','c','d']
for idx, name in enumerate(a):
print(f'{idx}번째 이름은 {name}입니다')
0번째 이름은 a입니다
1번째 이름은 b입니다
2번째 이름은 c입니다
3번째 이름은 d입니다
얕은 복사와 깊은 복사
tc1 = TemCls(10, 'Hello')
tc2 = tc1
tc1.printClsInfo()
tc2.printClsInfo()
-> 같은 값 나옴 / tc1로 접근해서 속성 변경하면 tc2도 변경
scores = [9,8,7,6,5,4,3]
scoresCopy = []
scoresCopy=scores
print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
copy()
활용import copy
tc1 = TempCls(10, 'Hello')
tc2 = copy.copy(tc1)
scores = [9,8,7,6,5,4]
scoresCopy = []
for s in scores:
scoresCopy.append(s)
print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
extend()
활용scores = [9,8,7,6,5,4]
scoresCopy = []
scoresCopy.extend(scores)
print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
scores = [9,8,7,6,5,4]
scoresCopy = scores[:] #슬라이싱
print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
🔔 연습문제
Q. 선수 점수에 대한 총합 / 평균 내고, 복사본 만들어서 최대값, 최소값 점수 제외한 총합 / 평균 내기
plaOriSco = [8,7,6,8,9,10,5]
plaCopSco = plaOriSco.copy()
plaOriSco.sort()
plaCopSco.sort()
plaCopSco.pop(0)
plaCopSco.pop()
print(f'plaOriSco: {plaOriSco}')
print(f'plaCopSco: {plaCopSco}')
oriTot = round(sum(plaOriSco), 2)
oriAvg = round(sum(plaOriSco)/len(plaOriSco),2)
print(f'Original Total: {oriTot}')
print(f'Original Average: {oriAvg}')
copTot = round(sum(plaCopSco), 2)
copAvg = round(sum(plaCopSco)/len(plaCopSco),2)
print(f'Copy Total: {copTot}')
print(f'Copy Average: {copAvg}')
클래스 상속
상속: 다른 클래스의 기능을 내 것처럼 사용
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는 NormalCar가 가진 drive, back 기능 모두 사용 가능
생성자
객체가 생성될 때 생성자를 호출하면 init()가 자동 호출
__init__()
: 속성을 초기화
생성자 호출할 때 입력한 매개변수가 init 안으로 들어가며 속성 초기화
1. 외부에서 매개변수 받아서
class Calculator:
def __init__(self, n1, n2):
print('[Calculator] __init__() called!!')
self.num1 = n1
self.num2 = n2
cal = Calculator(10, 20)
print(f'Calculator.num1: {cal.num1}')
class Calculator:
def __init__(self):
print('[Calculator] __init__() called!!')
self.num1 = 10
self.num2 = 20
cal = Calculator()
print(f'Calculator.num1: {cal.num1}')
super()
: 상위클래스 초기화
class P_Class:
def __init__(self, pNum1, pNum2):
print('[P_Class] __intit__() called!!')
self.pNum1 = pNum1
self.pNum2 = pNum2
class C_Class(P_Class):
def __init__(self, cNum1, cNum2):
print('[C_Class] __init__() called!!')
self.cNum1 = cNum1
self.cNum2 = cNum2
cls = C_Class(10,20)
출력값: [C_Class] init() called!!
= P_Class의 속성값은 초기화되지 않았다
💥 상위클래스 초기화 하는 방법
1. 강제 호출
class C_Class(P_Class):
def __init__(self, cNum1, cNum2):
print('[C_Class] __init__() called!!')
P_Class.__init__(self, cNum1, cNum2)
self.cNum1 = cNum1
self.cNum2 = cNum2
super()
활용 (좀 더 세련된 방법)class C_Class(P_Class):
def __init__(self, cNum1, cNum2):
print('[C_Class] __init__() called!!')
super().__init__(cNum1, cNum2)
self.cNum1 = cNum1
self.cNum2 = cNum2
🔔 연습문제
중간고사 클래스와 기말고사 클래스를 상속관계로 만들고 각각의 점수 초기화
+총점 및 평균을 반환하는 기능
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 getTotal(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 getAvg(self):
return self.getTotal() / 6
exam = EndExam(56,62,76,88,35,21)
exam.printScores()
print(f'Total: {exam.getTotal()}')
print(f'Average: {exam.getAvg()}')
속성 초기화
기능 초기화
💥 return self.getTotal
오버라이딩 하위 클래스에서 상위 클래스의 메서드를 재정의(override)
추상클래스 상위클래스에서 하위클래스에 매서드 구현 강요
메서드 선언만 하고 구현은 하위 클래스에서 서술
from abc import ABCMeta
from abc import abstractmethod
abc 패키지로부터 ABCMeta, abstractmethod 가져오기
class AirPlane(metaclass=ABCMeta):
@abstractmethod
-> 여러 하위클래스가 상속할 경우, 공통적인 기능을 각 클래스마다 달리 구현 필요할 때 사용