Python 클래스, 객체, 상속, 오버라이딩

dumbbelldore·2024년 11월 6일
0

zero-base 33기

목록 보기
9/97

1. 객체지향 프로그래밍

  • 객체(Object)를 이용한 프로그램으로, 객체는 속성기능(메소드)으로 구분됨
  • ex) 자동차(객체), 연비(속성), 후진(기능)
  • 객체는 클래스(Class)를 통해 생성되며, 클래스는 붕어빵(객체)를 찍어내는 틀이라고 생각해볼 수 있음
  • 객체를 활용함으로써 코드 재사용성이 증대되고, 모듈식 프로그램 구성이 가능함

2. 클래스(Class)

  • 클래스는 class 키워드를 통해 생성하며, 내부에 속성과 기능을 구현할 수 있음
# 클래스(자동차)
class Car:

    def __init__(self, name, color, speed):
        self.name = name # 속성(이름)
        self.color = color # 속성(색상)
        self.speed = speed # 속성(속도)

    def start_up(self):
        print(f"{self.name}의 시동이 켜졌습니다.") # 기능(시동켜짐)

my_car = Car("티코", "빨간색", "30km/h") # 객체 생성
print("차 이름:", my_car.name)
print("차 색상:", my_car.color)
print("차 속도:", my_car.speed)
my_car.start_up()

# 출력예시
# 차 이름: 티코
# 차 색상: 빨간색
# 차 속도: 30km/h
# 티코의 시동이 켜졌습니다.

3. 객체와 메모리

  • 변수는 객체의 메모리 주소를 저장하고, 이를 이용하여 객체를 참조함
  • 따라서, 하나의 객체를 다른 객체에 할당한 경우(ex. num1 = num2) 동일한 메모리의 주소를 공유하게 됨

4. Shallow Copy vs. Deep Copy

  • 얕은 복사(Shallow Copy): 메모리의 주소만 복사하며, 객체 자체가 복사되지 않음
  • 깊은 복사(Deep Copy): 객체 자체를 복사하여 별도의 메모리 공간이 할당됨

5. 클래스의 상속 & 오버로딩

  • 부모의 클래스를 상속함으로써, 자식 클래스에서 부모 클래스와 동일한 속성과 기능을 다시 정의하지 않고 편하게 사용할 수 있음
  • 상속 시 새로운 속성 추가가 필요한 경우, 자식 클래스의 __init__ 함수 내 super().__init()__ 함수를 통해 부모의 속성을 초기화한 후 전용 속성을 추가할 수 있음
  • 자식 클래스에 구현한 전용 기능은 자식 클래스의 객체만 사용할 수 있음
# 부모 클래스
class Car:

    def __init__(self, name, color, speed):
        self.name = name
        self.color = color
        self.speed = speed

    def start_up(self):
        print(f"{self.name}의 시동이 켜졌습니다.")

# 자식 클래스
class Bus(Car):

    def __init__(self, name, color, speed, max_people):
    	# 부모 클래스 속성 초기화
        super().__init__(name, color, speed)
        # 자식 클래스 전용 속성 정의
        self.max_people = max_people
	
    # 자식 클래스 전용 기능 정의
    def start_pay(self):
        print(f"{self.name}의 결제시스템이 켜졌습니다.")

my_bus = Bus("마을버스", "노랑색", "30km/h", "45인승")
print("버스 이름:", my_bus.name)
print("버스 색상:", my_bus.color)
print("버스 속도:", my_bus.speed)
print("버스 인원:", my_bus.max_people) # 자식 클래스 전용 속성
my_bus.start_up()
my_bus.start_pay() # 자식 클래스 전용 기능

# 출력예시
# 버스 이름: 마을버스
# 버스 색상: 노랑색
# 버스 속도: 30km/h
# 버스 인원: 45인승
# 마을버스의 시동이 켜졌습니다.
# 마을버스의 결제시스템이 켜졌습니다.

6. 생성자

  • 객체 생성시에는 클래스명에 괄호를 붙여 'Car()'과 같이 호출함
  • 이후, 자동으로 클래스 내 __init__() 함수가 호출됨으로써 속성이 부여됨

7. 다중상속

  • 2개 이상의 부모 클래스로부터 상속을 받을 수도 있으며, 상속하고자 하는 클래스의 이름을 차례대로 나열함
  • ex) class Minivan(Car, Bus)

8. 오버라이딩

  • 자식 클래스에서 부모 클래스의 메소드를 재정의하는 기능을 말함
# 부모 클래스
class Car:

    def __init__(self, name, color, speed):
        self.name = name
        self.color = color
        self.speed = speed

    def start_up(self):
        print(f"{self.name}의 시동이 켜졌습니다.")

# 자식 클래스
class Bus(Car):
    def start_up(self): # 오버라이딩
        super().start_up()
        print(f"{self.name}의 위성통신 기능도 정상입니다.")

my_bus = Bus("마을버스", "노랑색", "30km/h")
print("버스 이름:", my_bus.name)
print("버스 색상:", my_bus.color)
print("버스 속도:", my_bus.speed)
my_bus.start_up()

# 출력예시
# 버스 이름: 마을버스
# 버스 색상: 노랑색
# 버스 속도: 30km/h
# 마을버스의 시동이 켜졌습니다.
# 마을버스의 위성통신 기능도 정상입니다.

9. 추상클래스와 추상메소드

  • 부모 클래스에서는 메소드의 틀만 만들어 놓고, 자식 클래스에서 상속하여 특성에 맞게 정의할 수 있도록 구현한 클래스
  • 부모 클래스는 반드시 abc 모듈을 import한 다음 구현하여야 하며, 자식 클래스에서 메소드를 재정의하지 않으면 에러가 발생함
# 추상메소드 미정의 후 사용 시 TypeError 발생
from abc import *

# 부모클래스
class Car(metaclass=ABCMeta): # 추상클래스 지정

    def __init__(self, name, color, speed):
        self.name = name
        self.color = color
        self.speed = speed

    @abstractmethod # 추상메소드 지정
    def start_up(self):
        pass

# 자식클래스
class Bus(Car):
    pass # 추상메소드 미정의 상태

my_bus = Bus("마을버스", "노랑색", "30km/h")
print("버스 이름:", my_bus.name)
print("버스 색상:", my_bus.color)
print("버스 속도:", my_bus.speed)
my_bus.start_up()

# 출력 예시
# TypeError: Can't instantiate abstract class Bus with abstract method start_up
# 올바른 예시
from abc import *

# 부모클래스
class Car(metaclass=ABCMeta): # 추상클래스 지정

    def __init__(self, name, color, speed):
        self.name = name
        self.color = color
        self.speed = speed

    @abstractmethod
    def start_up(self): # 추상메소드 지정
        pass

# 자식클래스
class Bus(Car):
    def start_up(self): # 추상메소드 재정의
        print(f"{self.name}의 시동이 켜졌습니다.")

my_bus = Bus("마을버스", "노랑색", "30km/h")
print("버스 이름:", my_bus.name)
print("버스 색상:", my_bus.color)
print("버스 속도:", my_bus.speed)
my_bus.start_up()

# 출력예시
# 버스 이름: 마을버스
# 버스 색상: 노랑색
# 버스 속도: 30km/h
# 마을버스의 시동이 켜졌습니다.

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글