클래스 A가 다른 클래스 (혹은 인터페이스) B를 사용할 때 A는 B에 의존한다고 이야기한다. 즉, 한 객체의 코드에서 다른 객체를 생성하거나 다른 객체의 메서드를 호출할 때, 그리고 파라미터로 객체를 전달받아 사용할 때 의존성이 발생한다고 할 수 있다.
최근 버전에서는 compile은 deprecated 되었고, 같은 기능을 하는 api가 남아있다.
하지만 implementation 사용을 권장한다.
Module B <- Module A <- Library
만약 위와 같은 형태로 Module A가 Library에 의존하고 있고, 그 Module A를 Module B가 의존하고 있을 때
compile을 이용해 Module A를 Module B에 추가하는 경우, Module A의 상위 Module인 Library까지 함께 가져온다.
implementation을 이용해 Module A를 Module B에 추가하는 경우, Module A만 가져온다. 따라서 Library는 Module A 내부에서만 실행되고 Module B에서는 접근할 수 없다.
모듈 간의 의존성을 줄일 수 있다. 유지보수성을 높이기 위해 내부 구조를 숨기고 인터페이스를 제공하여 내부 동작과 상관없이 라이브러리를 사용할 수 있도록 하였지만, 상위 Module까지 함께 가져와 기능을 사용할 수 있다면 계층을 분리한 의미가 없어진다.
빌드 시간에 이점이 있다. 만약 상위 모듈인 Library가 변경되었을 때, compile을 사용하는 경우 Module A와 Module B 모두 Library를 의존하고 있어 모두 다시 빌드가 이뤄져야 한다.
하지만 implementation을 사용할 경우 Library를 직접 의존하는 Module A만 다시 빌드하고, Module A의 인터페이스는 바뀐 부분이 없으므로 Module B는 그대로 사용 가능하다.