Programming/Java

[Java] 상속관계와 포함관계

kmindev 2023. 10. 13. 18:00

남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.

 

1. 상속이란?

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
  • 두 클래스를 부모와 자식의 관계를 맺어주는 것
  • 자식은 부모의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)

 

상속을 사용한 2가지 경우를 살펴보자.

 

a. 상속 사용1

class Child extends Parent {
    void play() {
        System.out.println("play~~~~");
    }
}

class Parent {
    int age;
}
  • 상속을 구현하는 방법은 extends키워드만 함께 써주기만 하면 된다.
  • Child는 Parent를 상속받기 때문에 Parent의 모든 멤버(age)를 상속 받는다.
  • play() 메서드는 오직 Child의 멤버로만 사용된다.

 

b. 상속 사용2

public class GrandChild extends Child {
}

class Child extends Parent {
    void play() {
        System.out.println("play~~~~");
    }
}

class Parent {
    int age;
}
  • GrandChild는 Child를 상속받기 때문에 Parent의 모든 멤버(age)와 Child의 모든 멤버(play)를 상속 받는다.
  • 공통적인 부분을 부모클래스에서 관리하며, 상속관계를 적절히 맺어 주는 것이 핵심

 

2. 단일상속

  • Java는 클래스간의 관계의 복잡도를 줄이고, 메서드 출처의 모호성 등 여러가지 문제를 방지하고자 클래스틀 통한 다중 상속을 허용하지 않는다.
  • C++는 다중 상속 허용
  • 추후 인터페이스를 다룰 예정인데, 인터페이스의 경우는 다중 상속이 허용된다. (뒤에서 자세히 다루겠다.)
class Circle extends Shape, Point { // 에러
		// ...
}



3. 포함관계와  상속관계

  • 포함(Composite)
    • 한 클래스의 멤버변수로 다른 클래스를 선언하는 것
    • 작은 단위의 클래스를 먼저 만들고, 이들을 조합해서 하나의 커다란 클래스를 만든다.
    • ~은 ~을 가지고 있다.(has-a)
  • 상속(inheritance)
    • ~은 ~이다. (is-a)
class Circle extends Shape {
    Point center;
    int r;
}

class Point {
    int x;
    int y;
}

public class Shape {
    String color;
    void draw() {
        System.out.println(color + "로 도형을 그리다.");
    }
}
  • Circle has a Point(포함 관계) ⇒ 원은 점을 가지고 있다.
  • Circle is a Shape(상속 관계) ⇒ 원은 도형이다.