1. 상속의 개념과 필요성

  • 정의

    • 기존에 존재하는 클래스(부모)로부터 코드와 데이터를 이어받고,
    • 필요한 기능을 추가하여 새로운 클래스(자식)를 만드는 기법
  • 목적

    • 코드 재사용: 중복된 코드를 줄이고 부모 클래스에 공통 기능을 모아 관리할 수 있다.
    • 확장성: 기존 클래스를 수정하지 않고 기능을 확장할 수 있다.
  • 관계

    • “is-a” 관계 (상속 관계)가 성립할 때 사용한한다.
    • 예: 자동차는 차량이다(Car is a Vehicle), 푸들은 강아지이다.

2. 상속 구현 방법

class Car: # 일반적인 자동차를 나타내는 클래스
	def __init__(self, make, model, color,  price):
		self.make = make   # 메이커
		self.model = model # 모델
		self.color = color # 자동차의 색상
		self.price = price # 자동차의 가격
 
	def setMake(self, make): # 설정자 메서드
		self.make = make
 
	def getMake(self): # 접근자 메서드
		return self.make
 
	def getDesc(self): # 차량 정보를 문자열로 요약 반환
		return "차량 =("+str(self.make)+","+\
						str(self.model)+","+\
						str(self.color)+","+\
						str(self.price)+")"
  • 문법

    • class 자식클래스(부모클래스): 형태로 정의한다.
  • 용어

    • 부모 클래스 = 슈퍼 클래스(Super Class) = 기반 클래스(Base Class)
    • 자식 클래스 = 서브 클래스(Sub Class) = 파생 클래스(Derived Class)
  • 생성자 호출 (super())

    • 자식 클래스의 __init__ 메소드에서 부모 클래스의 __init__을 호출해야 부모의 속성이 올바르게 초기화된다.
    • super().__init__(인자) 형식을 사용한다.
    • 주의: 부모 생성자를 호출하지 않으면 부모 클래스의 인스턴스 변수가 생성되지 않아 오류가 발생할 수 있다.
class ElectricCar(Car):
	def __init__(self, make, model, color, price, batterySize):
		super().__init__(make, model, color, price) # 생성자 호출(출제)
		self.batterySize = batterySize
 
	def setBatterySize(self,  batterySize): # 설정자 메서드
		self.batterySize = batterySize
 
	def getBtterySize(self): # 접근자 메서드
		return self.batterySize
  • 타입 확인

    • type(obj): 객체의 정확한 클래스 타입을 반환
    • isinstance(obj, Class): 객체가 해당 클래스(또는 부모 클래스)의 인스턴스인지 확인 (True/False)
  • 접근 제어

    • 부모 클래스의 private 멤버(예: __money)는 상속되더라도 자식 클래스에서 직접 접근할 수 없다.
def main(): # main() 함수 정의
	myCar = ElectricCar("Tisla", "Model S", "white", 10000, 0) # 객체 생성
	myCar.setMake("Tesla")   # 설정자 메서드 호출
	myCar.setBatterySize(60) # 설정자 메서드 호출
	print(myCar.getDesc())   # 트럭 객체를 문자열로 출력
 
main()

3. 메소드 오버라이딩

  • 메소드 오버라이딩(Method Overriding)

    • 부모 클래스에 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것
  • 특징

    • 메소드 이름과 매개변수가 같아야 한다.
    • 자식 클래스의 필요에 맞춰 기능을 변경하거나 확장할 때 사용한다.
    • 자식 메소드 내에서 super().메소드명()을 통해 부모의 원본 메소드를 호출할 수도 있다.

4. 다형성

  • 다형성(Polymorphism)

    • “여러 가지 형태를 가짐”이라는 의미
    • 하나의 식별자(함수명 등)가 객체의 타입에 따라 다른 행동을 하는 것을 말한다.
  • 예시

    • Shape 클래스를 상속받은 Circle, Rectangle이 각각 draw() 메소드를 다르게 구현한 경우
    • 리스트에 여러 도형 객체를 담고 반복문으로 draw()를 호출하면 각자 맞는 도형을 그린다.
shapeList = [ Circle("c1", 10), Rectangle("r1", 10, 10) ]
for s in shapeList:
	print(s.getArea())
  • 내장 함수의 다형성
    • len() 함수는 리스트(항목 수), 문자열(길이), 딕셔너리(키 개수) 등 다양한 타입에 대해 동작한다.

5. Object 클래스

  • 파이썬의 모든 클래스는 암묵적으로 최상위 클래스인 object 클래스를 상속받는다.

  • Object 클래스 메서드

    • __init__(self, args): 생성자
    • __del__(self): 소멸자
    • __repr__(self): 개발자가 객체를 식별하기 위한 공식적인 문자열 표현을 반환
    • __str__(self): 사용자가 보기 편한 문자열 표현을 반환 (print() 함수 호출 시 사용)
    • __cmp__(self, x): 객체 비교

6. 클래스 간의 관계

  • is-a (상속)

    • “~은 ~의 일종이다” (예: Lion is an Animal)
  • has-a (구성/Composition)

    • “~은 ~을 가지고 있다” (예: Car has an Engine, Deck has Cards)
    • 한 클래스 안에 다른 클래스의 객체를 멤버 변수로 포함시키는 방식이다.

7. 다중 상속

  • 다중 상속(Multiple Inheritance)
    • 하나의 자식 클래스가 두 개 이상의 부모 클래스를 상속받는 것
    • 예: class MultiDerived(Base1, Base2):