상속(Inheritance) - "역 계 문 강 목 과 속 종"
정의
상속이란 객체들의 관계를 구축하는 방법으로, 어느 한 객체가 다른 한 객체의 속성과 행위를 물려받아 사용하거나 재정의하는 것이다.
예를 들어, 과학 시간에 배웠던 생물 분류에서 알 수 있듯, 하위 분류는 상위 분류의 특성을 포함하고 그 안에서 다른 특성들이 나타난다(조류의 특징은 날개가 있다는 공통점).
그런데, 조류의 날개는 다 똑같지는 않다! 종마다 모두 다른 날개의 모양과 역할을 가지고 있다. 조류의 종마다 날개가 다르듯, 상속하는 객체의 일부 속성을 재정의하여 구현하는 것이 상속이 객체들 간의 관계를 정의하는 방법이다.
왜?
코드 세계에서 공통점이란, 중복을 의미한다. 다시 한번 말하자면, 공통점(중복)은 따로 빼서 한곳에서 관리하는 것이 좋다. 이때, 상속은 상위 클래스에 중복 로직을 구현해두고 이를 물려받아 코드를 재사용하여 중복을 줄이는 역할을 한다.
예를 들어, 참새, 비둘기, 펭귄, 닭 코드에서 부리 부분에 버그가 발생했다면?
상속을 사용하지 않았다면 참새, 비둘기, 펭귄, 닭 코드를 하나하나 수정해야 하고, 다른 조류들도 찾아서 고쳐주워야 할 것이다. 그러나 상속을 사용하면, 위 클래스들이 상속받는 조류 코드에서 한 번만 수정해 주면 끝이다! 이러면 여러 번 바꿀 필요도, 실수로 수정을 빠뜨릴 일도 전혀 없다!
완벽한 설계?
생태 분류에서 흥미로운 점은 "역 계 문 강 목 과 속 종"은 태초부터 있지 않았다는 것이다. 학자들이 생물들의 공통점을 찾아 묶고 추상화하여 하나의 체계를 만들어낸 것이다. 마찬가지로, 객체들의 관계도 무조건 부모가 먼저 만들어지는 것이 아니라 객체들의 공통점을 찾아 그들의 부모를 만들어줄 수도 있는 것이다.
완벽한 설계를 하고자 구상만 하다가 끝날 수도 있다. 유지보수를 편하게 하려고 하다가 정작 개발을 못할 수도 있다. 처음부터 완벽한 설계를 하려는 강박에 휩싸이기보다는 리팩터링으로 점차 발전하는 소프트웨어를 만들자! 소프트웨어는 하드웨어와 다르게 유지보수가 용이하다!
어떻게?
JAVA 문법에서 떡하니 나오듯, extends 키워드를 사용하여 클래스를 상속받고 필요에 따라 method overriding 하면 된다. 아래 예시는 추상 클래스 Animal을 만들어 그 자식 클래스들을 만든 코드이다.
abstract class Animal {
public void sayHello() {
System.out.println("안녕~");
}
abstract void eat() ;
}
class Rabbit extends Animal{
public void eat() {
System.out.println("냠냠");
}
}
class Monkey extends Animal{
public void eat() {
System.out.println("쩝쩝");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("뇸뇸");
}
@Override
public void sayHello() {
System.out.println("안녕하십니까~");
}
}
오늘은 상속에 대해 알아보았다.
사실 OOP 특징 중 하나인 상속이긴 하지만, 상속보다는 구성이 좋다는 의견이 더 많다. 그래서 이번 글은 정성 들여 쓰지 않은 것 같다.. 다음 글은 구성에 대해 알아볼 텐데, 그때, 상속과 비교하며 다시 한번 상속을 복습하면서 진행할 것이다.
오늘 내용이 어려웠다면, "추상화", "추상 클래스", "오버라이딩", "IS-A 관계" 대해 검색해보고 다시 보면 좋을 것 같다.
더 깊게(?) 알아보고 싶다면 "super method/constructor", "HAS-A 관계" 키워드가 도움이 될지도 모르겠다.
'방법 > 객체지향프로그래밍' 카테고리의 다른 글
객체지향프로그래밍 (OOP) - 다형성 (1) | 2023.01.18 |
---|---|
객체지향프로그래밍 (OOP) - 구성 (0) | 2022.12.01 |
객체지향프로그래밍 (OOP) - 캡슐화 (2) | 2022.09.22 |
객체지향프로그래밍 (OOP) - 추상화 (0) | 2022.09.07 |
객체지향프로그래밍 (OOP) - 서문 (0) | 2022.08.22 |