티스토리 뷰
의존성이란 ?
- 객체를 생성 및 사용함에 있어서 의존관계에 있는경우 를 말한다.
- 간단한 예제를 통해 알아보자.
class Character {
Sword sword;
public Character() {
sword = new Sword();
}
public void attack() {
this.sword.attack();
}
}
class Sword {
public void attack() {
System.out.println("10 의 데미지로 공격 !");
}
}
class Main {
public static void main(String[] args) {
Character swordMan = new Character();
swordMan.attack();
}
}
Character를 생성하는데 해당 캐릭터의 무기는 Sword이다.
해당 캐릭터는 Sword를 사용하며 , Sword가 없다면 공격을 할 수 없다
Sword에 의존하고있다고 볼 수 있다.
문제점 ?
- 무엇이 문제일까 ?
- Character를 생성하는데 있어서 해당 Character는 Sword에 대해 정확히 알고있어야한다.
- Character의 무기를 변경하고싶다면 ?
- 해당 Character class를 수정하거나, 새로운 무기를 가지는 class를 정의해주어야한다.
해결방법
- 먼저 Sword를 Interface를 사용해 추상화하고 , 관계를 느슨하게 설정해보도록 하자.
class Character {
Weapon weapon;
public Character() {
weapon = new Sword();
}
public void attack() {
this.weapon.attack();
}
}
interface Weapon {
void attack();
}
class Sword implements Weapon {
public void attack() {
System.out.println("10 의 데미지로 공격 !");
}
}
class Main {
public static void main(String[] args) {
Character swordMan = new Character();
swordMan.attack();
}
}
Sword를 Weapon 인터페이스를 활용하여 추상화 해주었다.
추후에 Sword 이외에 Bow , Gun 등 다양한 무기가 추가되어도 구현체만 바꾸어준다면 해당 무기를 사용하는 방법은 변경이 필요없다.
Sword를 추상화 하여 느슨한 관계를 만들어 주었지만 여전히 문제점이 존재한다.
‘어떤무기를 사용할것인지’ 를 Character ‘내부에서 결정하고 있다는것’ 이다.
게임 진행중에 캐릭터의 무기를 바꾸고싶다면 ?
- 현재 상황에서는 불가능하다.
해당 부분을 DI (dependency Injection) 을 활용하여 해결해보자.
class Character {
Weapon weapon;
public Character(Weapon weapon) {
this.weapon = weapon;
}
public void attack() {
this.weapon.attack();
}
}
interface Weapon {
void attack();
}
class Sword implements Weapon {
public void attack() {
System.out.println("10 의 데미지로 근거리 공격 !");
}
}
class Bow implements Weapon {
public void attack() {
System.out.println("7의 데미지로 원거리 공격! ");
}
}
class Main {
public static void main(String[] args) {
Weapon sword = new Sword();
Character swordMan = new Character(sword);
swordMan.attack();
// 10의 데미지로 근거리공격
Weapon bow = new Bow();
Character bowMain = new Character(bow);
bowMan.attack();
// 7의 데미지로 원거리공격
}
}
- 무기 생성을 캐릭터 내부에서 하지않고 무기를 외부로부터 주입받는다.
- 또한 무기를 추상화한 interface를 사용하기 때문에 외부에서 Weapon을 구현하는 어떠한 무기가 들어오더라도 캐릭터는 해당 무기를 사용할뿐 무기를 생성하는데는 관여하지 않는다.
정리
- DI (의존성 주입) 이란 ?
- 내부적으로 객체를 생성하는 의존 관계의 경우 객체생성을 내부가 아닌 외부로 부터 주입받는것을 말한다.
- 의존관계에 있는 객체를 외부로 부터 주입받음 으로써 관계가 느슨해지고 , 확장성이 좋아진다.
'Spring' 카테고리의 다른 글
Spring - PSA (0) | 2019.05.19 |
---|---|
스프링 AOP - 2 (0) | 2019.05.12 |
스프링 AOP -1 (0) | 2019.05.04 |
스프링을 활용한 의존성주입 - 2 (0) | 2019.05.01 |
스프링을 활용한 의존성주입 - 1 (0) | 2019.04.28 |
댓글