본문 바로가기
프로그래밍 언어/Python

객체지향

by 진진리 2023. 9. 18.
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()

'프로그래밍 언어 > Python' 카테고리의 다른 글

함수와 모듈  (0) 2023.09.15
문자열  (0) 2023.09.15
리스트, 튜플, 딕셔너리, 세트  (0) 2023.09.15
반복문  (0) 2023.09.15
조건문  (0) 2023.09.15