Composition(포함관계) - 18

Composition(포함관계) - 18

💡 학습 목표
    1. 포함 관계(Composition)에 대한 개념을 이해하자
    2. 포함관계(Composition)사례 연구
package basic.ch18;

public class Car {
	
	String name;
	int price;
	Engine engine; // 포함관계(Composition)
}
package basic.ch18;

public class Engine {

	String name;
	int price;
}

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

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

 

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

 

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

package basic.ch18;

public class Car {

	String name;
	int price;
	Engine engine; // 포함관계(Composition)

	public Car() {
		// 포함관계 - Composition
		// 객체안에 필요 객체를 직접 생성할 경우
		// Composition 관계라고 한다.
		engine = new Engine();
		// Car 객체가 생성될 때,
		// Engine 객체도 함께 생성된다.
	}

	public void startCar() {
		engine.start();
		System.out.println("자동차가 출발 합니다.");
	}

	public void stopCar() {
		engine.start();
		System.out.println("자동차가 멈춥니다.");
	}
}
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.startCar();
		
		// 엔진의 속성인 name 변수의 값을 초기화 해보자.
		car1.engine.name = "V8";
		car1.engine.price = 4_000;
		
		System.out.println(car1.engine.name);
		System.out.println(car1.engine.price);
	}

}

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

 💡 포함 관계 특징 (중요)

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

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

package basic.ch18;

public class CPU {
	
	private String name;
	
	public String getName() {
		return name;
	}

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

	void process() {
		System.out.println("....처리중....");
	}
}
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;
	}
	
	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");
		System.out.println(computer.getCPU().getName()); 
		computer.setCPU(cpu1);
		
		// 우리 컴퓨터에 장착 되어있는 CPU 이름
		// 출력하고 싶다면?
		System.out.println(computer.getCPU().getName()); 
	}
}

 

도전 과제

package basic.exercise.test01;

public class MainTest1 {

	public static void main(String[] args) {
		
		// 문제 1 
		A a  = new A();
		// a 참조변수로 시작해서 D에 name 값을 화면에 출력 하시오. 
		// 단 여기서는 A 객체만 생성해야 합니다. 
	}

}
package basic.exercise.test01;

public class A {

	B b;
}
package basic.exercise.test01;

public class B {
	
	C c;
}
package basic.exercise.test01;

public class C {

	D d;
	
}
package basic.exercise.test01;

public class D {

	private String name;
	
	public D() {
		name = "나는 D 이다.";
	}
	
	public String getName() {
		return name;
	}

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

 

package basic.exercise.test01;

public class A {
	B b;

	public A() {
		b = new B();
	}

}

package basic.exercise.test01;

public class B {
	C c;

	public B() {
		c = new C();
	}

}

package basic.exercise.test01;

public class C {
	D d;

	public C() {
		d = new D();
	}

}

package basic.exercise.test01;

public class D {
	
	private String name;
	
	public D() {
		name = "나는 D 이다.";
	}

	public String getName() {
		return name;
	}

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

package basic.exercise.test01;

public class Maintest1 {

	public static void main(String[] args) {
		
		// 문제 1
		A a = new A();
		// a 참조변수로 시작해서 D의 name 값을
		// 화면에 출력 하시오.
		System.out.println(a.b.c.d.getName());
	} // end of main

} // end of class

도전과제 2

		// 문제 2
		A a = new A();
		B b = new B();
		C c = new C();
		D d = new D();
		// 각 클래스 내부에서 (A,B,C,D) 객체를 생성하지 않고 외부에서
		// 객체를 주입한 후에 D의 getName()을 호출 하시오.
		
		// 외부에서 주입 받을 수 있도록 코드를 작성.

package basic.exercise.test02;

public class Maintest2 {

	public static void main(String[] args) {
		
		// 문제 2
		A a = new A();
		B b = new B();
		C c = new C();
		D d = new D();
		// 각 클래스 내부에서 (A,B,C,D) 객체를 생성하지 않고 외부에서
		// 객체를 주입한 후에 D의 getName()을 호출 하시오.
		
		// 외부에서 주입 받을 수 있도록 코드를 작성.
		
		// 메서드 의존 주입
		a.setB(b);
		b.setC(c);
		c.setD(d);
		System.out.println(a.getB().getC().getD().getName());
	} // end of main

} // end of class

Java 객체지향 핵심 - 2 으로 돌아가기