이번 포스팅에선 JAVA 에서의 IS-A와 HAS-A에 대해 알아보고자 한다.
IS - A
- ~ 이다.
- 상속은 IS-A 관계에서 사용하는 것이 효율적이다. IS-A 관계(is a relationship, inheritance)는 일반적 개념과 구체적 개념의 관계이다.
- 사람은 동물이며, 소는 동물이고, 새는 동물이다. 이것과 같은 관계이다. 즉, 일반 클래스는 구체화 하는 상황에서 상속을 사용한다.
- 상속을 사용하면 많은 장점이 있지만, 하위 클래스가 상위 클래스에 종속되기 때문에 이질적인 클래스 간에는 상속을 사용하면 안된다.
- 단순히 코드를 재사용할 목적으로 서로 관련이 없는 개념의 클래스를 상속 관계로 사용하는 것은 추천하지 않는다.
HAS - A
- ~ 를 가진다.
- HAS-A 관계에서는 상속을 사용하지 않는다.
- HAS-A 관계(Has a relationship, association)는 일반적인 포함 개념의 관계이다.
- HAS-A 관계는 다른 클래스의 기능(변수 혹은 메서드)을 받아들여 사용한다.
상속의 잘못된 생각
- 상속을 코드 재사용의 개념으로 이해하면 안된다.
- 코드를 재사용할 수 있다고 마구잡이로 잘못 사용하는 경우가 있는데, 상속을 사용하면 클래스 間 결합도가 높아져 상위 클래스를 수정해야할 때 하위클래스에 미치는 영향이 매우 크다.
- 결국, 상속은 IS-A 관계에서 사용해야 한다고 볼 수 있다.
나의 생각 및 정리
- 결국 HAS-A 관계는 멤버변수화라고 생각한다. (Computer Class에 CPU와 RAM, MainBoard Class가 존재하듯)
- 상속은 형제는 따지지 않으며 위아래만 따진다.
HAS-A 관계의 예를 들어보자.
public Class Cpu{
String productCompany = intel;
String series = coreI;
int generation = 12;
}
public Class Ram{
String productCompany = samsung;
String classification = ddr4;
int capacity = 8;
boolean isDesktop = true;
int bandwidth = 2666;
}
public Class Computer {
CPU cpu;
RAM ram;
}
위 코드에서, Computer와 Cpu(또는 Ram) Class 사이의 관계가 상속을 받아야 된다고 생각하는가? 아니다. IS-A 관계를 생각해보자.
- 컴퓨터는 CPU 이다. (X)
- CPU는 컴퓨터 이다. (X)
둘 다 뭔가 이상하다. 그렇다면 ~ 를 가진다를 대입해보자.
- 컴퓨터는 CPU를 가진다. (O)
- CPU는 컴퓨터를 가진다. (X)
결국, HAS-A 관계는 하나의 객체가 다른 객체를 “(부분으로서) 갖거나” 하는 경우에 사용하는 것을 알 수 있다.
만약, IS-A 관계가 확실한지에 대해 의문을 가진다면, HAS-A 관계를 한번 생각해보자.