Java

2024.04.23 Composition(포함관계)

정훈5 2024. 4. 23. 11:32
학습 목표 

1. 포함 관계(Composition)에 대한 개념을 이해하자. 
2. 포함관계(Composition) 사례 연구

 

package basic.ch18;

public class Car {
	
	String name; // 자동차 이름
	int price; // 자동차 가격
	Engine engine; // 포함관계
}
package basic.ch18;

public class Engine {
	
	String name; // 엔진 이름
	int price; // 엔진 가격
}

 

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

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

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

자바에서 포함 관계(Composition)는 한 클래스가 다른 클래스를 자신의 필드(멤버변수)로서 포함하는 것을 말합니다.

이 개념은 "has-a" 관계로도 알려져 있으며, 객체 간의 강한 연관성을 나타냅니다.

즉, 하나의 객체가 다른 객체 없이는 의미가 없을 때 포함 관계를 사용합니다.

 

 

 

package basic.ch18;

public class Car {
	
	String name; // 자동차 이름
	int price; // 자동차 가격
	Engine engine; // 포함관계
	
	public Car() {
		//Engine engine = new Engine();
		
		engine = new Engine();
		// Car 라는 객체가 생성이 될 때
		// Engine 객체도 함께 생성이 된다.
	}
	
	public void strtCar() {
		engine.start(); // 엔진 시작
		System.out.println("자동차가 출발 합니다.");
	} // 메서드 생성
	
	public void stopCar() {
		engine.stop(); // 엔진 정지
		System.out.println("자동차가 멈춥니다.");
	} // 메서드 생성
	
} // end of class

 

package basic.ch18;

public class Engine {
	
	String name; // 엔진 이름
	int price; // 엔진 가격
	
	void start() {
		System.out.println("엔진이 시작됩니다.");
	}
	
	void stop() {
		System.out.println("엔진이 멈춥니다.");
	}
}

 

-------------------------------

package basic.ch18;

public class Car {
	
	String name; // 자동차 이름
	int price; // 자동차 가격
	Engine engine; // 포함관계 , Composition
	
	public Car() {
		//Engine engine = new Engine();
		
		// 포함관계 - Composition
		// 객체안에 필요 객체를 직접 생성할 경우 Composition 관계라고 한다.
		 engine = new Engine();
		// Car 라는 객체가 생성이 될 때
		// Engine 객체도 함께 생성이 된다.
	}
	
	public void strtCar() {
		engine.start(); // 엔진 시작
		System.out.println("자동차가 출발 합니다.");
	} // 메서드 생성
	
	public void stopCar() {
		engine.stop(); // 엔진 정지
		System.out.println("자동차가 멈춥니다.");
	} // 메서드 생성
	
} // end of class

 

package basic.ch18;

public class Engine {
	
	String name; // 엔진 이름
	int price; // 엔진 가격
	
	void start() {
		System.out.println("엔진이 시작됩니다.");
	}
	
	void stop() {
		System.out.println("엔진이 멈춥니다.");
	}
}

 

package basic.ch18;

public class CarMainTest {

	public static void main(String[] args) {
		
		Car car1 = new Car();
		
		car1.strtCar();
		car1.stopCar();
		
		// 엔진의 속성인 name 변수에 값을 초기화 해보자.
		
		car1.engine.name = "V8"; // 엔진의 이름
		car1.engine.price = 4000; // 엔진의 가격
		
		System.out.println(car1.engine.name);
		System.out.println(car1.engine.price);
	}
	
	// nullPoint 오류 - 주소 또는 참조값 확인

}

 

포함관계(Composition) 사례 연구

 

💡 포함 관계 특징 (중요)

  • 포함된 객체는 포함하는 객체 안에서만 존재하며, 포함하는 객체가 파괴되면 포함된 객체도 함께 파괴됩니다.
  • 이 관계는 객체 간의 강한 의존성을 특징으로 하며, 소유하는 객체가 완전한 책임을 가집니다.
  • 포함관계는 연관관계보다 더 강한 연결을 의미합니다.   포함관계 > 연관관계 

컴퓨터, CUP (Composition) 으로 설계 하기

 

package basic.ch18;

public class CPU {

	private String name;

	void process() {
		System.out.println(".... 처리중...");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

package basic.ch18;

public class Computer {

	private CPU cpu;

	public Computer() {
		cpu = new CPU(); // 콤포지션 관계
		cpu.setName("인텔10");
	}

	void start() {
		System.out.println("컴퓨터가 시작 됩니다.");
		cpu.process();
	}

	// 필요하다면 setter 메서드를 만들 수 있다.
	// 외부에서 주입 받을 수 있다.
	public void setCPU(CPU cpu) {
		this.cpu = cpu;
	}

	// 외부에서 접근 가능한 getter
	public CPU getCPU() {
		return cpu;
	}
}

 

package basic.ch18;

public class ComputerTest {

	public static void main(String[] args) {

		Computer computer = new Computer();
		CPU cpu1 = new CPU();
		cpu1.setName("AMD");
		computer.setCPU(cpu1);

		// 우리 컴퓨터에 장착 되어있는 CPU 이름
		// 출력하고 싶다면??
		System.out.println(computer.getCPU().getName());
	}

}