1. Dependency (의존성)
✔ 개념
- A 클래스가 B 클래스를 잠깐 사용하는 관계
- A가 동작할 때 B가 필요하지만, A가 B를 직접 소유하진 않음.
- 즉, A는 B 없이는 기능을 수행할 수 없지만, B가 A와 완전히 묶여 있진 않음.
✔ 예제 코드
class BBB {
public void bbbMethod() {
System.out.println("BBB 메서드 실행!");
}
}
class AAA {
public void method1(BBB b) { // 의존성 (Dependency)
b.bbbMethod(); // AAA는 필요할 때만 BBB를 사용
}
}
public class Main {
public static void main(String[] args) {
AAA a = new AAA();
BBB b = new BBB();
a.method1(b); // BBB 객체를 만들어서 AAA에 전달
}
}
📌 설명
- AAA 클래스는 BBB가 없으면 method1()을 실행할 수 없음.
- 하지만 AAA가 BBB를 직접 생성하진 않음! (BBB는 외부에서 만들어서 넣어줌)
- 이런 관계를 "의존성(Dependency)" 이라고 해.
(AAA는 BBB를 "잠깐" 필요로 하는 거지, 소유하고 있진 않아.)
2. 의존성 주입 (Dependency Injection, DI)
DI는 Dependency(의존성)를 해결하는 방법 중 하나
✔ 개념
- A가 B를 직접 생성하지 않고, 외부에서 주입받는 방식
- A가 B의 생성 책임을 가지지 않음 → 유지보수가 쉬움
- DI에는 3가지 방법이 있음:
- 생성자 주입 (Constructor Injection)
- 세터 주입 (Setter Injection)
- 필드 주입 (Field Injection) (Spring에서 주로 사용됨)
3. 생성자 주입 (Constructor Injection)
✔ 개념
- A 클래스가 생성될 때, 외부에서 B 객체를 받아서 저장하는 방식
- B 객체를 먼저 생성해야 A를 만들 수 있음.
✔ 예제 코드
class BBB {
public void bbbMethod() {
System.out.println("BBB 메서드 실행!");
}
}
class AAA {
private BBB b;
// 생성자로 의존성 주입 (Constructor Injection)
public AAA(BBB b) {
this.b = b;
}
public void method1() {
b.bbbMethod();
}
}
public class Main {
public static void main(String[] args) {
BBB b = new BBB(); // BBB 객체 먼저 생성
AAA a = new AAA(b); // 생성자를 통해 BBB를 AAA에 주입
a.method1();
}
}
📌 설명
- AAA가 BBB 객체를 직접 생성하는 게 아니라, 생성자로 전달받음.
- AAA를 만들려면 BBB가 먼저 있어야 함 → A와 B의 관계가 느슨해짐(유연함).
- 유지보수가 쉬워지고, 테스트하기 쉬워짐.
4. 세터 주입 (Setter Injection)
✔ 개념
-
- A가 B를 직접 생성하지 않고, set 메서드를 통해 나중에 주입받는 방식
- 객체를 생성한 후에도 다른 B 객체를 넣을 수 있음.
✔ 예제 코드
class BBB {
public void bbbMethod() {
System.out.println("BBB 메서드 실행!");
}
}
class AAA {
private BBB b;
// 세터 메서드를 통한 의존성 주입 (Setter Injection)
public void setB(BBB b) {
this.b = b;
}
public void method1() {
if (b != null) {
b.bbbMethod();
} else {
System.out.println("BBB 객체가 없습니다.");
}
}
}
public class Main {
public static void main(String[] args) {
AAA a = new AAA();
BBB b = new BBB();
a.setB(b); // 나중에 BBB를 주입
a.method1();
}
}
📌 설명
- AAA 객체를 만들 때 BBB가 없어도 됨.
- setB(BBB b) 메서드를 이용해서 나중에 BBB 객체를 주입할 수 있음.
- 유연성이 높음! (객체 생성 후에도 B를 바꿀 수 있음.)
5. 집합 (Aggregation)
✔ 개념
- A가 B를 포함하고 있지만, B의 생명주기는 A와 독립적
- 즉, A가 없어져도 B는 계속 존재할 수 있음.
- 외부에서 만든 B 객체를 A에 전달하는 방식 → 의존성 주입(DI)과 비슷함.
- "약한 관계"
✔ 예제 코드
class BBB {
public void bbbMethod() {
System.out.println("BBB 메서드 실행!");
}
}
class AAA {
private BBB b; // Aggregation: AAA가 BBB를 포함
public AAA(BBB b) { // 생성자로 외부에서 주입
this.b = b;
}
public void method1() {
b.bbbMethod();
}
}
public class Main {
public static void main(String[] args) {
BBB b = new BBB(); // BBB 객체는 독립적으로 생성됨
AAA a = new AAA(b); // AAA가 BBB를 포함하지만, BBB는 다른 곳에서도 사용 가능
a.method1();
}
}
📌 설명
- AAA는 BBB를 포함하고 있지만, 직접 생성하진 않음.
- BBB 객체는 AAA가 없어져도 다른 곳에서 사용할 수 있음.
- 의존성 주입(DI)과 비슷한 개념!
6. 구성 (Composition)
✔ 개념
- A가 B를 "완전히 소유"하는 관계 (B는 A의 일부)
- A가 없어지면 B도 함께 삭제됨.
- 즉, B의 생명주기는 A에 종속됨.
class BBB {public void bbbMethod() {System.out.println("BBB 메서드 실행!");}}
class AAA {private BBB b = new BBB(); // Composition: AAA가 BBB를 완전히 소유
public void method1() {b.bbbMethod();}}
public class Main {public static void main(String[] args) {AAA a = new AAA(); // AAA가 생성될 때 BBB도 함께 생성됨a.method1();// AAA가 없어지면 BBB도 함께 없어짐}}
📌 설명
-
- AAA는 BBB를 포함하고 있지만, 직접 생성하진 않음.
- BBB 객체는 AAA가 없어져도 다른 곳에서 사용할 수 있음.
- 의존성 주입(DI)과 비슷한 개념!
- 독립적으로 존재 가능한 관계
🔹 1. 유연성과 의존성의 관계
유연성이 높다 = 변경하기 쉽다
유연성이 낮다 = 변경하기 어렵다
즉, AAA 클래스가 BBB 클래스에 얼마나 강하게 묶여 있는지에 따라 유연성이 달라짐.
- 의존성이 낮을수록 → 유연성이 높아짐 (다른 코드로 쉽게 교체 가능)
- 의존성이 높을수록 → 유연성이 낮아짐 (다른 코드로 바꾸기 어려움)
'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글
| [JAVA] Linked List (3) | 2025.04.01 |
|---|---|
| [JAVA] 상속, 다형성 (0) | 2025.03.27 |
| [JAVA] 싱글톤 (1) | 2025.03.24 |
| [JAVA] 메소드 (1) | 2025.03.21 |
| [JAVA] 클래스 (0) | 2025.03.20 |