<Notes>
오늘은 조금 갑작스럽지만 내가 받아들이고 있는 클래스에 대한 기록을 조금 해보려고 한다.
오늘 쿠버네틱스를 이용한 컨테이너 작동을 위해 컴퍼넌트, 파이프라인 만들다가 조금 힘들었어서..쉽게 이해하고 싶어서 쓴 글이니만큼 틀린 부분이 있을 수 있다. 나중에 고쳐가면서 깨달음을 얻을 수 있다면 최고다🎶
대상혁의 책 추천 : 내가 틀릴 수도 있습니다.
✔클래스
는 파이썬에서 객체 지향 프로그래밍을 구현하는 주요 도구 중 하나이다. 벌써 어렵다..ㅎㅎ 그냥 일종의 내가 정한 부속품들을 바탕으로 만들어지는 제품을 계속 생산하는 공장이라고 생각하자. 예를 들어 자동차를 만들기 위한 공장이 있다. 이 공장이 클래스
고 이 공장에서 만들어내는 자동차가 바로 객체
다.
✔여기서 중요한 것은 모든 자동차가 내가 정한 부속품 자체는 가지지만 어떤 타입의 부속품을 가질지는 우리가 정할 수 있다는 것이다. 이 부속품을 우리는 속성(멤버 변수)
라고 한다. 브랜드, 색상, 최고 속도 등이 있을 수 있다.
✔나아가 우리는 자동차를 만들고 난 뒤, 가속과 감속을 할 수 있는데 이렇게 만들고 난 뒤에 자동차가 할 수 있는 동장이나 기능을 메서드(멤버 함수)
라고 한다.
역시 간단한 예를 봐야 마음이 편하다
class Car:
def __init__(self, brand, color, max_speed):
self.brand = brand
self.color = color
self.max_speed = max_speed
self.speed = 0
def accelerate(self, amount):
if self.speed + amount <= self.max_speed:
self.speed += amount
else:
print("최고 속도를 초과할 수 없습니다.")
def brake(self, amount):
if self.speed - amount >= 0:
self.speed -= amount
else:
print("이미 정지 상태입니다.")
def display_speed(self):
print(f"현재 속도: {self.speed} km/h")
생각보다 이해가 쉬운 예시이기를 바라며,,총총
하나씩 봐볼까?
class Car
: 자동차를 만들어내기 위한 공장을 설립한다.__init__(self, brand, color, max_speed)
: 공장의 부속품을 정의한다. 브랜드, 색상, 최고 속도를 입력받아 매번 새 자동차를 만든다.self.brand = brand
: 새로 만든 자동차의 브랜드는 내가 입력한 브랜드가 될 것이다.def accelerate(self, amount)
: 자동차의 가속이 가능하도록 함수를 만든다. 하지만 최고 속도는 넘을 수 없다. 짚고 넘어갈 것은 self가 왜 안에 들어가야 하냐는 것이다. 이 것은 내가 만든 자동차에게 이 함수를 적용하겠다는 의미이다!!def brake(self, amount)
: 자동차의 감속이 가능하도록 함수를 만든다. 하지만 0보다 속도가 작아질 수는 없다.def display_speed(self)
: 현재 속도를 볼 수 있도록 함수를 만든다.self.speed = 0
: 갓 태어난 자동차의 속도는 당연히 0이다. 달리면서 만들 수는 없으니까! 그래서 만들 차의 속도는 0이라고 미리 정해준다.
이렇게 공장을 만들었는데 어떻게 써먹을지 모르겠다고~~ 라고 내가 생각했었다ㅋㅋㅋ
어떻게 써먹을 수 있는지도 한 번 보자
my_car = Car("벤츠", "화이트", 200)
# 내가 만든 자동차에서 정의한 부속품을 보자
print("브랜드:", my_car.brand) #벤츠
print("색상:", my_car.color) # 화이트
print("최고 속도:", my_car.max_speed) # 200
# 첫 스피드는 0이었고 가속을 해보자
my_car.accelerate(50)
# 현재 속도를 보자
my_car.display_speed() # 출력: 현재 속도: 50 km/h
my_car.accelerate(200)
# 최고 속도 초과가 안되는지도 봐야겠죠?
my_car.display_speed() # 출력: 최고 속도를 초과할 수 없습니다.
# 감속도 해보자
my_car.brake(30)
my_car.display_speed() # 출력: 현재 속도: 20 km/h
# 속도가 0보다 작아질 수는 없다구
my_car.brake(30)
my_car.display_speed() # 출력: 이미 정지 상태입니다.
차 없어요..벤츠 없습니다
my_car
: 해당 변수로 공장에서 자동차를 생산해냈다. 앞으로 내가 사용할 녀석은 이녀석이고, 새로 자동차를 만들고 싶다면 다시 자동차를 공장에서 만들어야 한다.my_car.brand
: 파이썬에서 .은 '~의' 정도로 생각해도 좋다(개인적인 의견) 내 차의 브랜드를 보겠다는 말이다.my_car.accelerate(50)
: 내 차의 속도를 50 가속하겠다는 말이다. 당연히 self는 함수를 만들 때만 내 차에 적용하겠다는 의미였으므로 실제 가속을 원할 때 self는 안에 넣지 않아도 된다.
이해가 갔다고 좋아했다면 당신..아직이야
놀라지 마세요..이제 시작이다😂
왜냐고?
놀랍게도 세상은 자동차 공장을 참고해서 트럭 공장을 만들기 때문이다 ㅋㅋㅋ 자동차 공장의 기본틀을 참고하면 되기 때문에 공장을 처음부터 다시 설계할 필요가 없다는 큰 장점이 돋보이는 부분이다.
✔클래스 상속
은 이미 정의된 클래스의 특징과 기능을 다른 클래스에서 재사용하고 확장할 수 있도록 해준다
자동차 공장을 참고해서 트럭 공장을 만들어볼까?
class Truck(Car): # 자동차 공장을 참고한 트럭 공장 설계
def __init__(self, brand, color, max_speed, max_capacity):
super().__init__(brand, color, max_speed) # 자동차 공장의 설계 방식 참고
self.max_capacity = max_capacity # 트럭의 화물 용량
self.capacity = 0
def load_cargo(self, amount):
if self.capacity + amount <= self.max_capacity
self.capacity += amount
else:
print("용량 초과입니다.")
def unload_cargo(self, amount):
if self.capacity - amount >= 0
self.capacity -= amount
else:
print("더 빼낼 수 없어요.")
def display_capacity(self):
print(f"현재 용량: {self.capacity}kg")
중요한 것은 Car 클래스를 상속 받았기 때문에 자동차의 메서드 및 속성을 사용할 수 있다는 것이다.
class Truck(Car)
: 자동차 공장을 참고하여 트럭공장을 만든다.def __init__(self, brand, color, max_speed, max_capacity)
: 공장의 부속품을 정의한다. 브랜드, 색상, 최고 속도, 최고 용량을 입력받아 매번 새 트럭을 만든다.super().__init__(brand, color, max_speed)
: 아 이거 중요합니다..자동차 공장에서 정의했던 부속품들을 정하는 방식을 그대로 가져오겠다는 뜻! 즉 자동차 공장에서 self.brand = brand 이렇게 정의했던 것들을 다 가져오겠다는 뜻이에요 ㅋㅋㅋ
역시 만든 트럭 공장에서 트럭을 어떻게 생산하고 또 어떻게 사용하는지 직접 봐야 이해가 되겠죠?
한 번 봅시다😊😜😉
# 트럭 공장에서 트럭 생산
my_truck = Truck("볼보", "파랑", 180, 5000)
print("브랜드:", my_truck.brand) # 볼보
print("색상:", my_truck.color) # 파랑
print("최고 속도:", my_truck.max_speed) # 180
# 트럭의 화물을 싣고 용량을 확인
my_truck.load_cargo(3000)
my_truck.display_capacity() # 출력: 현재 용량: 3000kg
# 트럭의 속도를 높이고 현재 속도 확인
my_truck.accelerate(50)
my_truck.display_speed() # 출력: 현재 속도: 50 km/h
슬슬 팔아프네 ㅋㅋㅋ
my_truck
해당 변수로 공장에서 트럭을 생산했다.my_truck.brand
: 내 트럭의~~ 브랜드를 보여됴my_truck.load_cargo(3000)
: 트럭 공장을 만들 때, 정의한 메서드이므로 화물 추가가 가능하다. 당연히 또 언급하지만 self는 함수를 만들 때 내 트럭에 이 함수를 적용하겠다는 뜻이므로 실제 용량 추가를 할 때 self는 안에 담지 않아도 된다.my_truck.accelerate(50)
: 이게 바로 큰 장점이지~~ 자동차 공장에서 상속 받아온 메서드이기 때문에 트럭의 속도를 가속하는 것 역시 가능해진다!!
흠 이 부분은 아직 공부가 더 필요하다.
오늘 딥러닝 모델을 개발하며 이전 모델을 상속받다가 def _build(self):
를 배웠다.. 조금 찾아보니까 클래스 안에서 _로 시작하는 메서드를 정의하면 클래스 내부에서만 사용되고 외부에서는 사용되지 않을 것을 의미한단다. 따라서 def __init__
을 정의하면서 밑에 self._build()
도 함께 담아서 클래스 불러오면서 자동으로 메서드도 실행되도록 한 모양인디.. 아닌가 그냥 메서드 충돌을 방지하기 위함인가
그런데 부속품을 정의하는 방식에 있어서 self._build()가 개입되면
super().__init__(brand, color, max_speed) # 부모 클래스 초기화 메서드 호출
self.max_capacity = max_capacity
과
self.max_capacity = max_capacity
super().__init__(brand, color, max_speed) # 부모 클래스 초기화 메서드 호출
가 차이가 있는 모양이다..
일반적으로는 전자를 통해서 먼저 상속을 받고 새로운 부속품을 정의하는 것 같은데 조금 더 공부해보자!
<에필로그>
ㅋㅋㅋㅋ웰컴 투 클래스ㅋㅋㅋ귀엽다
오늘은 학원에서 시험을 봤다🤣
집가서 놀까 하다가 존경하는 롤모델 덕분에 마음을 다잡고 기분 좋게 공부하다 집으로 간다!(뿌듯) 글도 잘 써지네 ㅋㅋㅋㅋ
모두모두 수고하셨습니다 ㅋㅋㅋ✌🎉