Is a를 지양하고 Has a를 지향하는 이유

김민구·2024년 11월 29일
0

C#

목록 보기
8/31

Is-A와 Has-A 개념 정리

  • Is-A : 상속 관계를 의미
    어떤 클래스가 다른 클래스의 "종류"일 때 성립하는 관계
    예를 들어, "고양이는 동물이다"와 같이 고양이 클래스는 동물 클래스를 상속받는다.

- Has-A : 포함 관계를 의미

어떤 클래스가 다른 클래스를 "가진다"일 때 성립하는 관계
예를 들어, "사람은 심장을 가진다"와 같이 사람 클래스는 심장 클래스의 객체를 멤버 변수로 가질 수 있다.

왜 Has-A를 지향하는가

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() { }
}
profile
C#, Unity

0개의 댓글