JAVA/JAVA 기본정리

상속(inheritance) / 포함(Composite) 관계

hyun-1200 2022. 5. 31. 18:45

상속

: 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

장점 

  • 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성을 높이고 유지보수를 편리하게 한다.

사용법

- 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 

-> 원은 점과 포함관계를 맺는것이 옳다.