is-a 와 has-a

유방현·2024년 10월 23일

IS-A 관계 (상속 관계)

  • 한 클래스가 다른 클래스의 일종인 경우를 나타냅니다
  • "is a kind of"의 관계입니다
  • 상속(inheritance)을 통해 구현됩니다
  • extends 키워드를 사용합니다

예시 코드:

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

class Dog extends Animal {  // Dog IS-A Animal
    void bark() {
        System.out.println("barking...");
    }
}

여기서 "Dog is an Animal"이라고 표현할 수 있습니다.

HAS-A 관계 (포함 관계)

  • 한 클래스가 다른 클래스를 포함하는 관계입니다
  • "has a part of"의 관계입니다
  • 컴포지션(composition) 또는 집합(aggregation)으로 구현됩니다
  • 클래스의 멤버 변수로 다른 클래스의 객체를 가지는 형태입니다

예시 코드:

class Engine {
    void start() {
        System.out.println("Engine starting...");
    }
}

class Car {  // Car HAS-A Engine
    private Engine engine;  // 컴포지션 관계
    
    public Car() {
        engine = new Engine();
    }
    
    void startCar() {
        engine.start();
    }
}

여기서 "Car has an Engine"이라고 표현할 수 있습니다.

주요 차이점:

  1. 구현 방식
  • IS-A: extends 키워드를 사용한 상속으로 구현
  • HAS-A: 클래스의 멤버 변수로 구현
  1. 관계의 강도
  • IS-A: 강한 결합 관계 (tight coupling)
  • HAS-A: 약한 결합 관계 (loose coupling)
  1. 재사용성
  • IS-A: 부모 클래스의 모든 특성을 물려받음
  • HAS-A: 필요한 기능만 선택적으로 사용 가능
  1. 유연성
  • IS-A: 한 번 설정된 상속 관계는 변경이 어려움
  • HAS-A: 런타임에 관계 변경이 상대적으로 용이

사용 예시:

// IS-A 관계의 예시
class Vehicle {}
class Car extends Vehicle {}      // Car IS-A Vehicle
class Bike extends Vehicle {}     // Bike IS-A Vehicle

// HAS-A 관계의 예시
class Address {
    String street;
    String city;
}

class Student {
    private Address address;      // Student HAS-A Address
    private String name;
    
    public Student(String name, Address addr) {
        this.name = name;
        this.address = addr;
    }
}

3. is-ahas-a 관계 비교

특징is-a 관계 (상속)has-a 관계 (구성)
관계의 의미하위 클래스는 상위 클래스의 일종한 클래스가 다른 클래스의 구성 요소를 포함
구현 방법상속 (extends 키워드 사용)구성 (클래스 필드로 다른 클래스의 객체를 선언)
목적상위 클래스의 동작을 상속받아 재사용 및 확장기능 분리객체 협력을 통해 동작을 구현
클래스 간 결합도결합도가 상대적으로 높음결합도가 상대적으로 낮음
의존성하위 클래스는 상위 클래스에 강하게 의존구성된 클래스의 동작을 사용하지만 덜 의존적
사용 예Dog is a Animal, Car is a VehicleCar has a Engine, Computer has a Processor
주로 사용되는 상황클래스 계층에서 공통 동작을 상속받아 확장할 때특정 클래스가 다른 클래스의 기능을 사용할 때

실제 사용시 고려사항:
1. IS-A 관계는 꼭 필요한 경우에만 사용해야 합니다 (상속의 오용을 피하기 위해)
2. HAS-A 관계는 더 유연한 설계가 가능하므로 상황에 따라 선호됩니다
3. "상속보다는 컴포지션을 사용하라"는 객체지향 설계 원칙을 고려해야 합니다

0개의 댓글