IS-a와 HAS-a 관계

SeungJoo
|2025. 4. 25. 15:55
728x90
반응형


객체지향 프로그래밍(OOP)에서는 상속구성이라는 두 가지 주요 관계가 중요한 역할을 합니다.

이 두 관계는 객체들이 서로 어떻게 연결되어 있고, 어떻게 협력하는지를 정의합니다.

그 중 IS-aHAS-a 관계에 대해 알아보겠습니다.

IS-a 관계 (상속)

IS-a 관계는 상속과 관련된 개념입니다. 이 관계는 자식 클래스부모 클래스의 특성을 물려받고 확장하는 것을 의미합니다. 쉽게 말해, 자식 클래스는 부모 클래스의 "일종"으로 볼 수 있습니다.

예시 1: 동물과 개

동물이라는 클래스가 있고, 그 클래스의 하위 클래스인 개라는 클래스가 있다고 가정해봅시다.

class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Dog is barking");
    }
}

이 예시에서 Dog는 Animal을 상속받고 있습니다. 즉, Dog는 "Animal의 일종"입니다. 그래서 Dog는 eat() 메서드를 물려받고, 확장하여 bark()라는 새로운 메서드를 추가한 거죠. 이것이 바로 IS-a 관계입니다.
"Dog is an Animal" 또는 "개는 동물이다"라는 관계로 해석할 수 있습니다.

HAS-a 관계 (중첩 클래스)

반면, HAS-a 관계는 상속이 아니라 구성을 나타냅니다. 즉, 하나의 클래스가 다른 클래스를 포함하는 형태로, 그 클래스는 "그것을 갖고 있다"는 의미를 가집니다. 주로 중첩 클래스 또는 객체를 구성하는 관계에서 사용됩니다.

예시 2: 자동차와 엔진

이번에는 Car라는 클래스 안에 Engine이라는 클래스를 포함시키는 예시를 들어볼게요.

class Car {
    class Engine {
        void run() {
            System.out.println("Engine is running");
        }
    }
    
    void start() {
        Engine engine = new Engine();
        engine.run();
    }
}

이 예시에서 Car는 Engine을 포함하고 있습니다. 즉, Car는 "Engine을 가지고 있다"는 의미에서 HAS-a 관계입니다.
"차는 엔진을 가진다" 또는 "자동차는 엔진을 포함한다"라는 관계로 해석할 수 있습니다.

이 경우, Engine은 Car의 내부 구성 요소로, Car가 없으면 Engine이 의미가 없죠. 따라서 "HAS-a" 관계가 성립됩니다.

IS-a 관계와 HAS-a 관계의 차이

관계 유형 특징 예시 해석

HAS-a 한 클래스가 다른 클래스를 포함 Car has an Engine "차는 엔진을 가진다"
IS-a 자식 클래스가 부모 클래스의 일종 Dog extends Animal "개 is a 동물"
  • IS-a 관계는 상속을 의미합니다. 자식 클래스는 부모 클래스의 특성을 물려받고 확장할 수 있습니다.
  • HAS-a 관계는 구성을 의미합니다. 한 클래스가 다른 클래스를 구성 요소로 포함하고 있다는 뜻입니다.

언제 IS-a를 사용할까?

IS-a 관계자식 클래스가 부모 클래스의 특성을 그대로 물려받고 확장할 때 사용합니다.

예를 들어, Dog 클래스가 Animal 클래스를 상속받을 때처럼, "자식 클래스는 부모 클래스의 일종"일 때입니다.

상속은 유사한 특성을 가진 클래스들 간에 공통 기능을 재사용하고, 자식 클래스에서 추가 기능을 확장할 수 있게 해줍니다. 상속을 사용할 때는 "is-a" 관계가 성립해야 하므로, Dog가 Animal의 일종이라면, 그 두 클래스는 상속을 사용해야 합니다.

언제 HAS-a를 사용할까?

HAS-a 관계하나의 클래스가 다른 클래스를 포함할 때 사용합니다.

예를 들어, Car가 Engine을 포함하는 경우처럼, "하나의 클래스가 다른 클래스를 갖고 있다"는 관계입니다.

중첩 클래스를 사용하면 내부 클래스가 외부 클래스의 세부 구현에 밀접하게 연결되어 있을 때 유용합니다.

예를 들어, Car와 Engine은 긴밀하게 연결된 관계이므로, Car 안에 Engine을 중첩 클래스로 넣는 것이 적합합니다.

결론

  • IS-a 관계상속을 사용할 때, 자식 클래스가 부모 클래스의 특성을 물려받고 확장할 때 적합합니다.
  • HAS-a 관계구성을 사용할 때, 하나의 클래스가 다른 클래스를 구성 요소로 포함할 때 적합합니다.

두 관계는 객체지향 프로그래밍에서 클래스 간의 관계를 정의할 때 중요한 개념입니다.

상황에 따라 IS-aHAS-a를 구분하고, 상속구성을 적절히 선택하는 것이 코드의 가독성 및 유지보수성에 큰 영향을 미칩니다.

728x90
반응형

'JAVA' 카테고리의 다른 글

HashMap vs ConcurrentHashMap  (0) 2025.04.10
인터페이스와 추상클래스  (0) 2025.04.10
팩토리 메서드 패턴  (0) 2025.02.17