목차
포함관계(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 |