Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- insertion sort
- 이것이 자바다
- Stack
- 이스케이프 문자
- datastructure
- buffer
- R
- Serialization
- list 컬렉션
- 윤성우 열혈자료구조
- Selection Sorting
- Algorithm
- C programming
- coding test
- 혼자 공부하는 C언어
- Graph
- 메모리구조
- C 언어 코딩 도장
- s
- 윤성우의 열혈 자료구조
- stream
- JSON
- 알기쉬운 알고리즘
Archives
- Today
- Total
Engineering Note
[Java] Dependency 본문
Dependency, 의존 : 다른 것에 의지하여 존재함
프로그래밍 세계, 그중에서 객체지향 프로그래밍에서도 의존한다는 것은 하나의 객체가 다른 객체에 의존하여 존재한 다는 것을 의미한다.
pseudo code
new Car(); // 자동차를 생산한다.
Car(){
new Tire(); // 자동차는 내부적으로 타이어를 생산한다.
}
이 경우를 살펴보면 ‘Car가 Tire에 의존한다’고 표현할 수 있다.
code
// Tire.java
package exam001;
public interface Tire {
String getBrand();
}
// KoreTire.java
package exam001;
public class KoreaTire implements Tire{
@Override
public String getBrand() {
return "Korea tire!";
}
}
// AmericaTire.java
package exam001;
public class AmericaTire implements Tire{
@Override
public String getBrand() {
return "America tire!";
}
}
// Car.java
package exam001;
public class Car {
Tire tire;
public Car(){
this.tire = new KoreaTire(); //의존관계가 일어나는 부분, Car의 생성자 코드에서 tire 속성에 새로운 타이어를 생성해서 참조할 수 있게 해주었다.
//this.tire = new AmericaTire(); // Car 생성자가 타이어를 직접 생성한다면 타이어의 종류가 바뀔 때마다 Car 생성자의 코드를 매번 바꿔야줘야 함. 코드의 확장성이 좋지 않음
}
public String getTireBrand(){
return "This tire is get " + tire.getBrand();
}
}
// Driver.java
package exam001;
public class Driver {
public static void main(String[] args) {
Car car = new Car();
System.out.println(car.getTireBrand()); //This tire is get Korea tire!
}
}
Dependency Injection(DI)
의존성 주입
주입: 주입식 교육할 때 주입과 같은 말이다. 외부에서 어떤 내용을 집어 넣어 준다는 뜻.
의존성 주입이란 의존하고 있는 것을 주입해주는 것이다. 위의 예시 처럼 Car 클래스를 통해 이해해보면 Car 클래스 내부에서 타이어를 생산하는 것이 아니라 외부에서 생산된 타이어를 자동차에 장착하는 작업이 주입해주는 것이다.
그런데 이 의존성 주입 방식에는 생성자 주입, 필드 주입 방식이 있다.
생성자 주입
// Tire.java
package exam002;
public interface Tire {
String getBrand();
}
// KoreaTire.java
package exam001;
public class KoreaTire implements Tire{
@Override
public String getBrand() {
return "Korea tire!";
}
}
// AmericaTire.java
package exam002;
public class AmericaTire implements Tire {
@Override
public String getBrand() {
return "America tire!";
}
}
// Car.java
package exam002;
public class Car {
Tire tire;
public Car(Tire tire){
this.tire = tire; //의존관계가 일어나는 부분, Car의 생성자 코드에서 tire 속성에 새로운 타이어를 생성해서 참조할 수 있게 해주었다.
}
public String getTireBrand(){
return "This Tire is get " + tire.getBrand();
}
}
// Driver.java
package exam002;
public class Driver {
public static void main(String[] args) {
Tire tire = new KoreaTire();
Car car = new Car(tire);
System.out.println(car.getTireBrand());
}
}
test code
package exam002;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CarTest {
@Test
void getKoreTireBrand() {
Tire tire = new KoreaTire();
Car car = new Car(tire);
assertEquals("This Tire is get Korea tire!", car.getTireBrand());
}
@Test
void getAmericaTireBrand() {
Tire tire = new AmericaTire();
Car car = new Car(tire);
assertEquals("This Tire is get America tire!", car.getTireBrand());
}
}

필드 주입
// Tire.java
package exam003;
public interface Tire {
String getBrand();
}
// KoreaTire.java
package exam003;
public class KoreaTire implements Tire{
@Override
public String getBrand(){
return "Korea tire!";
}
}
// America.java
package exam003;
public class AmericaTire implements Tire{
@Override
public String getBrand() {
return "America tire!";
}
}
//Car.java
package exam003;
public class Car {
Tire tire;
public Tire getTire(){
return tire;
}
public void setTire(Tire tire){
this.tire = tire;
}
public String getTireBrand(){
return "This tire is get " + tire.getBrand();
}
}
// Drive.java
package exam003;
public class Driver {
public static void main(String[] args) {
Tire tire = new KoreaTire();
Car car = new Car();
car.setTire(tire);
System.out.println(car.getTireBrand());
}
}
test code
package exam003;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CarTest {
@Test
void getKoreaTireBrand() {
Tire tire = new KoreaTire();
Car car = new Car();
car.setTire(tire);
assertEquals("This tire is get Korea tire!", car.getTireBrand());
}
@Test
void getAmericaTireBrand(){
Tire tire = new AmericaTire();
Car car = new Car();
car.setTire(tire);
assertEquals("This tire is get America tire!", car.getTireBrand());
}
}
\

'Programming Language > Java' 카테고리의 다른 글
| [Java] Access Modifier, Encapsulation (0) | 2022.09.09 |
|---|---|
| [Java] Object Oriented Programming (0) | 2022.09.09 |
| Window에 Java 파일 여러개 설치 feat batch (0) | 2022.08.03 |
| [Java] this 키워드 (0) | 2022.08.02 |
| [Java] 변수의 scope와 static (0) | 2022.07.09 |
Comments