Language/Java

Inheritance와 Composition (클래스 간의 관계)

settong 2024. 12. 7. 09:24
반응형

Inheritance

정의

Inheritance(상속)은 객체지향 프로그래밍에서 상위 클래스(부모)의 속성과 메서드를 하위 클래스(자식)가 물려받는 개념이다.

`is-a`관계를 나타낸다. 

 

장단점

장점

  • 재사용성
    부모 클래스의 기능을 자식 클래스에서 재사용 할 수 있다.

  • 계층구조
    클래스 간 상속관계를 통해 계층 구조를형성할 수 있다.

  • 다형성(오버라이딩)
    자식 클래스에서 부모 클래스의 메서드를 오버라이딩(재정의)하여 다형성을 구현할 수 있다.
  • 유지보수 용이
    공통 기능을 상위 클래스에 두고 관리할 수 있어 유지보수가 쉬워진다.

 

단점

 

  • 결합도 증가
    부모 클래스의 기능을 자식 클래스에서 재사용 할 수 있다.

  • 유연성 부족
    자식 클래스는 부모 클래스에 강하게 의존하게 되어 유연성이 떨어진다.

  • 다중 상속 불가
    Java는 다중 상속을 지원하지 않는다.

 

 

예시

// 부모 클래스
class Animal {
    public void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

// 자식 클래스
class Dog extends Animal {
    // 메서드 오버라이딩
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

// 자식 클래스
class Cat extends Animal {
    // 메서드 오버라이딩
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

// Main 클래스
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();
        
        myDog.makeSound();  // Bark
        myCat.makeSound();  // Meow
    }
}

`Dog`와 `Cat`클래스는 `Animal`클래스를 상속 받아 `Dog is-a Animal`, `Cat is-a Animal` 관계를 나타낸다.

 

 

 


Composition

정의

Composition은 객체지향 프로그래밍에서 하나의 클래스가 다른 클래스의 객체를 멤버 변수로 포함하는 방식으로 클래스 간의 관계를 나타낸다.

`has-a`관계를 나타낸다.


장단점

장점

  • 재사용성
    기존 클래스 기능을 재사용 할 수 있다.

  • 유연성 (낮은 결합도)
    결합도가 낮아, 변경 사항이 발생할 때, 영향을 받는 클래스 범위를 최소화 할 수 있다.

  • 캡슐화
    내부 구현을 숨기고 외부에 노출되지 않도록 한다.

  • 다중 상속 문제 해결
    Java에서는 다중 상속을 지원하지 않지만, Composition을 사용하면 여러 클래스의 기능을 결합할 수 있다.

 

단점

  • 복잡성 증가
    구성 요소가 많아질수록 클래스 간 관계가 복잡해질 수 있다.

  • 더 많은 코드 작성
    상속에 비해 객체 생성과 메서드 호출을 위한 추가 코드가 필요하다.

 

예시

// Engine 클래스
class Engine {
    public void start() {
        System.out.println("Engine started.");
    }

    public void stop() {
        System.out.println("Engine stopped.");
    }
}

// Car 클래스
class Car {
    private Engine engine;

    // Car 생성자에서 Engine 객체를 초기화
    public Car() {
        engine = new Engine();
    }

    // Car 메서드에서 Engine 객체의 메서드를 호출
    public void startCar() {
        engine.start();
        System.out.println("Car started.");
    }

    public void stopCar() {
        engine.stop();
        System.out.println("Car stopped.");
    }
}

// Main 클래스
public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.startCar();  // Engine started. Car started.
        car.stopCar();   // Engine stopped. Car stopped.
    }
}

`Car`클래스는 `Engine` 객체를 포함하고 있어 `Car has-a Engine` 관계를 나타낼 수 있다.

 

 

 

 

728x90
반응형