본문 바로가기
Study/JAVA

[Java] 7-1. 상속(inheritance)

by jeongwle 2022. 9. 3.
728x90
반응형

 

상속(inheritance)

1. 상속의 정의와 장점

상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있어 코드의 추가 및 변경이 용이하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거해 프로그램의 생산성과 유지보수에 크게 기여한다. 상속을 구현하는 방법은 새로운 클래스 이름 뒤에 상속받고자 하는 클래스의 이름을 extends 키워드와 함께 쓰면 된다.
class Child extends Parent {
  ...
}​

두 클래스 Child와 Parent는 상속 관계에 있다. 상속해주는 클래스를 조상 클래스 상속 받는 클래스를 자손 클래스라 한다.
조상 클래스  부모 클래스, 상위 클래스, 기반 클래스
자손 클래스  자식 클래스, 하위 클래스, 파생 클래스​

하지만 나는 상위 클래스, 하위 클래스에 익숙하기 때문에 상위 클래스, 하위 클래스로 하겠다.
하위 클래스는 상위 클래스의 모든 멤버를 상속받는다. 하위 클래스는 상위 클래스의 멤버들을 포함한다고 할 수 있다. 상위 클래스에 새로운 멤버가 추가 되면 하위 클래스에도 똑같이 추가되는 효과를 얻는다. 반면에 하위 클래스에 새로운 멤버를 추가 하여도 상위 클래스에는 아무런 영향을 주지 않는다.  상속을 거듭할수록 상속받는 하위 클래스의 멤버 개수는 점점 늘어난다. 그래서 상속이란 것이 상위 클래스를 확장(extend)한다는 의미로 해석할 수 있고, 키워드가 extends 이유기도 하다.
생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
하위 클래스의 멤버 개수는 상위 클래스보다 항상 같거나 많다.​

 

2. 클래스간의 관계 - 포함관계

상속이외에도 클래스를 재사용하는 또 다른 방법은 클래스 간 포함(Composite)관계를 맺어주는 것이다. 클래스 간 포함관계를 맺어주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것이다.
class Point {
  int x;
  int y;
}

class Circle {
  Point c = new Point();
  int r;
}​

이와 같이 한 클래스를 작성하는 데 다른 클래스를 멤버변수로 선언하여 포함시키는 것은 좋은 생각이다. 단위별로 여러 클래스를 작성한 후 포함관계로 재사용하면 간결하고 손쉽게 클래스를 작성할 수 있다. 또 작성된 단위 클래스들은 또 다른 클래스를 작성하는데 재사용 될 수 있다.

 

3. 클래스간의 관계 결정하기

클래스를 작성하는데 상속관계를 이용할 지 포함관계를 이용할 지 결정하는 것이 힘들 수 있다. 이 책에서 추천하는 방법은 is-a vs has-a 이다. 위에서 다룬 원을 예시로 들어 보겠다.
원은 점이다. - circle is a point
원은 점을 가지고 있다. - circle has a point​

두 번째 문장이 좀 더 자연스럽다. 그렇다면 포함관계를 맺는 것이 옳다. is-a 관계가 자연스럽다면 상속관계를 has-a 관계가 자연스럽다면 포함관계를 맺어주는 것이 옳다.

 

4. 단일 상속(single inheritance)

자바에서는 오직 단일 상속만을 허용한다. 둘 이상의 클래스로부터 상속을 받을 수 없다. 다중상속을 허용하면 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만 클래스간 관계가 매우 복잡해지고 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다.

 

5. Object클래스 - 모든 클래스의 조상

Object클래스는 모든 클래스 상속계츠동의 최상위에 있는 상위 클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동으로 Object클래스로부터 상속받게 된다. 자바의 모든 클래스들은 Object클래스에 정의된 멤버들을 사용할 수 있다. toString()이나 equals(Object o)등의 메서드를 따로 정의하지 않고 사용할 수 있었던 이유가 이 메서드들이 Object클래스에 정의된 것들이기 때문이다. 

Object클래스에는 모든 인스턴스가 가져야할 기본적인 11개의 메서드가 정의되어 있다. 이에 대해서는 9장에서 학습하게 될 것이다.
728x90
반응형

'Study > JAVA' 카테고리의 다른 글

[Java] 7-3. package와 import  (0) 2022.09.05
[Java] 7-2. 오버라이딩(overriding)  (0) 2022.09.03
[Java] 6-5, 6. 생성자 & 변수의 초기화  (0) 2022.09.02
[Java] 6-4. 오버로딩(overloading)  (0) 2022.09.02
[Java] 6-3. 변수와 메서드  (0) 2022.09.02

댓글