목차
1. 상속 관계
2. 포함 관계
class Parent {}
class Child extends Parent ()
특징
1. 자손은 조상(부모의 부모...모든 부모들)의 모든 멤버를 상속받는다.(생성자, 초기화 블럭 제외
)
2. 자손의 변경은 조상에 영향을 미치지 않는다.
class Point2D {
int x;
int y;
}
class Point3D extends Point2D {
int z;
}
class Point3D { // 위 3D와 똑같다. 단 위 클래스는 부모 클래스에 영향을 받는다.
int x;
int y;
int z;
}
Point2D
가 바뀌면 Point3D
의 멤버도 바뀐다.
Point3D
가 바뀌어도 Point2D
의 멤버는 바뀌지 않는다.
class Circle { // 포함관계
Point c = new Point();
int r;
}
class Circle extends Point { // 상속관계
int r;
}
class Point {
int x;
int y;
}
상속관계, 포함관계는 어떤 기준으로 결정하나요?
상속관계: A은 B이다 ->class A extends B {}
(is)
포함관계: A은 B을 가지고 있다. ->class A {B b = new B();}
(have)
위 circle과 point 관계로 예시로 본다면
1. Circle은 Point이다.(상속관계)
2. Circle은 Point를 가지고 있다.(포함관계)
위를 보면 2번인 포함관계가 문맥상 맞기 때문에 포함관계로 작성하는 것이 좋습니다.
대부분은 포함관계로 작성하게 됩니다. 왜냐하면 상속관계에는 제약이 많기 때문이에요.
Java는 다중 상속이 안되고 단일 상속만을 허용합니다!
왜 단일 상속만 허용할까요?
다중 상속일 때의 장점은 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있습니다.
하지만 만약 조상의 클래스 둘 다 같은 이름의 멤버를 가지고 있다고 가정한다면 상속받는 클래스에서 해당 멤버를 호출할 때 어떤 조상 클래스의 멤버를 가지고 올지 에매해집니다.
만약 같은 이름의 메서드를 가지고 있을 때 어떤 조상의 메서드인지 구별할 방법이 없습니다.
클래스 메서드(static)라면 조상 클래스이름을 앞에 작성하면 되지만 인스턴스 메서드라면 구별할 수 없습니다.
따라서 다중상속에 비해 불편한 점도 있지만 클래스 간의 관계가 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 주는 점에서 장점이 있습니다.
그렇다면 Java에서 다중 상속이 필요한 경우는 어떡하나요?
인터페이스를 사용하여 다중 상속 문제를 해결합니다.
또 다른 방법은 비중이 높은 클래스 하나만 상속 관계, 그리고 나머지는 포함 관계로 하면 됩니다.