본문 바로가기
객체지향 설계5대 원칙/JAVA

객체지향5대원칙-DIP(DIP-Dependency Inversion Principle) - 의존 역전 원칙

by 쁘락지 2023. 5. 23.
반응형
의존 역전 원칙(DIP-Dependency Inversion Principle)

객체지향 5대원칙(SOILD)의 원칙중 D에 해당하는것으로 의존관계생성시
자주 변환하는것이 아닌 자주 변화하지 않는것에 의존성을 더 올려서
유지보수 능력을 올리기 위한 원칙이다.

그럼 예를들어보자
농부가 과수원에서 과일을 재배하는데 아래와 같다고 하자

package kr.co.touch;

public class Apple {
    public void Culture(){
        System.out.println("사과를 재배합니다.");
    }
}

package kr.co.touch;
public class Orange{
    public void Culture(){
        System.out.println("오렌지를 재배한다.");
    }
}

package kr.co.touch;

public class Farmer extends  Apple{

    @Override
    public void Culture() {
        super.Culture();
    }
}



package kr.co.touch;

public class Main {
    public static void main(String args[]){
        Farmer farmer = new Farmer();
        farmer.Culture();
    }
}


이런경우 농부가 재배하는 작물을 Orange로 바꾼다면 아래와 같이 수정해야 합니다.

package kr.co.touch;

public class Farmer extends  Orange{

    @Override
    public void Culture() {
        super.Culture();
    }
}


이렇게 Farmer가 뭘 재배하냐는 작물을 계속 상속 의존하게 되면 새로운 작물로 변경할때마다 지속적으로 Farmer클래스가 변경되야 합니다. 그래서
Farmer는 재배만 하고 뭘 재배할지는 외부에서 정의해서 준다면 이렇게 변경할수 있습니다.

package kr.co.touch;

public abstract class Fruit{
    public abstract void Culture();
}

package kr.co.touch;

public class Farmer{
    private Fruit fruit;
    public void Culture(Fruit fruit) {
        fruit.Culture();
    }
}


package kr.co.touch;

public class Apple extends Fruit {
    public void Culture(){
        System.out.println("사과를 재배합니다.");
    }
}


package kr.co.touch;
public class Orange extends Fruit{
    public void Culture(){
        System.out.println("오렌지를 재배한다.");
    }
}

package kr.co.touch;

public class Main {
    public static void main(String args[]){
        Fruit fruit = new Apple();
        Farmer farmer = new Farmer();
        farmer.Culture(fruit);
    }
}

여기서 Apple재배에서 Orange로 변경하게 되면 다음과 같이만 해주면 됩니다.
package kr.co.touch;

public class Main {
    public static void main(String args[]){
        Fruit fruit = new Orange();
        Farmer farmer = new Farmer();
        farmer.Culture(fruit);
    }
}

 

반응형