JAVA 객체 지향 핵심

(JAVA)Composition(포함 관계) - 15

mynote6676 2025. 4. 21. 16:07

 

1. 포함 관계(Composition)에 대한 개념을 이해하자.

: 자동차와 엔진에 관계를 상속으로 표현하면 맞는 개념일까?

: 포함 관계는 한 클래스가 다른 클래스를 포함하는 관계를 말합니다.

자바에서 포함 관계(Composition)는 한 클래스가 다른 클래스를 자신의 필드(속성)로서 포함하는 것을 말합니다. 이 개념은 "has-a" 관계로도 알려져 있으며, 객체 간의 강한 연관성을 나타냅니다. 즉, 하나의 객체가 다른 객체 없이는 의미가 없을 때 포함 관계를 사용합니다.

 

 

package com.composition;

public class Engine {

    String name;
    int price;

    void start(){
        System.out.println("엔진이 시작됩니다.");
    }
    void stop(){
        System.out.println("엔진을 멈춥니다.");
    }

}

 

package com.composition;

public class Car {

    String name;
    int price;
    //포험 관계(컴포지션)
    //car 클래스는 engine 객체를 포함합니다.
    Engine engine;

    public Car(){
        //자동차 객체가 생성될 때 엔진도 함계 생성된다.
        //강한 의존성
        engine = new Engine();
    }

    void startCar(){
        engine.start();//car 객체를 통해 engine  의 start() 메서드를 호출
        System.out.println("자동차가 출발합니다");
    }

    void stopCar(){
        engine.stop();
        System.out.println("자동차가 멈춥니다." );
    }

    //테스트 코드 작성
    public static void main(String[] args) {

        //TODO**컴포지션 관계는**
        //자동차 클래스 내부에서 엔진 객체를 생성시켜야 컴포지션 관계이다.
        Car car = new Car();
        car.startCar();
        car.stopCar();

    }//end of main
}

 

 

2. 포함관계(Composition) 사례 연구

컴포지션 관계: House는 여러 Room 객체를 소유하며, Room의 생명주기는 House에 종속적입니다.

UML 표기법

  • 컴포지션은 채워진 다이아몬드(◆)로 표시.
  • House와 Room은 1:N 관계 (하나의 House가 여러 Room을 가짐)

 

package com.composition;

public class Room {

    private String tybe;

    public Room(String tybe){
        this.tybe = tybe;
    }
    void  describe(){
        System.out.println(tybe + "방 입니다.");
    }

}

 

package com.composition;

public class House {

    private String address;
    Room[] rooms;

    public House(String address) {
        this.address = address;
        this.rooms = new Room[3];// 컴포지션 : House가 Room 배열을 소유하고 있다.
        rooms[0] = new Room("거실");
        rooms[1] = new Room("침실");
        rooms[2] = new Room("주방");
        //속성으로 선언되고 내부에서 객체 생성 했기 때문에 컴포지션이라고 할 수 있다.
        //room = new Room("안방");
    }

    void showRooms() {
        System.out.println(address + " 에 있는 방 목록");
        for (int i = 0; i < rooms.length; i++) {
            if (rooms[i] != null) {
                rooms[i].describe();

            }
        }
    }

    //테스트 작성
    public static void main(String[] args) {
        House house = new House("부산시 진구");
        house.showRooms();


        // house 객체가 소멸이 되면 rooms도  Room 객체도 소멸 (GC에 의해 소멸)
        house = null;
    }

}
728x90