어떤 클래스가 다른 클래스를 "가진다"일 때 성립하는 관계
예를 들어, "사람은 심장을 가진다"와 같이 사람 클래스는 심장 클래스의 객체를 멤버 변수로 가질 수 있다.
C#에서 Has-A 관계를 지향하는 이유는 다음과 같다.
유연성:
상속은 강한 결합을 야기하여 코드 변경 시 영향 범위가 넓어질 수 있다.
반면, Has-A 관계는 필요에 따라 다른 객체를 구성하여 유연하게 시스템을 변경할 수 있다.
예를 들어, 자동차 클래스가 엔진 클래스를 포함하는 경우, 다양한 종류의 엔진을 교체하여 사용할 수 있다.
재사용성:
Has-A 관계를 통해 코드 재사용성을 높일 수 있고, 동일한 기능을 가진 객체를 여러 클래스에서 공유할 수 있다.
테스트 용이성:
Has-A 관계는 의존성 주입을 통해 테스트하기 쉽고, 모의 객체를 사용하여 테스트를 수행할 수 있다.
확장성:
새로운 기능을 추가할 때 상속보다는 Has-A 관계를 활용하면 기존 코드에 미치는 영향을 최소화할 수 있다.
상속 (Is-A):
부모 클래스의 변경이 자식 클래스에 영향을 미치는 강한 결합을 형성한다.
부모 클래스에 새로운 메서드가 추가되면 모든 자식 클래스에서 해당 메서드를 구현하거나 오버라이드해야 한다.
포함 (Has-A):
각 객체는 독립적으로 관리되므로 결합도가 낮다.
한 객체의 변경이 다른 객체에 미치는 영향을 최소화할 수 있다.
ex)
상속 (Is-A):
public class Animal
{
public void Eat() { }
}
public class Dog : Animal
{
public void Bark() { }
}
포함 (Has-A):
public class Person
{
private Heart heart;
public Person(Heart heart)
{
this.heart = heart;
}
}
public class Heart
{
public void Beat() { }
}