파이썬 클래스(class)

푸른하늘·2024년 3월 14일
1

개발자 유아기

목록 보기
5/14

<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")

생각보다 이해가 쉬운 예시이기를 바라며,,총총
하나씩 봐볼까?

  1. class Car : 자동차를 만들어내기 위한 공장을 설립한다.
  2. __init__(self, brand, color, max_speed) : 공장의 부속품을 정의한다. 브랜드, 색상, 최고 속도를 입력받아 매번 새 자동차를 만든다.
  3. self.brand = brand : 새로 만든 자동차의 브랜드는 내가 입력한 브랜드가 될 것이다.
  4. def accelerate(self, amount) : 자동차의 가속이 가능하도록 함수를 만든다. 하지만 최고 속도는 넘을 수 없다. 짚고 넘어갈 것은 self가 왜 안에 들어가야 하냐는 것이다. 이 것은 내가 만든 자동차에게 이 함수를 적용하겠다는 의미이다!!
  5. def brake(self, amount) : 자동차의 감속이 가능하도록 함수를 만든다. 하지만 0보다 속도가 작아질 수는 없다.
  6. def display_speed(self) : 현재 속도를 볼 수 있도록 함수를 만든다.
  7. 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()  # 출력: 이미 정지 상태입니다.

차 없어요..벤츠 없습니다

  1. my_car : 해당 변수로 공장에서 자동차를 생산해냈다. 앞으로 내가 사용할 녀석은 이녀석이고, 새로 자동차를 만들고 싶다면 다시 자동차를 공장에서 만들어야 한다.
  2. my_car.brand : 파이썬에서 .은 '~의' 정도로 생각해도 좋다(개인적인 의견) 내 차의 브랜드를 보겠다는 말이다.
  3. 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 클래스를 상속 받았기 때문에 자동차의 메서드 및 속성을 사용할 수 있다는 것이다.

  1. class Truck(Car) : 자동차 공장을 참고하여 트럭공장을 만든다.
  2. def __init__(self, brand, color, max_speed, max_capacity) : 공장의 부속품을 정의한다. 브랜드, 색상, 최고 속도, 최고 용량을 입력받아 매번 새 트럭을 만든다.
  3. 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

슬슬 팔아프네 ㅋㅋㅋ

  1. my_truck 해당 변수로 공장에서 트럭을 생산했다.
  2. my_truck.brand : 내 트럭의~~ 브랜드를 보여됴
  3. my_truck.load_cargo(3000) : 트럭 공장을 만들 때, 정의한 메서드이므로 화물 추가가 가능하다. 당연히 또 언급하지만 self는 함수를 만들 때 내 트럭에 이 함수를 적용하겠다는 뜻이므로 실제 용량 추가를 할 때 self는 안에 담지 않아도 된다.
  4. 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)  # 부모 클래스 초기화 메서드 호출

가 차이가 있는 모양이다..

일반적으로는 전자를 통해서 먼저 상속을 받고 새로운 부속품을 정의하는 것 같은데 조금 더 공부해보자!


<에필로그>

ㅋㅋㅋㅋ웰컴 투 클래스ㅋㅋㅋ귀엽다

오늘은 학원에서 시험을 봤다🤣
집가서 놀까 하다가 존경하는 롤모델 덕분에 마음을 다잡고 기분 좋게 공부하다 집으로 간다!(뿌듯) 글도 잘 써지네 ㅋㅋㅋㅋ
모두모두 수고하셨습니다 ㅋㅋㅋ✌🎉

profile
천방지축 어리둥절 빙글빙글 돌아가는 내인생

0개의 댓글

관련 채용 정보