[SW] DIP

SCY·2023년 4월 9일
0

: Dependency Inversion Principle

객체지향설계 SOLID 원칙에서 D에 해당하는 원칙으로, 저수준 모듈이 고수준 모듈에 의존하게 되는 것이다. 상위 모듈이 하위 모듈에 의존해서는 안 되고 추상화가 세부 사항에 의존해서는 안 된다.

쉽게 설명하면 변화가 발생할 수 있는 클래스에 의존하기보단 변화하지 않는 인터페이스, 추상 클래스 등에 의존하라는 원리이다.

예를 들어 복숭아주스 클래스와, 이를 바탕으로 JuiceService 클래스에 drink() 메서드가 있다고 가정하자.

class PeachJuice {
	String drink() {
    	return "drink peach juice";
    }
}
public class JuiceService {
	private PeachJuice peachj;
    
    public void JuiceService(PeachJuice pj) {
    	this.peachj = pj;
    }
    
	public String drink() {
    	return peachj.drink();
    }
}

이제는 오렌지주스를 바탕으로 JuiceService를 구현하고 싶다. 그렇다면 우리는 JuiceService 클래스 내 코드를 추가해야 할 것이다. 이렇게 되면 의존성 때문에 코드가 장황해질 것이다. 위에서 우리가 구현한 방식은 고수준 모듈이 저수준 모듈에 의존하는 방식이다.

이를 해결하기 위해서 저수준 모듈이 고수준 모듈에 의존하는 DIP 원리를 적용한다. 먼저 복숭아주스, 오렌지주스의 공통부분을 추상화한 interface를 만든다.

public interface Juice {
	String drink();
}

PeachJuice를 위 인터페이스를 이용해 리팩토링 해보자.

class PeachJuice implements Juice {
	@Override
	public String drink() {
    	return "drink peach juice";
    }
}

OrangeJuice 클래스도 구현해보자.

class OrangeJuice implements Juice {
	@Override
	public String drink() {
    	return "drink orange juice";
    }
}

이를 통해 JuiceService도 리팩토링 해보자.

public class JuiceService {
	private Juice j;
    
    public void JuiceService(Juice jj) {
    	this.j = jj;
    }
    
	public String drink() {
    	return j.drink();
    }
}

이렇게 되면 JuiceService 클래스의 코드를 변경하지 않고 복숭아주스, 오렌지주스를 둘 다 마실 수 있다! 행복🌞

profile
성장 중독 | 서버, 데이터, 정보 보안을 공부합니다.

0개의 댓글