상속
: 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
장점
- 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성을 높이고 유지보수를 편리하게 한다.
사용법
- extends 상속 받고자하는 클래스명
- 상속을 받는다 = 조상클래스를 확장한다 => extends
class Parent {...}
class Child extends Parent {...}
- 위 두 클래스는 서로 상속관계에 있다고 하며, 상속해주는 클래스를 '조상클래스'라 하고 상속받는 클래스를 '자손클래스'라고 한다.
조상 클래스 : 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손 클래스 : 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스
- Child클래스는 Parent클래스의 모든 멤버들을 포함한다.
- 조상클래스가 변경되면 자손클래스는 자동적으로 영향을 받게되지만, 자손클래스가 변경되는 것은 조상클래스에 아무런 영향을 주지 않는다.
특징
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
- 자바에서는 오직 단일 상속만을 허용한다. 둘 이상의 클래스로부터 상속 받을 수 없다.
class Parent() { ... }
class Child extends Parent { ... }
class Child2 extends Parent2 { ... }
class GrandChild extends Child { ... }
- 클래스 child와 child2는 서로 아무런 관계도 성립되지 않는다.
- child와 child2에 공통적으로 추가되어야 할 멤버나 메서드가 있다면, 공통조상인 parent에 추가하는 것이 좋다
- 이를 통해, 같은 내용의 코드를 한곳에서 관리하여 코드의 중복이 최소화된다는 장점이 있다.
- GrandChild클래스는 Parent클래스와 간접적인 상속관계에 있다 :GrandChild클래스는 Child의 자손이면서, Parent의 자손이다.
- 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.
* 모든 클래스의 조상 < Object 클래스 >
- Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 클래스이다.
- 다른 클래스로부터 상속받지 않은 모든 클래스는 자동적으로 Object클래스로부터 상속받게 하였다.
( 이미 어떤 클래스로부터 상속받도록 작성된 클래스에 대해서는 컴파일러가 'extends Object'를 추가하지 않는다. )
- 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속받기 때문에 Object 클래스에 정의된 멤버들을 사용할 수 있다.
- toString()이나 equals(Object o)와 같은 메서드를 따로 정의하지 않고 사용할 수 있었던 이유다.
포함
: 기존의 클래스를 재사용하는 다른 방법
클래스 간의 포함관계를 맺는다 -> 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언한다.
class Point{
int x;
int y;
}
class Circle{
//int x;
//int y;
Point c= new Point();
int z;
}
- 포함 관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있고, 재사용하기 쉽다.
상속 vs 포함
상속관계를 맺어 줄 것인지 포함관계를 맺어줄것인지 혼돈스러울 때
상속 : ~은 ~이다 (is -a) 관계가 성립하면 상속관계를 맺어준다.
포함 : ~은 ~을 가지고 있다 (has -a) 관계가 성립하면 포함관계를 맺어준다.
ex. 원은 점이다 (is-a). : X
원은 점을 가지고 있다 (has -a) : O
-> 원은 점과 포함관계를 맺는것이 옳다.
'JAVA > JAVA 기본정리' 카테고리의 다른 글
제어자/ static / final/ abstract / public / protected/ default / private (0) | 2022.06.02 |
---|---|
오버라이딩(overriding) / 오버로딩 (overloading) / super / super() (0) | 2022.05.31 |
열거형(Enums) (0) | 2022.05.30 |
JVM의 메모리구조 (0) | 2022.05.28 |
Comparator/ Comparable / Sort / 내림차순 (0) | 2022.05.17 |