상속(inheritance)
상속의 정의와 장점
상속
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것,
즉 부모 클래스의 멤버를 자식 클래스에게 물려주는 것을 말한다.
- 조상 클래스 : 부모 클래스, 상위(super)클래스, 기반(base)클래스
- 자손 클래스 : 자식 클래스, 하위(sub)클래스, 파생된(derived) 클래스
- 상속계층도 : 클래스 간의 상속관계를 그림으로 표현한 것.
- 조상 클래스가 변경되면 자손 클래스를 자동적으로 영향을 받는다.
- 자손 클래스가 변경되면 조상 클래스에 아무런 영향을 주지 못한다.
- 생성자와 초기화 블럭은 상속되지 않고, 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
[접근 제한자] class 자식클래스명 extends 부모클래스명 { ... }
// 부모 클래스
public class Animal {
...
}
// 자식 클래스
public class Dog extends Animal {
...
}
장점
- 코드의 중복을 줄여준다.
- 적은 양의 코드로 새로운 클래스 작성이 가능하다.
- 상속을 통해서 연관된 클래스들에 대한 공통적인 규약을 정의할 수 있다.
- 상속을 통해서 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이하다.
- 자손 클래스의 인스턴스를 생성하면 <조상 클래스의 멤버와 + 자손 클래스의 멤버> 인 하나의 인스턴스로 생성된다.
클래스간의 관계 - 포함관계
- 클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것.
class Circle {
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int r; // 반지름
}
class Point {
int x; // x좌표
int y; // y좌표
}
class Circle {
Point c = new Point(); // 원점
int r; // 반지름
}
클래스간의 관계 설정하기
- 원(Circle)은 점(Point)이다 - Circle is a Point. (상속관계)
class Circle extends Point {
int r;
}
- 원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point. (포함관계) - 이게 더 옳다 !
class Circle {
Point c = new Point(); // 원점
int r; // 반지름
}
- 상속관계 : ~은 ~이다. (is-a)
- 포함관계 : ~은 ~을 가지고 있다. (has-a)
단일상속(single inheritance)
- 비중이 높은 클래스 하나만 상속관계로, 나머지를 포함관계로 한다.
- c++에서는 다중상속이 가능하지만 java에서는 단일상속만 허용한다.
- 다중상속은 클래스간의 관계가 복잡해지고 서로 다른 클래스에서 상속받은 멤버의 이름이 같을 때 구별할 수 없다.
- Tv클래스를 조상으로 하고, VCR클래스는 TVCR클래스를 포함시켰다.
- TVCR클래스에 VCR클래스의 메서드와 일치하는 선언부를 가진 메서드를 선언하고 내용은 VCR클래스의 것을 호출해서 사용했다.
- 외부적으로 TVCR클래스의 인스턴스를 사용하는 것처럼 보이지만 내부적으로는 VCR클래스의 인스턴스를 생성해서 사용하는 것이다.
- VCR클래스의 메서드의 내용이 변경되더라도 TVCR클래스의 메서드도 변경된 내용이 적용되는 결과를 얻을 수 있다.
Object클래스 - 모든 클래스의 조상
- 다른 클래스로부터 상속 받지 않은 모든 클래스들은 자동으로 Object클래스로부터 상속받는다.
- 자바의 모든 클래스들은 Object클래스의 멤버들을 상속 받기 때문에 Object클래스에 정의된 멤버들을 사용할 수 있다. ex) toString(), equals()
'Java' 카테고리의 다른 글
객체(Object) - package & import (0) | 2022.09.21 |
---|---|
객체(Object) - 오버라이딩(overriding) (0) | 2022.09.20 |
객체(Object) - 변수의 초기화 (0) | 2022.08.24 |
객체(Object) - 생성자(Constructor) (0) | 2022.08.24 |
객체(Object) - 오버로딩(Overloading) (0) | 2022.08.23 |