[Java] 자바의 정석 7장 (1) - 클래스 간의 관계

토닉·2021년 9월 6일
0

Java

목록 보기
10/13
post-thumbnail

클래스 간의 관계

목차
1. 상속 관계
2. 포함 관계

상속 관계

  • 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
class Parent {}
class Child extends Parent ()

특징
1. 자손은 조상(부모의 부모...모든 부모들)의 모든 멤버를 상속받는다.(생성자, 초기화 블럭 제외
)
2. 자손의 변경은 조상에 영향을 미치지 않는다.

class Point2D {
    int x;
    int y;
}

class Point3D extends Point2D {
    int z;
}

class Point3D { // 위 3D와 똑같다. 단 위 클래스는 부모 클래스에 영향을 받는다.
    int x;
    int y;
    int z;
}

Point2D가 바뀌면 Point3D의 멤버도 바뀐다.
Point3D가 바뀌어도 Point2D의 멤버는 바뀌지 않는다.

포함 관계

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Circle { // 포함관계
    Point c = new Point(); 
    int r;
}

class Circle extends Point { // 상속관계
    int r;
}

class Point {
    int x;
    int y;
}

상속관계, 포함관계는 어떤 기준으로 결정하나요?
상속관계: A은 B이다 -> class A extends B {} (is)
포함관계: A은 B을 가지고 있다. -> class A {B b = new B();} (have)

위 circle과 point 관계로 예시로 본다면
1. Circle은 Point이다.(상속관계)
2. Circle은 Point를 가지고 있다.(포함관계)
위를 보면 2번인 포함관계가 문맥상 맞기 때문에 포함관계로 작성하는 것이 좋습니다.
대부분은 포함관계로 작성하게 됩니다. 왜냐하면 상속관계에는 제약이 많기 때문이에요.

Java는 다중 상속이 안되고 단일 상속만을 허용합니다!
왜 단일 상속만 허용할까요?
다중 상속일 때의 장점은 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있습니다.
하지만 만약 조상의 클래스 둘 다 같은 이름의 멤버를 가지고 있다고 가정한다면 상속받는 클래스에서 해당 멤버를 호출할 때 어떤 조상 클래스의 멤버를 가지고 올지 에매해집니다.
만약 같은 이름의 메서드를 가지고 있을 때 어떤 조상의 메서드인지 구별할 방법이 없습니다.
클래스 메서드(static)라면 조상 클래스이름을 앞에 작성하면 되지만 인스턴스 메서드라면 구별할 수 없습니다.
따라서 다중상속에 비해 불편한 점도 있지만 클래스 간의 관계가 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 주는 점에서 장점이 있습니다.

그렇다면 Java에서 다중 상속이 필요한 경우는 어떡하나요?
인터페이스를 사용하여 다중 상속 문제를 해결합니다.
또 다른 방법은 비중이 높은 클래스 하나만 상속 관계, 그리고 나머지는 포함 관계로 하면 됩니다.

profile
우아한테크코스 4기 교육생

0개의 댓글