is와 has 관계
- is 관계 (상속)
is
관계는 상속(Inheritance) 관계를 의미합니다. 즉, 강아지는 동물이다 라는 식의 관계
- has 관계 (구성 또는 포함)
has
관계는 **구성(Composition)**을 의미합니다. 즉, Sonata는 Engine을 가지고 있다라는 개념
1. is관계
class Animal {
void breathe() => print("숨을 쉰다");
}
class Cat extends Animal {
void meow() => print("야옹");
}
class Dog extends Animal {
void bark() => print("멍멍");
}
void main() {
Cat cat = Cat();
Dog dog = Dog();
print(cat is Animal); // true: Cat은 Animal이다.
print(dog is Animal); // true: Dog은 Animal이다.
cat.breathe(); // 상속받은 메서드 사용 가능
dog.breathe(); // 상속받은 메서드 사용 가능
}
- 여기서 **
Cat
*과 **Dog
*는 **Animal
*의 is-a 관계입니다. 즉, 고양이는 동물이다, 강아지는 동물이다라는 개념입니다.
- is 관계에서는 상속을 통해 부모 클래스의 특성과 기능을 물려받습니다. 즉, 고양이와 강아지는 동물의 모든 특성을 가지고 있는 하위 클래스입니다.
2. has 관계
class Engine {
int power = 500;
}
class Car {
final Engine engine;
Car(this.engine); // 생성자에서 엔진을 주입받음
}
void main() {
Engine v8Engine = Engine();
Car sonata = Car(v8Engine);
print(sonata.engine.power); // Sonata는 엔진을 가지고 있다
}
- 여기서 **
Car
*는 **Engine
*을 포함합니다. 즉, 소나타는 엔진을 가지고 있다는 의미가 됩니다.
- has-a 관계는 객체를 내부적으로 포함하여, 다른 객체의 기능을 구성 요소로 사용합니다. 이것은 상속과는 달리 객체들이 독립적으로 존재하면서 서로를 포함하는 개념입니다.
차이점 정리:
- is-a 관계 (상속):
- 한 클래스가 다른 클래스를 상속받아 부모 클래스의 기능을 물려받는 관계입니다.
- 예시:
고양이는 동물이다.
,강아지는 동물이다.
- 부모 클래스의 모든 기능과 속성을 상속받으며, 이 관계를 통해 다형성이 구현됩니다.
- has-a 관계 (구성):
- 한 클래스가 다른 클래스의 객체를 필드로 포함하여, 그 객체의 기능을 사용하는 관계입니다.
- 예시:
소나타는 엔진을 가지고 있다.
,집은 문을 가지고 있다.
- 독립적인 객체들이 서로 관계를 가지며, 생성자 주입 등을 통해 다른 객체의 기능을 사용할 수 있습니다.
즉
- *
is 관계
*는 상속을 의미하며, **"고양이는 동물이다"**와 같은 상속 구조를 설명합니다.
- *
has 관계
*는 구성을 의미하며, **"소나타는 엔진을 가지고 있다"**처럼 한 클래스가 다른 클래스를 포함하는 관계를 설명합니다.
Share article