본문 바로가기
개발/JAVA

[Java]객체지향 언어-4(상속/ 포함 등 클래스간의 관계)

by Develaniper 2021. 5. 16.

- chapter7 -

1. 상속(inheritance)

기존의 클래스를 재사용 하여 새로운 클래스를 작성하는 것으로 상속을 사용하면 다음과 같은 장점이 있다.

 - 보다 적은 양의 코드로 새로운 클래스 작성 가능

 - 코드를 공통으로 관리 할 수 있어 코드 추가/수정이 용이하다.

 - 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성/ 유지보수에 기여

 

 1-1 상속 방법

class Parent{
    // ...
}
class Child extends Parent{
    // ...
}

Parent 를 상속하여 Child class를 만드려면 extends Parent를 뒤에 추가해 주면 된다.

이때 Parent와 Child는 아래와 같이 부른다.

Parent 조상클래스, 부모(Parent)클래스, 상위(super)클래스, 기반(base)클래스
Child 자손클래스, 자식(child)클래스, 하위(sub)클래스, 파생(derived)클래스

 

이 관계를 그림으로 표현하면 다음과 같다.

 자식클래스가 부모클래스 보다 더 많은 내용을 가지고 있으며(상속했으니 Parent의 멤버는 모두 가지고 있으며 거기에 추가적인 멤버를 구성)화살표를 통해 어떤 클래스를 상속하는지를 표현한다.

class Parent{
    int parInt;
    void parMethod(){
        System.out.println("부모 메서드");
    }
}
class Child extends Parent{
    void ChildMethod(){
        System.out.println("자식 메서드");
    }
}

 위와같이 클래스를 작성했을 때는

Parent의 인스턴스는 부모클래스의 멤버들인 parInt, parMethod만 사용할 수 있지만

Child메서드는 자신의 멤버인 ChildMethod 뿐만아니라 부모클래스의 멤버인 parInt와 parMethod까지 사용할 수 있는 것을 알 수 있습니다.

 

 여기서 추가로 알 수 있는 것은 부모클래스가 변경되면 자식클래스에 영향이 가지만 자식 클래스가 바뀌면 부모클래스에는 영향이 가지 않고 자식 클래스만 변경된다는 것입니다.

 

 

 만일 부모클래스를 상속받아 2개의 자식클래스가 만들어진다면 어떻게 될까요?

 

직접적인 관계가 성립하지 않아 Parent가 변경되면 Child1, Child2에 영향이 가지 않고 Child1이 변경 됐을 경우 Child1만, Child2가 변경됐을 경우 Child2만 영향을 받습니다.

 

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

 상속이 아니더라도 클래스 간의 관계를 맺는 방법이 있는데요. 바로 포함관계를 사용하는 것입니다.

 즉, A클래스에 B클래스의 기능을 이용하고 싶을 때 A의 멤버 변수로 B를 넣어 주는 것입니다.

class Circle{
    // int x, int y;
    Point p;
    int r;
}
class Point{
    int x, int y;
}

원래는 주석부분인 int x, y;를 사용하는 클래스에 Point p;를 멤버로 사용하여 하나의 클래스를 단위별 여러 클래스로 작성한 다음 이 단위 클래스들을 포함관계로 재사용하여 더 간결하고 손쉬운 클래스를 작성하는 방법입니다. 

 

class Car{
    Engine e;
    Door[] door;
    Wheel[] wheel;
}

위와같이 Car라는 클래스에 Engine, Door, Wheel등을 포함하여 줌으로써 포함관계로 클래스를 정의할 수 있습니다.

 

1-3. 관계설정(Is-a, Has-a)

 상속관계와 포함관계에 대해서 알아봤는데 둘중 어느 것을 사용하는 것이 맞는지 이해가 잘 안 될 수 있습니다.

class Circle1{
    Point p;
    int r;
}
class Circle2 extends Point{
    int r;
}
class Point{
    int x, int y;
}

 위와 같이 Circle1은 포함관계, Circle2는 상속관계로 표현했는데 어떤 것을 사용하던지 같은 역할을 할 수 있기 때문입니다.

 

