우리는 현실 세계에서의 상속에 대해서는 잘 알고 있습니다.
우리는 부모에게서 재산을 상속받을 수 있으며 상속된 재산에 우리가 벌어들인 새로운 재산을 추가할 수 있습니다.
상속을 이용하면 쉽게 재산을 모을 수 있는 것처럼 소프트웨어도 쉽게 개발할 수 있습니다.
객체 지향 프로그래밍에도 비슷한 개념이 존재합니다. 상속(inheritance)은 기존에 존재하는 클래스로부터 코드와 데이터를 이어받고 자신이 필요한 기능을 추가하는 기법입니다.
상속은 이미 작성된 검증된 소프트웨어를 재사용할 수 있어서 신뢰성 있는 소프트웨어를 손쉽게 개발, 유지 보수할 수 있게 해주는 중요한 기술입니다.
또한 상속을 이용하면 여러 클래스에 공통적인 코드들을 하나의 클래스로 모을 수 있어서 코드의 중복을 줄일 수 있습니다.
예를 들어서 여러 종류의 자동차를 취급하는 자동차 판매점을 위한 파이썬 프로그램을 작성한다고 생각합시다. 승용차, 트럭, 버스는 모두 차량의 일종입니다.
또 스포츠카는 승용차의 일종이라고 할 수 있습니다. 따라서 상속 계층도를 그리면 아래와 같습니다.
부릉부릉
많이 등장하는 부모 클래스와 자식 클래스의 예를 표로 정리하여 보면 아래와 같습니다. 대개 부모 클래스는 추상적이고 자식 클래스는 구체적입니다.
| 부모 클래스 | 자식 클래스 |
|---|---|
| Animal(동물) | Lion(사자), Dog(개), Cat(고양이) |
| Bike(자전거) | MountainBike(산악자전거), RoadBike, TandemBike |
| Vehicle(탈 것) | Car(자동차), Bus(버스), Truck(트럭), Boat(보트), Motorcycle(오토바이), Bicycle(자전거) |
| Student(학생) | GraduateStudent(대학원생), UnderGraduate(학부생) |
| Employee(직원) | Manager(학생) |
| Shape(도형) | Rectangle(사각형), Triangle(삼각형), Circle(원) |
하나의 객체가 다른 객체의 특수한 버전일 때, 그들 사이에는 "is-a" 관계가 있다고 합시다. 예를 들어, 강아지는 동물입니다. 다음은 몇 가지 "is-a" 관계의 예입니다.
"is-a" 관계가 객체 간에 존재할 때, 이것은 특수한 객체가 일반적인 객체에 추가적으로 특별한 특성을 가지고 있음을 의미합니다.
객체 지향 프로그래밍에서는 상속이 클래스 간의 "is-a" 관계를 생성하는데 사용됩니다. 이것은 보통 자식 클래스가 부모 클래스의 기능을 확장한다고 이야기합니다.
상속은 부모 클래스와 자식 클래스로 이루어집니다. 부모 클래스는 일반적인 클래스이고 자식 클래스는 특수한 클래스입니다.
자식 클래스를 부모 클래스의 확장 버전으로 생각할 수 있습니다. 자식 클래스는 코드의 재작성없이 부모 클래스의 속성과 메소드를 상속합니다.
또한 새로운 속성 및 메소드가 추가될 수 있습니다. 이 추가된 속성과 메소드가 자식 클래스를 부모 클래스의 특수한 버전으로 만듭니다.
부모 클래스는 수퍼 클래스 또는 기저 클래스(base class)라고도 불립니다. 자식 클래스는 서브 클래스 또는 파생 클래스(derived class)라고도 합니다.