상속(Inheritance)
- 기존의 클래스로 새로운 클래스를 작성하는것( 코드의 재사용 )
- 두 클래스를 부모와 자식으로 관계를 맺어주는것
class 자식 클래스 extends 부모 클래스 {
// ...
}
class Parent {}
class Child extends Parent {
// ...
}
Child는 Parent를 상속받고 있다
이를 상속 관계라고 한다.
- 자손은 조상(부모의 부모)의 모든 멤버를 상속받는다. ( 생성자, 초기화블럭 제외 ) 이는 선택사항이 아니라 무조건 받아야한다.
- 자손의 멤버 갯수가 조상보다 적을 수는 없다.
class Parent {
int age;
}
class Child extends Parent { }
만약 이렇다면 Child이 가지고 있는 멤버는 부모(Parent)에게 물려받은 1개가 존재한다.
- 자손의 변경은 조상에 영향을 미치지 않는다.
class Parent {
int age;
}
class Child extends Parent {
void play() {
System.out.println("놀자~");
}
}
이렇게 적혀있다면 Child는 본인의 멤버 1개 조상의 멤버 1개를 상속받아 2개가 되는것이다.
※ Child는 extends 를 통해 조상의 멤버를 상속받으며 자식의 멤버가 점점 커지는것을 볼수 있다.
이로써 extends(확장)에 대해서 알수있다.
상속의 유무 차이점
조상의 변경에 영향을 미치는 상속의 개념
2차원의 좌표가 있다.
class Point {
int x;
int y;
}
그리고 우리는 3차원 좌표 클래스를 만드려고 한다.
첫번째 방법. 클래스에 모두 적어주는것
class Point3D {
int x;
int y;
int z;
}
두번째 방법. 미리 만들어둔 Point를 상속받아 만드는 방법
class Point3D extends Point {
int z;
}
이 두개의 클래스는 Point의 영향이 다르다.
당연한 말이지만 3가지를 모두 적어놓은 클래스는 Point의 변화에 아무런 영향이 없지만
Point클래스를 상속받은 Point3D는 부모인 Point클래스의 변화에 큰 영향을 미친다.
단일 상속
- JAVA는 단일상속만을 허용한다.
class TvDVD extends Tv, DVD { // 에러
// ...
}
만약 부모가 두 개일때 문제점이 무엇이 있을까
두개의 클래스 모두 power() 메소드가 있다고 생각하자 근데 내용은 다르다면
TvDVD는 무엇을 상속 받아야할까 이는 충돌이 났다고 보고 해결을 해야하는데 만약 복잡해진다면 충돌을 해결하기
매우 어려워지면서 차라리 에러가 났다고 처리를 해버렸다.
※ 그렇다면 JAVA는 다중 상속이 안되는 문제를 어떻게 해결했을까?
1. 인터페이스를 사용한다
2. 비중이 높은 클래스 하나만 상속관계로 처리하고 나머지는 포함관계로 만든다.
포함(Composite)
- 클래스의 멤버로 참조변수를 선언하는것
class Point {
int x;
int y;
}
class Circle {
Point c = new Point();
int r;
}
차이점이 보이는가?
Circle은 Point를 포함하고 있다 이것도 Point의 멤버를 모두 사용할 수 있는것은 같다.
상속과 다를게 없다고 생각 할 수 있지만 객체를 그려보면 다른 점이 있다.
C를 다른곳에서 객체를 생성하여 사용한다는 전제를 깔고 본다면
C는 생성된 객체 C와 멤버 r을 바라보고 객체 C는 Point의 멤버 x와 y를 바라보는것이다.
즉, 구조적인 차이가 있다. 이해를 쉽게 하기 위해 굳이 적어본다면 x를 바라볼때 c.x와 c.c.x의 차이가 될 수 있다.
- 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Car {
Engine e = new Engine();
Door[] d = new Door[4];
}
이렇게 직접적으로 적거나 상속시키기에 애매한 내용들을 한곳에 몰아 넣을때 포함을 사용하기 좋다.
상속과 포함 둘 중 무엇을 언제 사용하는게 좋을까?
- 상속 관계 = 자손은 조상이다.
- 포함 관계 = 자손은 조상을 가지고 있다.
말이 조금 이상하긴 하지만 우리가 위에서 만들었던 내용을 예로 들면 훨씬 이해가 쉬울 것이다.
원(Circle)은 점(Point)이다 - 상속
원(Circle)은 점(Point)를 가지고 있다. - 포함
딱 봐도 포함이 훨씬 자연스러운 말이 되는것을 볼 수 있다. 심지어 우리가 사용하는 대부분이 포함 관계로서 사용되고 막상 상속을 다루게 되는 경우는 정말 드물것이다. 상속은 제약조건 또한 존재하기 때문에 꼭 필요할 때만 사용하자.
Object 클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 자동으로 Object클래스를 상속받는다.
class Tv {
// ...
}
class SmartTv extends Tv {
// ...
}
Tv는 부모가 없는것 처럼 보이지만
class Tv extends Object {
// ...
}
class SmartTv extends Tv {
// ...
}
이런식으로 자동으로 Object를 컴파일러가 추가해준다는것을 알수 있다.
※ 모든 클래스의 최고 조상은 늘 Object가 있다.
- 모든 클래스는 Object클래스에 정의된 11개의 메소드를 상속받는다.
'Java > 객체 지향' 카테고리의 다른 글
호출 스택(call stack) (0) | 2023.05.08 |
---|---|
메소드(ft . return 문) (0) | 2023.05.08 |
변수의 종류 (0) | 2023.05.08 |
클래스와 객체(feat. 객체 지향 언어의 역사) (0) | 2023.05.04 |
다향성 (참조변수의 형변환, instanceof 연산자) (0) | 2023.03.07 |