💡 객체지향 프로그래밍에서 가장 중요한 class의 개념 정리, 이전에!! 객체지향 프로그래밍에 대해 알아보자
📌 Class 관련 정보들은 지속적으로 업데이트 예정 (update 2024.04.11)
객체지향 프로그래밍(Object-Oriented Programming, OOP)란?
class
는 특정한 속성(attribute)
과 기능(behavior)
을 가지는 객체(object)를 생성하기 위한 탬플릿임
객체(object)
는 class의 instance로서, class의 정의된 속성과 기능을 가지고 있음
데이터(Data)
와 그 데이터를 다루는 메서드(methods)
들을 하나로 묶어 객체로 만드는 것을 의미함
객체는 데이터에 직접 접근하는 것이 아니라, 메서드를 통해 데이터에 접근하고 조작하기 때문에 데이터의 상태를 보호하고, 응집성을 높이고, 재사용성을 높이는 등의 이점을 얻을 수 있음
이미 존재하는 class로 부터 속성, 기능을 상속받아 새로운 class를 정의할 수 있음
-> 코드의 재사용성을 높이고, 코드의 확장성을 향상시킬 수 있음
같은 이름의 메서드나 함수가 서로 다른 형태로 동작하는 것을 의미함,
다형성을 통해 객체들이 동이한 메서드를 호출할 때 각 객체의 특성에 맞게 적절한 동작을 수행할 수 있음
모든 자료형은 class임 -> 파이썬은 모든 요소들이 object(객체)
로 되어있음
n = 7
print(type(n))
#출력값: class 'int'
degrees_celsius = 26.0
#value: 26.0
#type: float
#memory address(예시): id1
class Car:
def __init__(self, col, length): #속성
self.color = col
self.length = length
def doStop(self): #기능
print('STOP!!')
def doStart(self):
print('START!!')
def carInfo(self):
print(f'self.color: {self.color}')
print(f'self.length: {self.length}')
#class 안에 정의되는 method들은 반드시 첫번째 parameter가 'self'여야 함
#생성자 호출 시, 매개변수를 넣어주면 객체를 초기화할 수 있음
car1 = Car('red', 200)
car2 = Car('blue', 300)
#car1, car2는 reference 변수라고 하고, 해당 변수를 통해 object 기능에 접근 가능함
car1.carInfo()
car1.doStop()
car3 = car1
#car3는 car1이 아닌, car1에 저장된 객체 주소가 저장됨
car1.color = 'gray'
car1.len = 350
#car1을 수정하면, car3도 함께 수정됨
print(car1.color)
#출력값r: 'gray'
print(car3.color)
#출력값: 'gray'
주소값이 아닌 객체를 복사하고 싶은 경우: copy method 사용
import copy car4 = copy.copy(car1) car1.color = 'blue' print(car1.color) #출력값: blue print(car4.color) #출력값: gray
#superclass
class NormalCar:
def drive(self):
print('[NormalCar] drive() called!!')
def back(self):
print('[NormalCar] back() called!!')
#subclass
class TurboCar(NormalCar):
def turbo(self):
print('[TurboCar] turbo() called!!')
myTurboCar = TurboCar()
myTurboCar.turbo()
#출력값: [TurboCar] turbo() called!!
myTurboCar.drive()
#출력값: [NormalCar] drive() called!!
myTurboCar.back()
#출력값: [NormalCar] back() called!!
파이썬의 모든 class, method는 object의 subclass임
object
is the most base typeinstance(55.2, object) #True instance('abc', object) #True instance(str, object) #True instance(max, object) #True
하위 클래스에서 상위 클래스의 method를 재정의(override)하는 것
super()
super()
#parents class
class PClass:
def __init__(self, pNum1, pNum2):
print('[P_Class] __init__() called!!')
self.pNum1 = pNum1
self.pNum2 = pNum2
#child class
class CClass(PClass):
def __init__(self, cNum1, cNum2):
print('[C_Class] __init__() called!!')
super().__init__(cNum1, cNum2) #super()를 사용하여 상위class를 호출
#PClass.__init__(self, cNum1, cNum2) > 위의 코드와 같은 동작 실행
self.cNum1 = cNum1
self.cNum2 = cNum2
cls = CClass(10, 20)
print(cls.pNum1, cls.cNum1)
#출력값: 10 10
abc
모듈을 통해서 정의하고 사용할 수 있음
#abc모듈 내 ABC, abstractmethod 가져오기
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
def perimeter(self):
return 2 * 3.14 * self.radius