상속의 정의와 장점
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 유리하다.
이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
상속 구현
새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 써주면 된다.
class Child extends Parent {
// ...
}
이 두 클래스는 서로 상속 관계에 있다고 하며,
상속해주는 클래스를 '조상(or 부모, 상위, 기반) 클래스'라 하고
상속받는 클래스를 '자손(or 자식, 하위, 파생된) 클래스'라고 한다.
자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 되지만, 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
- 생성자와 초기화 블록은 상속되지 않는다.
- 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
- 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
클래스 간의 관계 - 포함관계
상속 이외에 클래스를 재사용하는 방법은 클래스 간에 '포함(Composite)'관계를 맺어 주는 것이다.
클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버 변수로 다른 클래스 타입의 참조 변수를 선언하는 것을 뜻한다.
class Circle {
int x;
int y;
int r;
}
class Point {
int x;
int y;
}
Point클래스를 재사용해서 Circle클래스를 작성한다면 다음과 같이 할 수 있다.
class Circle {
Point c = new Point();
int r;
}
한 클래스를 작성하는 데 다른 클래스를 멤버 변수로 선언하여 포함시키는 것은 좋은 생각이다. 하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다. 또한 작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용될 수 있을 것이다.
클래스 간의 관계 결정하기
클래스를 작성할 때 상속 관계를 맺어 줄 것인지 포함 관계를 맺어 줄 것인지 결정하는 것이 헷갈릴 수 있다.
위의 Circle클래스는 Point클래스를 포함시키지 않고 상속관계를 맺어 주었다면 다음과 같을 것이다.
class Circle extends Point {
int r;
}
포함이나 상속이나 별 차이가 없어 보인다.
이럴 때 '~은 ~이다(is-a)'와 '~은 ~을 가지고 있다(has-a)'를 넣어서 문장을 만들어 보면 클래스 간의 관계가 보다 명확해진다.
- 원은 점이다. Circle is a Point.
- 원은 점을 가지고 있다. Circle has a Point.
위 두문장을 비교해보면 첫 번째 문장보다 두 번째 문장이 더 옳다는 것을 알 수 있다.
'~은 ~이다.'라는 문장이 성립한다면, 서로 상속관계를,
'~은 ~을 가지고 있다.'라는 문장이 성립한다면 서로 포함관계를 맺어 주면 된다.
단일 상속(single inheritance)
자바에서는 오직 단일 상속만을 허용한다.
다중 상속의 장점
복합적인 기능을 가진 클래스를 쉽게 작성할 수 있음.
다중 상속의 단점
- 클래스 간의 관계가 매우 복잡해짐.
- 다른 클래스로부터 상속받은 멤버 간의 이름이 같은 경우 구별 불가.
단일 상속의 장점
- 클래스 간의 관계가 명확해짐
- 코드의 신뢰성 증가.
Object클래스 - 모든 클래스의 조상
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다.
다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받는다.
toString()이나 equals(Object o)와 같은 메서드를 따로 정의하지 않고도
사용할 수 있었던 이유는 이 메서드들이 Object클래스에 정의된 것들이기 때문이다.