: 한 객체가 다른 객체를 포함하여 구조를 만드는 방식
- 개발자가 두명이 있다.
- A의 개발자는 자바, 파이썬을 쓸 수 있다.
B의 개발자는 자바, 파이썬을 쓸 수 있다.- 조건 : 언어는 버전이 업데이트 될때마다 버전을 업그레이드 해줘야 한다
- 조건 : 두 개발자는 동업을 하게 되었다.
public class Composition {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.java();
b.java();
}
}
class A {
public void java() {
System.out.println("자바 21버전 프로그래밍");
}
public void python() {
System.out.println("파이썬 프로그래밍");
}
}
class B {
public void java() {
System.out.println("자바 21버전 프로그래밍");
}
public void python() {
System.out.println("파이썬 프로그래밍");
}
}

불편한 점
1. 버전이 업데이트 할 때마다 하나씩 들어가서 수정해주어야 한다.
2. 같은 코드가 중복이 되고 있다.
결론
1. 각자 하나의 언어를 맡고 버전을 관리하되
2. 본인에게 없는 언어의 요청이 들어오면
3. 다른 객체의 메소드를 빌려 사용하면
4. 중복 문제도 해결되고
5. 번거로운 수정문제도 해결된다.
public class Composition {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.java();
b.java();
}
}
class A {
// 자바 프로그램을 가지고 있는 b개발자 객체 리모컨 담기
B b = new B();
// a 개발자에 자바 메소드 만들기
// a 개발자 메소드에 b개발자 자바 메소드 담기
// 결론 : a개발자는 자바 메소드를 부를 수 있지만
// 실질적으로 불러오는 것은 b개발자의 메소드이다.
// 장점 : 업데이트는 b개발자만 하면 된다.
// (누락되는 오류 사라짐)
// a도 자바프로그램을 불러올 수 있다.
// (중복 해결)
public void java()
b.java();
}
public void python() {
System.out.println("파이썬 프로그래밍");
}
}

: 위의 코드는 b의 객체에 접근하여 해결했다면
이번 코드는 A클래스에 B클래스 관련된 객체를 담을 수 있는 객체참조변수를 만들고
메인 코드에서 A클래스에 b객체참조코드에 접근하여
B의 객체를 만들어서 b객체참조코드에 담을 수 있다.
public class Composition {
public static void main(String[] args) {
A a = new A();
A.b = new B();
a.java();
b.java();
}
}
class A {
B b ;
public void java()
b.java();
}
public void python() {
System.out.println("파이썬 프로그래밍");
}
}
만약 A클래스에 담고있는 B객체를 C객체로 바꾸고 싶을 때
즉, 사용하고 있는 객체를 바꾸고 싶을 때는 A안에 있는 자료형 타입도 바꿔야 다른 객체를 연결 시킬 수 있다.
public class Composition {
public static void main(String[] args) {
A a = new A();
// A.b = new C();
// 위 코드는 불가하다
// 왜냐하면 객체를 담는 참조변수의 자료형 타입이
// B로 되어 있기 때문이다.
// B클래스로 자료형이 붙어있는 변수는
// B의 객체와 연결할 수 있다.
// 만약 C객체로 바꾸고 싶다면,
// A클래스 에 있는 B클래스 변수 선언도
// C클래스로 바꾸어 주어야 한다.
A.b = new C();
a.java();
b.java();
}
}
class A {
// B b ;
C b ;
public void java()
b.java();
}
public void python() {
System.out.println("파이썬 프로그래밍");
}
}