이럴 때에는 두 클래스의 관계가 ~은 ~이다(is-a)관계인지? 아니면 ~는 ~를 가지고 있다(has-a)관계인지를 확인하면 명확하게 관계를 정의할 수 있습니다.

 

위의 예에서 보면

Circle(원)은 Point(점)이다.
Circle(원)은 Point(점)을 가지고 있다.( 포함한다.)

를 확인해 본다면 원이 점이라고 할 순 없지만 원은 점들의 집합으로 이루어져 있으니 원은 점을 가지고 있다. 즉 has-a관계가 성립됩니다.

 

사람과 동물의 관계를 보면

사람은 동물이다.(is ~ a)
사람은 동물을 가지고 있다. (has ~ a)

에서 보면 '사람은 동물이다.' 가 맞으므로 is ~ a 관계인 상속관계로 표현 해 줄 수 있습니다.

 

is-a 관계를 맺을 때는 상속, has-a관계를 맺을 때는 포함관계를 맺어주면 보다 쉽게 판단하여 관계를 맺어 줄 수 있습니다.

 

대표적인 사례를 통해 상속관계와 포함관계를 알아보자

상속관계

상속관계는 다음과 같은 것들로 표현 할 수 있을 것 같다.

 그림은 허접 하지만 위의 그림으로 포함관계를 설명할 수 있다.

 색이 다른 것들은 다 포함되는 객체라고 할 수 있는데 각각 바퀴, 배기구, 사이드미러, 전조등이 구성품입니다.

자동차는 바퀴를 가지고 있다.(has-a)
자동차는 배기구를 가지고 있다.(has-a)
자동차는 사이드미러를 가지고 있다.(has-a)
자동차는 전조등을 가지고 있다.(has-a)

와 같이 has-a 관계로 표현할 수 있습니다.

 

1-4. 단일 상속

자바에서는 다중상속 즉, 부모 클래스를 여러개 두는 것을 허용하지 않습니다. 즉

class A extends B, C{	// ... }

와 같은 형식을 표현 하지 않는 것입니다.

 

다중상속이 된다면 여러 클래스의 기능을 전부 사용할 수 있다는 장점을 가지고 있지만 부모클래스의 멤버의 이름이 겹치면 어느 것을 상송받아야 하는지 구별할 수 없는 문제가 생깁니다.

 

따라서 단일상속을 통해 관계가 명확해 지고 코드 신뢰성이 높아진다는 장점이 있습니다.

 

1-5. Object클래스

Object 클래스는 모든 클래스의 조상입니다. class를 만들때 class ABC{}와 같이 아무런 상속을 하지 않았다면 컴파일러는 자동으로 extends Object를 추가하여 Object가 모든 클래스의 조상이 됩니다.

 만약 상속을 한다면 자신이 만든 가장 상위 클래스가 Object를 상속받고 있습니다.

 

object는 equals()나 toString()같은 기본적인 메서드들을 포함하고 있어서 따로 정의 하지않아도 모든 객체에서 사용 할 수 있도록 도와줍니다.

위와같이 TestObject를 만들기만 해 놓고 빈칸으로 만들어 놓은 후 TestObject의 인스턴스인 to를 만들어 메서드 목록을 보면 Obejct에서 상속받은 메서드 들을 확인할 수 있습니다.

 

-포스팅을 안한다면 1시간안에 볼 수 있는 내용이지만 아직 익숙치 않고 캡처, 그림만들기 등 때문에 시간이 오래걸리네요..ㅠ
차근차근 하면서 조금더 분발해서 빨리빨리 하는 연습을 해야겠어요ㅠㅠ

 

'개발 > JAVA' 카테고리의 다른 글

[JAVA개념]객체지향언어-3  (0) 2021.05.11
[JAVA개념]객체지향언어-2  (0) 2021.05.10
[JAVA개념]객체지향언어-1  (0) 2021.05.09
[JAVA 개념] 변수, 배열  (0) 2021.05.08
[JAVA 개념] 자바의 이해  (0) 2021.05.05

댓글