is-a 관계와 has-a 관계는 클래스들의 관계를 표현할 때 사용된다.
is-a 관계는 말그대로 A는 B이다(A is B) 관계를 나타낸다.
예를 들어보자. "사과는 과일이다" 라는 문장은 맞는 말이다. 그렇다면 "과일은 사과이다" 라는 문장은 맞는 말일까? 물론 아니다. 과일에는 사과 외에 다른 과일들도 들어갈 수 있기 때문이다.
이러한 관계는 클래스들 사이에서 상속 관계로 나타낼 수 있다. "사과는 과일이다" 라는 문장에서 과일은 사과의 부모 클래스가 되고 다음과 같이 나타낼 수 있다.
public class Fruit {
int price;
String color;
}
public class Apple extends Fruit {
int sweetness_level;
}
has-a 관계는 A는 B 속성을 가지고 있다(A has B) 관계를 나타낸다.
예를 들어 사과는 아삭한 정도(crispiness)를 나타내는 속성을 가질 수 있고 다음과 같이 나타낼 수 있다.
public enum Crispiness {
HIGH,LOW
}
public class Apple {
Crispiness crispiness;
}
속성값 외에도 기능을 포함할 수 있다. 예를 들어, 자동차에 엔진 컴포넌트를 추가하는 방식처럼, has-a 관계는 특정 기능을 포함하기 위한 관계를 나타낸다고 볼 수 있다.