기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
[장점]
[작성 방법]
extends를 적어주면 된다.
class Child extends Parent{
}
[용어]
조상 클래스: 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
자손 클래스: 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스
[관계]
class Parent { // 부모 클래스
int age;
}
class Child extends Parent() { // 자식 클래스
void play() {
}
}
Parent 클래스의 멤버: age
Child 클래스의 멤버: age, play()
-생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
-자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
class GrandChild extends Child {
}
💡 전체 프로그램을 구성하는 클래스들을 면밀히 설계 분석하여, 클래스간의 상속 관계를 적절하게 맺어 주는 것이 객체지향 프로그래밍에서 가장 중요한 부분
상속 외에 클래스를 재사용하는 또 다른 방법은 클래스간에 포함(Composite)관계를 맺어주는 것이다.
포함 전
class Circle {
int x;
int y;
int r;
}
class Point {
int x;
int y;
}
포함 후
class Circle {
Point c = new Point();
int r;
}
하나의 거대한 클래스를 작성하는 것 보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다.
클래스를 작성할 때 상속 관계를 맺어줄 것인지 포함 관계를 맺어줄 것인지 혼란스러울 수 있다.
💡 문장을 만들어보자!
'~은 ~이다.' 라는 문장이 성립한다면, 상속 관계를 맺어준다.
'~은 ~을 가지고 있다.' 라는 문장이 성립한다면 포함 관계를 맺어준다.
예) 원은 점이다. (Circle is a Point)
원은 점을 가지고 있다. (Circle has a Point) -> 성립
class Tv {
}
// 컴파일을 하면 컴파일러는 자동으로 extends Object를 추가
class Tv extends Object {
}
toStirng()이나 equals(Object o)와 같은 메서드를 따로 정의하지 않고 사용할 수 있었던 이유는 이 메서드들이 Object 클래스에 정의된 것들이기 때문이다.