클래스 상속과 오버라이딩: 객체 지향 프로그래밍에서 핵심 기능 이해
클래스 상속이란?
클래스 상속(Class Inheritance)은 객체 지향 프로그래밍(OOP, Object-Oriented Programming)에서 중요한 문법적 요소입니다. 클래스 상속은 하나의 클래스에서 다른 클래스의 속성과 기능을 가져오는 과정으로, 기존 클래스를 재사용하거나 확장할 때 유용합니다. 상속을 이해하기 위해서는 크게 네 가지 주요 개념을 알아야 합니다.
- 클래스(class): 서로 관련된 데이터와 함수를 그룹화하여 객체를 생성하는 데 사용된다.
- 객체(object): 클래스를 통해 생성된 인스턴스로, 실제로 메모리에 저장되며 내부적으로 상태를 가지고 있다.
- 메서드(method): 클래스 내에서 정의된 함수로, 해당 객체의 행위를 나타낸다.
- 상속(Inheritance): 기존 클래스를 기반으로 새로운 클래스를 생성하는 프로세스이다. 상속을 통해 기존 클래스의 속성과 메서드를 새로운 클래스에서 재사용할 수 있습니다.
상속된 클래스를 부모 클래스, 기본 클래스 또는 슈퍼 클래스라고 합니다. 반면, 새로운 클래스를 자식 클래스, 파생 클래스 또는 서브 클래스라고 합니다.
- 부모 클래스(Parent, Superclass, Base class): 기존 코드를 물려주는 기본 클래스입니다. 다른 클래스에서 이 클래스의 메서드와 속성을 상속받아 사용할 수 있습니다.
- 자식 클래스(Child, Subclass, Derived class): 부모 클래스를 상속받아 새로 생성된 클래스입니다. 부모 클래스의 속성과 메서드를 상속받을 뿐만 아니라 추가적인 속성 및 메서드를 정의할 수 있습니다.
상속의 주요 목적은 코드 재사용 및 유지 보수를 용이하게 하는 것입니다. 상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스에서 상속받아 사용할 수 있으므로 코드 중복을 줄이고, 프로그램 구조를 깔끔하게 유지할 수 있습니다. 또한 상속을 통해 클래스 간의 계층 구조를 만들어, 쉽게 모듈화 하고 확장할 수 있습니다.
오버라이딩(Overriding)이란?
오버라이딩(Overriding)은 자식 클래스에서 부모 클래스의 메서드를 수정하거나 확장하는 기법입니다. 자식 클래스는 상속받은 메서드를 그대로 사용할 수도 있지만, 경우에 따라 새로운 기능을 요하거나 부모 클래스의 메서드를 수정해야 하는 상황이 발생할 수 있습니다. 이때 오버라이딩을 이용해 부 클래스의 메서드를 재정의하여 사용합니다.
오버라이딩을 하는 경우, 자식 클래스에서 부모 클래스의 메서드와 동일한 메서드 이름, 매개변수, 반환 형식을 사용해야 합니다. 그렇게 해야만 컴파일러가 부모 클래스의 메서드를 재정의하는 것으로 인식하고, 자식 클래스의 메서드로 대체하여 호출합니다.
오버라이딩의 몇 가지 주요 기능과 특징은 다음과 같습니다.
- 코드 재사용성 증가: 부모 클래스의 사항들을 재사용함으로써 중복을 줄여줍니다.
- 관심사의 분리: 클래스 계층 구조와 추상화를 활용해 도메인 전문가와 개발자가 하위 클래스에만 집중하여 작업할 수 있게 도와줍니다.
- 다형성 향상: 오버라이딩은 다형성을 활용하여 여러 클래스가 인터페이스를 제공하면서도 각 클래스의 동작을 고유한 방식으로 구현할 수 있게 해줍니다.
- 상속의 문제 수정: 부모 클래스의 구현이 자식 클래스에게 적합하지 않은 경우에도 오버라이딩을 통해 해결할 수 있습니다.
클래스 상속의 주요 장점
클래스 상속은 객체 지향 프로그래밍에서 다음과 같은 주요 장점을 제공합니다.
- 코드 재사용성: 상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스에서 사용할 수 있으므로, 프로그램 전체에서 반복되는 코드를 줄이고 코드의 재사용성을 높일 수 있습니다.
- 유지 보수: 부모 클래스에서 일부 코드를 수정하는 경우, 해당 부분을 상속받은 모든 자식 클래스에서 자동으로 수정됩니다. 이로 인해 프로그램 전체의 유지 관리가 용이해집니다.
- 확장성: 기존 클래스를 변경하지 않고도 새로운 기능을 추가할 수 있어, 프로그램의 확장성이 좋아집니다. 상속을 이용하면 새로운 클래스를 생성하면서도 기존 클래스의 코드를 재사용할 수 있으므로, 프로그램을 더욱 빠르게 개발하고 확장할 수 있습니다.
오버라이딩의 주요 장점
오버라이딩은 객체 지향 프로그래밍에서 다음과 같은 주요 장점을 제공합니다.
- 메서드 수정: 자식 클래스는 부모 클래스의 메서드를 수정하여 더 구체적인 기능이나 특수한 요구 사항을 충족시킬 수 있습니다. 이렇게 함으로써 프로그램의 유연성이 높아지고, 필요한 기능을 더 쉽게 구현할 수 있습니다.
- 코드의 중복 최소화: 자식 클래스에서 큰 부분이 동일하거나 비슷한 기능을 구현할 때, 오버라이딩을 사용하면 중복 코드를 최소화할 수 있습니다.
클래스 상속과 오버라이딩 실습 예제
다음은 파이썬(Python)을 사용해 클래스 상속과 오버라이딩을 실습하는 간단한 예제입니다.
# 부모 클래스
class Vehicle:
def __init__(self, manufacturer, model, color):
self.manufacturer = manufacturer
self.model = model
self.color = color
def start(self):
return f"{self.manufacturer} {self.model} 시동을 켭니다."
def stop(self):
return f"{self.manufacturer} {self.model} 시동을 끕니다."
# 자식 클래스 1
class Car(Vehicle):
def __init__(self, manufacturer, model, color, number_of_doors):
super().__init__(manufacturer, model, color)
self.number_of_doors = number_of_doors
def start(self):
return f"{self.manufacturer} {self.model} 자동차 시동을 켭니다."
# 자식 클래스 2
class Motorcycle(Vehicle):
def __init__(self, manufacturer, model, color, engine_size):
super().__init__(manufacturer, model, color)
self.engine_size = engine_size
def start(self):
return f"{self.manufacturer} {self.model} 오토바이 시동을 켭니다."
def wheelie(self):
return f"{self.manufacturer} {self.model} 오토바이가 윌리를 합니다."
car = Car("Tesla", "Model Y", "Black", 4)
motorcycle = Motorcycle("Yamaha", "R1", "Blue", 1000)
print(car.start())
print(motorcycle.start())
print(car.stop())
print(motorcycle.stop())
print(motorcycle.wheelie())
이 예제에서 Vehicle 클래스가 부모 클래스로, Car와 Motorcycle 클래스가 자식 클래스입니다. 각 자식 클래스는 부모 클래스에 있는 start() 및 stop() 메서드를 상속받아 사용합니다. 이에 추가로 Car 클래스에서는 start() 메서드를 오버라이딩하여 자동차에 특화된 시작 메시지를 출력하게 합니다. Motorcycle 클래스는 start() 메서드를 오버라이딩하고, wheelie() 메서드를 새로 추가하여 특정한 기능을 구현하고 있습니다. 오버라이딩을 통해 자식 클래스는 부모 클래스의 메서드를 자신에 맞게 수정하여 사용합니다.
'programming language > Python' 카테고리의 다른 글
Python- QT 디자이너를 활용하여 계산기 만들기 (0) | 2023.09.03 |
---|---|
Python - 클래스 상속, 오버라이딩, 다중 상속을 활용한 객체 지향 디자인 (0) | 2023.08.04 |
Python - Class의 생성자와 소멸자 (0) | 2023.07.28 |
파이썬에서 쿼리문 사용하기 - Python (0) | 2023.07.25 |
Python - Class 변수 및 인스턴스 (0) | 2023.07.21 |