
변수
변수는 객체의 메모리 주소를 저장하고 이를 이용해서 객체를 참조한다.레퍼런스 변수라고도 하며, 주소값을 가지고 참조한다.
예를들어, Car()라는 클래스를 가지고 객체를 만들어 mycar라는 변수에 넣었다고 가정했을때 maycar 변수는 객체의 주로를 저장하고 있고, 실제 객체는 다른 곳에 저장이 되어있다.

rb1 = Robot('red',200, 80)
rb2 = Robot('blue',300,90)
r3 = r1


🌟Summary
얕은 복사의 경우 '='을 이용하여 복사하고, 깊은 복사의 경우 copy함수를 이용하여 주소가 다른 별개의 객체를 하나 더 생성해낸다.
상속
클래스는 또 다른 클래스를 상속해서 내 것처럼 사용할 수 있다. 아래와 같이 클래스 명의 괄호 안에 다른 클래스의 이름을 적어주면 다른 클래스의 기능도 같이 사용 가능하다. 아래와 같이 CalculatorMore는 Calculator 클래스를 상속받아 덧셈, 뺄셈기능이 가능해진다.
class Calculator:
def add(self,n1,n2):
print(n1+n2)
def sub(self,n1,n2):
print(n1-n2)
class CalculatorMore(Calculator):
def mul(self,n1,n2):
print(n1*n2)
def div(self,n1,n2):
print(n1/n2)
cal = CalculatorMore()
cal.mul(10,20)
cal.add(10,20)
부모 클래스의 속성 초기화
1) [부모클래스이름].__init__(self,변수1,변수2...)
또는
2) super().__init__(변수1,변수2...)
super의 경우 self를 안 써줘도 된다.
(아래 예시는 기말고사점수가 중간고사점수를 상속받아 사용하는 것이다.)
class MidExam:
def __init__(self,s1,s2,s3):
print('[MidExam]__init__!!')
self.mid_kor = s1
self.mid_eng = s2
self.mid_mat = s3
def printScore(self):
print(f'국어_중간: {self.mid_kor}')
print(f'영어_중간: {self.mid_eng}')
print(f'수학_중간: {self.mid_mat}')
class EndExam(MidExam):
def __init__(self,s1,s2,s3,s4,s5,s6): #초기화함수 변수에는 사용되는 상속받는 변수들도 다 작성해주어야 한다!!
print('[EndExam]__init__!!')
super().__init__(s1,s2,s3)
self.end_kor = s4
self.end_eng = s5
self.end_mat = s6
def PrintScore(self):
super().printScore()
print(f'국어_기말: {self.mid_kor}')
print(f'영어_기말: {self.mid_eng}')
print(f'수학_기말: {self.mid_mat}')
def totalscore(self):
total = self.mid_kor + self.mid_eng + self.mid_mat
total += self.end_mat + self.end_eng + self.end_kor
return total
def avgscore(self):
return self.totalscore()/6 #다른 함수를 이용하기 위해서 self사용하는것 잊지 말기!!
final = EndExam(50,70,80,20,60,100)
final.PrintScore()
final.avgscore()
다중상속
두개 이상의 클래스를 상속받는 것을 말한다.
(이때 다중상속을 많이 할 경우 코드상 중복이 일어나 오류가 생길 수 있으니 꼭 필요한 경우에 사용하여야 한다.)
-아래의 코드는 두개의 계산기 클래스를 하나의 계산기 클래스가 상속받는 예시이다.
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 DevelopCalculator:
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,DevelopCalculator):
def __init__(self): pass
cal = Calculator()
cal.mod(10,20)
cal.add(10,20)
🚩오버라이딩
하위클래스에서 상위클래스의 메서드를 변경해서 사용하고 싶을때 함수의 이름을 같게하여 함수의 내용을 변경한다.

class Robot:
def __init__(self,c,h,w):
self.color = c
self.height = h
self.weight = w
def fire(self):
print('미사일발사')
def printInfo(self):
print(f'{self.color}')
print(f'{self.height}')
print(f'{self.weight}')
class NewRobot(Robot):
def __init__(self,c,h,w):
super().__init__(c,h,w)
def fire(self): #robot클래스의 fire함수를 오버라이딩함.
print('레이저발사!!')
rb = NewRobot('red',300,200)
rb.fire()
추상클래스
상위 클래스에서 하위클래스에 메서드 구현을 강요하는 것이다. 아래의 그림처럼 부모 클래스에서는 정의가 구체화되어있지 않은데 자식 클래스에서는 메서드를 구체화하는 것을 강제/강요한다.
(특정 기능을 상속을 받았을때 각 클래스에서 필요에 맞는 기능을 구현하기 위해 세부 조정을 할 수 있도록 하게 하기 위해 사용한다.즉,각자의 입맛에 맞게 구현하기 위해서이다.)from abc import ABCMeta from abc import abstractmethod @abstractmethod class AirPlane(metaclass = ABCMeta):#를 사용하여 추상클래스를 사용한다.

from abc import ABCMeta
from abc import abstractmethod
class AirPlane(metaclass = ABCMeta):
@abstractmethod
def flight(self):
pass
def forward(self):
print('전진!!')
def back(self):
print('후진!!')
class AirLiner(AirPlane):
def __init__(self,c):
self.color = c
def flight(self):
print('시속---비행')
fl = AirLiner('red')
fl.flight()
에러
소프트웨어적으로 처리할 수 없는 상태. 문법적인 에러(ex.syntax error, network error, 전기가 끊긴다든가 하는 천재지변의 일etc.)
예외
문법적으로 문제는 없으나 실행 중 발생하는 예상하지 못한 문제이다

🌿회고록!!
- class의 경우 __init__ 함수를 계속 빼먹을때가 있다. 아직 클래스 생성이 손에 익지 않아서 그런 것 같다. 계속 연습해보면서 익혀야겠다.
🚩__init__이란 클래스의 인스턴스(객체)가 만들어진 직후 호출되는 초기화 함수이다. 이 함수가 없다면 다른 객체를 만들어도 전역변수인 self가 초기화되지 않아서 새로운 객체에도 값이 중복되므로 초기화 함수를 꼭 써주어야 한다.)- class생성 후 사용방법!: class생성> 객체생성!! > 객체명에 함수사용
- 클래스 내에서 한 함수가 다른 함수의 리턴값을 사용할때는 self.[함수명]()을 하면 된다.