Two words are key to understanding dependency. These terms have actually been used by the software engineering community by several years, and predate the common use of object-oriented languages. These terms are coupling and cohesion.
Coupling refers to the extent to which one component uses another to perform actions. Generally a goal is to reduce coupling as much as possible.
Cohesion refers to the extent to which the actions of a component seem to be tied together in purpose. Generally a goal is to increase cohesion within a software component.