💡 학습 목표
|
package basic.ch18;
public class Car {
String name;
int price;
}
package ex_18;
public class Engine {
String name;
int price;
}
1. 포함 관계(Composition)에 대한 개념을 이해하자.
- 자동차와 엔진에 관계를 상속으로 표현하면 맞는 개념일까?
-> 포함 관계는 한 클래스가 다른 클래스를 포함하는 관계를 말합니다.
자바에서 포함 관계(Composition)는 한 클래스가 다른 클래스를 자신의 필드(멤버변수)로서 포함하는 것을 말합니다. 이 개념은 "has-a" 관계로도 알려져 있으며, 객체 간의 강한 연관성을 나타냅니다. 즉, 하나의 객체가 다른 객체 없이는 의미가 없을 때 포함 관계를 사용합니다.
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; // 포함 관계
public Car() {
// 포함관계 - Composition
// 객체안에 필요 객체를 직접 생성할 경우
// Composition 관계라고 합니다.
engine = new Engine();
// Car라는 객체가 생성이 될 때
// Engine 객체도 함께 생성이 된다.
}
public void startCar() {
engine.start();
System.out.println("자동차가 출발합니다.");
}
public void stopCar() {
engine.stop();
System.out.println("자동차가 멈춥니다.");
}
}
package basic.ch18;
public class CarMintTest {
public static void main(String[] args) {
Car car1 = new Car();
car1.startCar();
// 엔진의 속성인 name 변수의 값을 초기화 해보자.
car1.engine.name = "v8";
car1.engine.price = 4000;
System.out.println(car1.engine.name);
System.out.println(car1.engine.price);
}
}
2. 포함관계(Composition) 사례 연구
컴퓨터, CUP (Composition) 으로 설계하기
1. 내 코드
package basic.ch18;
public class Computer {
String name;
int price;
Cpu cpu;
public Computer() {
cpu = new Cpu();
}
public void computerStart() {
System.out.println("컴퓨터를 부팅합니다.");
cpu.start();
}
public void computerStop() {
cpu.stop();
System.out.println("컴퓨터를 끕니다.");
}
}
package basic.ch18;
public class Cpu {
String name;
int price;
void start () {
System.out.println(name + " 가 연산을 시작합니다.");
}
void stop() {
System.out.println(name + " 가 이제 그만 죽여달라고 화내며 꺼집니다.");
}
}
package basic.ch18;
public class ComputerTest {
public static void main(String[] args) {
Computer computer1 = new Computer();
computer1.cpu.name = "i5 8400";
computer1.cpu.price = 50000;
computer1.computerStart();
computer1.computerStop();
System.out.println(computer1.cpu.price + " 원 짜리 " + computer1.cpu.name + "를 바꾸시는걸 추천드립니다.");
}
}
2. 다른 코드
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;
}
}
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());
}
}
💡 포함 관계 특징 (중요)
|
도전과제
문제1
package basic.exercise.test01;
public class MainTest1 {
public static void main(String[] args) {
// 문제 1
A a = new A();
// a 참조변수로 시작해서 D에 name 값을
// 화면에 출력 하시오.
// 단, 여기서는 A객체만 생성해야 합니다.
System.out.println(a.b.c.d.getName());
}
}
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 C {
D d;
public C() {
d = new D();
}
}
package basic.exercise.test01;
public class B {
C c;
public B() {
c = new C();
}
}
package basic.exercise.test01;
public class A {
B b;
public A() {
b = new B();
}
}
문제2
package basic.exercise.test02;
public class MainTest1 {
public static void main(String[] args) {
// 문제 2
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);
// 각 클래스 내부에서 객체를 생성하지 않고 외부에서
// 객체를 주입한 후에 D에 getName() 호출 하시오
// 외부에서 주입 받을 수 있도록
System.out.println(a.getB().getC().getD().getName());
}
}
package basic.exercise.test02;
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.test02;
public class C {
private D d;
public void setD(D d) {
this.d = d;
}
public D getD() {
return d;
}
}
package basic.exercise.test02;
public class B {
private C c;
public void setC(C c) {
this.c = c;
}
public C getC() {
return c;
}
}
package basic.exercise.test02;
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
public B getB() {
return b;
}
}
'Java > JAVA 2 - 객체지향 핵심' 카테고리의 다른 글
JAVA 2 - 다형성(Polymorphism) (0) | 2024.04.24 |
---|---|
JAVA 2 - 연관, 의존 관계란? (0) | 2024.04.23 |
JAVA 2 - 상속(Inheritance) (0) | 2024.04.23 |
JAVA 2 - 메서드 오버로딩 (0) | 2024.04.23 |
JAVA 2 - 전화번호관리 프로그램 만들기 - {연습문제} (0) | 2024.04.22 |