Java

객체(Object) - 상속(inheritance)

제주니어 2022. 9. 19. 21:43

상속(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()