티스토리 뷰
Goal
- Dependency Injection (의존 주입)에 대해 알아본다
- 클래스의 강한 결합과 약한 결합에 대해 알아본다
- 클래스의 강한 결합과 약한결합을 코드 예시를 통해 알아본다
1. Dependency Injection (의존 주입 )
- Java 객체 프로그래밍에서 매우 중요한 개념으로, 어떠한 객체가 다른 객체를 사용하는 것을 그 객체에 의존한다고 표현한다.
2. 클래스의 강한 결합, 약한 결합
- 다른 객체를 사용하기 위해서는 객체를 직접 생성하거나 생성되어 있는 개체가 있어야 한다.
- 내가 직접 생성하여 다른 객체를 사용하는 것을 클래스의 강한 결합, 미리 만들어져 있는 것을 할당받아 사용하는 것을 약한 결합이라 한다.
2-1 강한 결합
- A객체는 갑 B, C 객체는 을인 관계 즉, A객체가 B,C 객체의 기능이 필요할 때 직접 만들어 사용하는 관계를 강한 결합 관계라고 한다.
- 갑을 관계에 따라 A객체는 B, C객체의 기능을 만들어 사용하지만 결과적으로 A객체는 B, C객체의 기능이 필요하기 때문에 A객체가 B,C객체에 의존한다고 표현할 수 있다.
2-2 약한 결합
- A객체가 을이고 B, C객체를 갖고 있는 누군가가 갑인 관계를 약한 결합 관계라고 한다.
- 을인 A객체가 B, C객체의 기능이 필요해 갑에게 요청하면 갑이 A객체에게 B, C객체의 기능을
주입시켜 주는 구조이며 이러한 클래스의 주입 행위를 의존 주입이라 한다.
- B, C객체를 A객체에 주입해줌으로써 A객체는 B, C의 기능을 사용할 수 있게 된다.
이처럼 객체간의 의존관계에서 객체를 직접생성하면, 생성부터 메모리 관리를 위한 소멸까지 해당 객체의 라이프 사이클을 개발자가 다 관리해야 하며,
이미 누군가가 생성한 객체를 주입받으면 사용만하면되기 때문에 개발자가 관리할 것이 적어진다는 장점이 있다.
3. 강한결합, 약한 결합 코드 예시 (Java)
1) 강한결합과 약한결합 1
package dependencyinjection;
import java.util.Date;
public class UnderstandDI {
public static void main(String[] args) {
}
// 2. 강한 결합 (직접 생성)
public static void memberUse1() {
Member m1 = new Member();
}
// 3. 약한 결합 (생성된 것을 주입 받음 - 의존 주입)
public static void memberUse2(Member m) {
Member m2 = m;
}
}
// 1. 의존해야할 기능이 있는 class 정의
class Member {
String name;
String nickname;
public Member() {
}
}
2) 강한결합과 약한결합 2
- 자바에서 제공하는 API또는 프레임워크에서 제공하는 기능에도 DI 개념을 적용할 수 있음
- Date : 자바에서 제공하는 클래스
package dependencyinjection;
import java.util.Date;
public class UnderstandDI {
public static void main(String[] args) {
// 기존의 API또는 프레임워크에서 제공하는 기능도 DI개념을 적용할 수 있음
Date date = new Date(); // Date클래스를 직접 생성하여 사용함 : 강한 결합
System.out.println(date);
}
public static void getDate(Date d) { // 약한결합
Date date = d;
System.out.println(date);
}
}
3) 약한 결합의 장점
- 클래스를 이용할 때 해당 클래스의 생성자를 private로 선언하면, 직접 클래스를 생성하는 강한 결합의 경우 생성자에 접근할 수 없어 에러가 발생할 수 있음.
- 약한 결합의 경우에는 이미 생성된 클래스를 주입받기 때문에, 객체의 라이프 사이클중 생성단계를 고려할 필요가 없으므로 에러가 발생하지 않는다.
package dependencyinjection;
import java.util.Date;
public class UnderstandDI {
public static void main(String[] args) {
}
// 2. 강한 결합 (직접 생성)
public static void memberUse1() {
Member m1 = new Member();
}
// 3. 약한 결합 (생성된 것을 주입 받음 - 의존 주입)
public static void memberUse2(Member m) {
Member m2 = m;
}
}
// 1. 의존해야할 기능이 있는 class 정의
class Member {
String name;
String nickname;
/*
* private으로 선언할 경우 약한 결합에는 error가 발생하지 않음
* 약한 결합은 만들어져 있는 인스턴스를 주입받기 때문에, 만들어질지 아닐지 걱정할 필요가 없기 때문
* 약한 결합을 사용하는 프로그래밍은 다른 클래스의 변화에 보다 더안전하고 유연하게 대처할 수 있음
*/
private Member() {
}
}
- 20200403
- 20200624
- 20200421
- 20200417
- 20200429
- 20200510
- 20200330
- chapter8
- 20200423
- 20200504
- 20200317
- 20200415
- chapter7
- 20200424
- 20200428
- 20200420
- 20200512
- 20200503
- 20200425
- 생활코딩리눅스
- 20200319
- 20201204
- 20200406
- 백준
- 20200804
- likelion
- 20200502
- 20200427
- 20200413
- 20200622
- Total
- Today
- Yesterday