클래스의 관계에는 상속과 포함이 있다.
상속
- 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화 블럭은 상속받을 수 없다.)
- 자손의 멤버 개수는 조상보다 적을 수가 없다.
포함
- 클래스의 멤버로 참조변수를 선언하는 것이다.
- 적은 단위의 클래스를 만들고, 이들을 조합하여 클래스를 만든다.
클래스 간의 관계(상속과 포함) 결정?
- 상속관계: ~은 ~이다 (is-a)
- 포함관계: ~은 ~을 가지고 있다. (has-a)
아래 코드를 통해 상속관계와 포함관계의 구조적인 차이를 확인할 수 있다.
아래의 예제같은 경우에는
'원은 점을 가지고 있다' 와 같은 has-A관계가 더 적합하므로 포함관계가 더 적절한 사용예시라고 볼 수 있다.
- 상속관계 Ex
class Point {
int x;
int y;
}
class Circle extends Point {
int r;
}
public class InherianceEx{
public static void main(String[] args) {
Circle c = new Circle();
c.x = 1;
c.y = 1;
c.r = 10;
}
}
2. 포함관계 Ex
class Point {
int x;
int y;
}
class Circle {
Point p = new Point();
int r;
}
public class HasA{
public static void main(String[] args){
Circle c = new Circle();
c.p.x = 1;
c.p.y = 1;
c.r = 10;
}
}
Java는 단일상속만 허용한다.
why?
두 부모에게서 상속을 받고 싶을 때, 만약 동일한 이름을 가진 메서드가 있으면 충돌문제가 발생할 여지가 있다.
때문에, Java에서는 이러한 충돌위험을 제거하기 위해 제공하지 않는다.
그렇다면 어떤 방식으로 다중상속을 구현할 수 있을까?
- 인터페이스를 사용한다.
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
아래 예시처럼, 비중이 높은 Tv를 상속관계로 처리하고, 나머지 DVD를 포함관계로 처리한다.
class Tv {
boolean power;
int channel;
void power() {
power = !power;
}
void channelUp() {
++channel;
}
void channelDown() {
--channel;
}
}
class DVD {
boolean power;
void power() {
power = !power;
}
void play() {
}
void stop() {
}
}
class TvDVD extends Tv {
DVD d = new DVD();
void play() {
d.play();
}
void stop() {
d.stop();
}
}
'JAVA' 카테고리의 다른 글
16. super()와 super (0) | 2022.10.02 |
---|---|
15. 오버라이딩 (0) | 2022.10.02 |
13. 멤버변수의 초기화 (0) | 2022.09.25 |
12. this()와 this (0) | 2022.09.24 |
12. 생성자, 기본 생성자 (0) | 2022.09.24 |