BackEnd/Java&Kotilin
IS-A 와 HAS-A
Hero_O
2022. 7. 30. 10:52
IS-A
IS-A 는 ~ 이다 라는 의미를 가지고 있다. 설명하면, 상위 클래스와 하위 클래스의 관계에 있을 때 IS-A 라고 할 수 있다. 코드로 보면 아래와 같다.
class Dog extends Mammalia{
//생략.
}
class Mammalia {
// 생략...
}
생물 분류법에서 개는 포유류이다. 위 코드에서 Dog 클래스는 Mammalia 클래스에 상속되는데 Dog 은 Mammalia 로 표현할 수 있다. 이 처럼 상위 클래스로 하위 클래스를 표현할 수 있는 관계를 IS-A 관계라고 하며, 자바에서 대표적으로 상속관계를 들 수 있겠다.
Has-A
Has-A 는 ~을 가지다 라는 의미다. 흔히 합성(Composition) 혹은 조합이라고 불리는데 A 클래스의 필드로 B 클래스를 가지고 있을 때 A와 B를 HAS-A 관계라고 부른다. 코드로 보면 아래와 같다.
class A {
private final B b;
// 생략...
}
class B {
// 생략...
}
위처럼 A가 B를 가지고 있는 관계가 Has-A 관계이다.
IS-A 와 HAS-A
IS-A | HAS-A | |
의미 | ~ 이다. | ~ 을 가지다. |
코드 | 상속관계 | 포함관계 |
결합도 | 강한 결합(Tight Coupling) | 느슨한 결합(Loose Coupling) |
상속 관계는 상•하위 클래스가 강하게 묶여있다. 상위 클래스 변경에 하위 클래스는 쉽게 영향을 받게 되는 경향이 있다. 두 클래스 간의 관계가 실제로 IS-A 관계일 때만 사용하는 것이 좋다.
포함 관계는 두 클래스가 상속 관계보다는 느슨하게 묶여있다. 따라서 상속 관계보다는 코드 변경이 서로에게 영향을 줄 가능성이 상대적으로 적다. 이는 코드가 변경에 유연하고 유지보수가 쉽다는 것이다.
요약
💡 IS-A와 HAS-A관계는 각각 상속과 합성을 의미하는데, IS-A의 경우 클래스간의 강한 결합이 이루어지기
때문에 상황에 맞춰 사용할 필요가 있다.