728x90
클래스
현실 세계의 사물을 컴퓨터 안에서 구현하기 위해 고안된 개념
class 클래스명 :
# 관련 코드 구현
- 필드: 클래스의 속성
- 메서드: 클래스의 기능
- 인스턴스: 클래스를 기반으로 생성한 객체
# 인스턴스 생성
인스턴스명 = 클래스명()
# 인스턴스의 필드에 값 대입
인스턴스명.필드명 = 값
# 메서드 호출
인스턴스명.메서드명()
# 인스턴스 삭제
del(인스턴스명)
생성자(Constructor)
인스턴스를 생성하면 무조건 호출되는 메서드
인스턴스를 생성하면서 필드값을 초기화시키는 함수
### 생성자의 기본 형태 ###
class 클래스명 :
def __init__(self) :
# 초기화할 코드 입력
### 초기값을 매개변수로 넘길 때 ###
class 클래스명 :
def __init__(self, value1, value2) :
self.필드명1 = value1
self.필드명2 = value2
인스턴스 변수와 클래스 변수
인스턴스 변수: 인스턴스를 생성해야 비로소 사용할 수 있는 변수
클래스 변수: 클래스 안에 공간이 할당된 변수
- 만드는 방법은 인스턴스 변수와 동일
- 접근 방법: 클래스명.클래스변수명 or 인스턴스.클래스변수명
- 인스턴스를 생성해도 추가로 공간을 할당하지 않고 공유
- 어떻게 구분?
클래스 안에서 필드(변수)에 접근할 때
앞에 self.를 붙이면 인스턴스 변수
클래스명.을 붙이면 클래스 변수를 생성
클래스의 상속(Inheritance)
기존 클래스에 있는 필드와 메서드를 그대로 물려받는 새로운 클래스를 만드는 것
상위 클래스 - 슈퍼 클래스, 부모 클래스
하위 클래스 - 서브 클래스, 자식 클래스
- 메서드 오버라이딩(재정의): 슈퍼 클래스에 있는 메서드를 서브 클래스에서 다시 만들어 사용하는 것
Example
## 클래스 선언 부분 ##
class Car :
speed = 0
def upSpeed(self, value) :
self.speed += value
print("현재 속도(슈퍼 클래스): %d" %self.speed)
class Sedan(Car) : # 클래스 Car 상속받음
def upSpeed(self, value) : # 메서드 재정의
self.speed += value
if self.speed > 150 :
self.speed = 150
print("현재 속도(서브 클래스): %d" %self.speed)
class Truck(Car) :
pass # 모두 그대로 상속 받음
## 변수 선언 부분 ##
sedan1, truck1 = None, None
## 메인 코드 부분 ##
truck1 = Truck()
sedan1 = Sedan()
print("트럭 --> ", end="")
truck1.upSpeed(200)
print("승용차 --> ", end="")
sedan1.upSpeed(200)
'''
출력 결과:
트럭 --> 현재 속도(슈퍼 클래스): 200
승용차 --> 현재 속도(서브 클래스): 150
'''
클래스의 특별한 메서드
- __del__() : 인스턴스를 삭제할 때, 즉 del(인스턴스)를 실행하면 호출됨. 어떤 작업이 필요할 때 해당 메서드 안에 코드 작성
- __repr__() : 인스턴스를 출력할 때, 즉 print(인스턴스)를 실행하면 호출됨.
- __add__() : 인스턴스 사이 덧셈 작업이 일어날 때 실행됨.
- 비교 메서드(<, <=, >, >=, ==, !=): __lt__(), __le__(), __gt__(), __ge__(), __eq__(), __ne__()
## 클래스 선언 부분 ##
class Line:
length = 0
def __init__(self,length) :
self.length = length
print(self.length, '길이의 선이 생성되었습니다.')
def __del__(self):
print(self.length, '길이의 선이 삭제되었습니다.')
def __repr__(self) :
return '선의 길이: ' + str(self.length)
def __add__(self, other) :
return self.length + other.length
def __lt__(self, other) :
return self.length < other.length
def __eq__(self, other) :
return self.length == other.length
## 메인 코드 부분 ##
myLine1 = Line(100)
myLine2 = Line(200)
print(myLine1)
print('두 선 길이 합: ', myLine1 + myLine2)
if myLine1 < myLine2 :
print('선분 2가 더 기네요.')
elif myLine1 == myLine2 :
print('두 선분이 같네요.')
else :
print('모르겠네요.')
del(myLine1)
'''
출력 결과:
100 길이의 선이 생성되었습니다.
200 길이의 선이 생성되었습니다.
선의 길이: 100
두 선 길이 합: 300
선분 2가 더 기네요.
100 길이의 선이 삭제되었습니다.
- 추상 메서드: 내용은 pass로 채운 슈퍼 클래서의 메서드
- 슈퍼 클래스에 본체가 없지만 서브 클래스에서는 반드시 오버라이딩해서 사용해야 함
- 멀티 스레드: 프로그램 하나에서 여러 개를 동시에 처리할 수 있도록 제공하는 기능
import threading
...
th1 = threading.Thread(target = 인스턴스1.메서드명) # 스레드 생성
th2 = threading.Thread(target = 인스턴스2.메서드명)
th3 = threading.Thread(target = 인스턴스3.메서드명)
th1.start() # 스레드 시작
th2.start()
th3.start()
- 멀티 프로세싱: 동시에 CPU를 여러 개 사용. 대량의 처리가 필요할 때 속도가 향상됨
import multprocessing
...
mp1 = multiprocessing.Process(target=인스턴스1.메서드, args=매개변수) # 스레드 생성
mp2 = multiprocessing.Process(target=인스턴스2.메서드)
mp3 = multiprocessing.Process(target=인스턴스3.메서드)
mp1.start() # 프로세스 시작
mp2.start()
mp3.start()
mp1.join() # 프로세스가 종료되지 않을 때 작업이 끝나면 프로세스를 종료시켜 주는 역할
mp2.join()
mp3.join()