상속에 대해 알아보자!
자식 extends 부모
class Child extneds Paraent {
// ...
}
- 조상 클래스
- 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
- 자손 클래스
- 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스
왜 상속을 할까? 공통로직을 다루기위해서다. 작성한 코드에서 부모와 자식의 설정에 논리적 결함이 없다면, 많은 자식들의 공통된 코드를 한 클래스에서 변경할 수 있다.
한 부모의 공통 멤버를 50명의 자식 객체가 사용하고 있고, 그 자식 객체가 500번 호출되고 있는 상황에서, 기능의 변경이 있다면 25000 부분의 코드 수정을 고려해야 한다. 그러나 그들이 상속을 받고 있다면? 부모 클래스 파일만 수정하면 된다.
클래스의 관계는 상속과 포함, 이렇게 2가지가 있다. 포함에 대해 알아보자.
포함(Composite)
- 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
class Circle {
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int r; // 반지름(radius)
}
위의 코드를, 아래처럼 Circle이 Point를 포함하도록 변경할 수 있다.
class Point {
int x; // x좌표
int y; // y좌표
}
class Circle {
Point c = new Point(); //인스턴스 생성
int r;
}
하나의 거대한 클래스를 단위별로 여러개의 클래스로 작성한 다음, 이 단위 클래스를 포함관계로 재사용하면 효과적이다.
앞서 언급했듯이 클래스 간의 관계에는 상속과 포함이 있다. 하나씩 살펴보자.
원은 도형이다. (Circle is a Shape)
class Circle extends Shpae {}
원은 점을 가지고 있다. (Circle is a Point)
class Circle {
Point c = new Point();
int r
}
어느 관계가 적절한지 의아할때는 어떤 표현이 더 적절한지 비교해보면 된다(가지다has인지, 이다is인지). 상속은 특이 케이스이고, 보통 포함 관계가 빈번하게 사용된다.
class TvDVD extends Tv, DVD {} // 에러. 조상은 하나만 허용된다.
extends Object
를 추가해준다.