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 (상속)
- “~은 ~의 일종이다” (예:
Lionis anAnimal)
- “~은 ~의 일종이다” (예:
-
has-a (구성/Composition)
- “~은 ~을 가지고 있다” (예:
Carhas anEngine,DeckhasCards) - 한 클래스 안에 다른 클래스의 객체를 멤버 변수로 포함시키는 방식이다.
- “~은 ~을 가지고 있다” (예:
7. 다중 상속
- 다중 상속(Multiple Inheritance)
- 하나의 자식 클래스가 두 개 이상의 부모 클래스를 상속받는 것
- 예:
class MultiDerived(Base1, Base2):