본문 바로가기
Java

Composition(포함관계)

by 개발자공부 2024. 4. 24.

 

목차

포함관계(Composition)

포함관계 특징

예시1. 자동차와 엔진

예시2. 컴퓨터와 cpu

연습문제


포함관계(Composition)

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

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

해당하는 예시) 자동차와 엔진, 컴퓨터와 cpu....

해당하지 않는 예시) 버스와 승객, 교실과 학생....

 

포함관계 특징☆☆☆

☞ 포함된 객체는 포함하는 객체 안에서만 존재하며, 포함하는 객체가 파괴되면 포함된 객체도 함께 파괴된다.

☞ 이 관계는 객체 간에 강한 의존성을 띄기 때문에 소유하는 객체가 완전한 책임을 가진다.

☞ 포함관계는 연관관계보다 더 강한 연결을 의미한다.

 


 

예시1. 자동차와 엔진

public class Engine{
	
    String name;
    int price;
    
    void start(){
    	System.out.println("엔진이 시작됩니다.");
    }

	void stop(){
    	System.out.println("엔진이 멈춥니다.");
    }

}
public class Car{

	String name;
    int price;
    Engine engine;

	public Car(){
    	// Car라는 객체가 생성이 될 때
    	// Engine 객체도 함께 생성이 된다.
    	engine = new Engine();
    }
    
    public void startCar(){
    	engine.start();
        System.out.println("자동차가 출발합니다.");
    }

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

 

예시2. 컴퓨터와 cpu

public class CPU{

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

	public String getName(){
    	return name;
    }

	public void setName(String name){
    	this.name = name;
    }
}
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){
    	return cpu;
    }
    
    // 외부에서 접근 가능한 getter
    public CPU getCPU(){
    	return cpu;
    }
    
}
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());
    }
}

 


연습문제

Q1. a 참조 변수로 시작해서 D에 name 값을 화면에 출력하시오.

[조건] main 함수 안에는 A객체만 생성해야 합니다.

public class MainTest1{

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

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

	public String getName(){
    	return name;
    }

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

}
더보기
public class MainTest1{

	public static void main(String[] args){
    
    A a = new A();
    
    // 정답
    System.out.println(a.b.c.d.getName());
    
    // 이름을 변경한 후 D에 name 값을 호출해보았다.
    a.b.c.d.setName("두 번째 이름");
    System.out.println(a.b.c.d.getName());
    
    }
}
public class A{
	B b;
    
    public A(){
    	b = new B();
    }
}
public class B{
	C c;
    
    public B(){
    	c = new C();
    }
}
public class C{
	D d;
    
    public C(){
    	d = new D();
    }
}
public class D{

//class D는 수정사항이 없다.
	private String name;
    
    public D(){
    	name = "나는 D이다";
    }

	public String getName(){
    	return name;
    }

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

}

 

Q2. 각 클래스 내부(A,B,C,D)에서 객체를 생성하지 않고 외부에서 객체를 주입한 후 D에 getName()을 호출하시오.

public class MainTest2 {

	public static void main(String[] args) {

		// Q2. 각 클래스 내부(A,B,C,D)에서 객체를 생성하지 않고
		// 외부에서 객체를 주입한 후 D에 getName()호출 하시오.

		A a = new A();
		B b = new B();
		C c = new C();
		D d = new D();

	}// end of main

}// end of class
더보기
public class MainTest2 {

	public static void main(String[] args) {

		A a = new A();
		B b = new B();
		C c = new C();
		D d = new D();
        
        // 메서드 의존 주입
        a.setB(b);
        b.setC(c);
        c.setD(d);
        
        System.out.println(a.getB().getC().getD().getName());

	}// end of main

}// end of class
public class A{

	private B b;
    
    public void setB(B b){
    	this.b = b;
    }

	public B getB(){
    	return b;
    }
}
public class B{

	private C c;
    
    public void setC(C c){
    	this.c = c;
    }
    
    public C getC(){
    	return c;
    }
}
public class C{

	private D d;
    
    public void setD(D d){
    	this.d = d;
    }
    
    public D getD(){
    	return d;
    }
}
public class D{

// class D는 수정사항이 없다.
	private String name;
    
    public D(){
    	name = "나는 D이다";
    }

	public String getName(){
    	return name;
    }

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

}

'Java' 카테고리의 다른 글

Dependency (의존관계)  (0) 2024.04.26
Association(연관관계)  (0) 2024.04.25
Inheritance & Override (상속과 오버라이드)  (0) 2024.04.23
Method Overloading 메서드 오버로딩  (0) 2024.04.23
Static 변수  (1) 2024.04.19