Une interface définit la frontière de communication entre deux entités, comme des éléments de logiciel, des composants de matériel informatique, ou un utilisateur. Elle se réfère généralement à une image abstraite qu'une entité fournit d'elle-même à l'extérieur. Cela permet de distinguer les méthodes de communication avec l'extérieur et les opérations internes, et autorise de modifier les opérations internes sans affecter la façon dont les entités externes interagissent avec elle, en même temps qu'elle en fournit des abstractions multiples. Elle peut aussi fournir un moyen de traduction entre des entités qui ne parlent pas le même langage, comme entre un être humain et un ordinateur. Étant donné que les interfaces permettent de référencer des objets externes, elles entraînent des coûts de développement supplémentaires par rapport à des communications directes.
L'interface entre un être humain et un ordinateur est appelée interface utilisateur. Les interfaces entre des composants de matériel informatique sont des interfaces physiques. Cet article traite des interfaces logicielles qui existent entre différents composants logiciels et fournissent un mode de programmation par lequel ces composants peuvent communiquer.
Un élément de logiciel fournit l'accès aux ressources informatiques (comme la mémoire, le CPU, le stockage, etc.) par son système informatique sous-jacent ; la disponibilité de ces ressources à d'autres logiciels peut avoir des ramifications majeures - quelquefois désastreuses -- pour ses fonctionnalités et sa stabilité. Un principe clé de conception est d'interdire l'accès à toutes les ressources par défaut, en autorisant l'accès seulement à travers des points d'entrée bien définis, i.e. les interfaces (voir encapsulation).
Les types d'accès que les interfaces fournissent entre les composants logiciels peuvent inclure : constantes, types de données, types de procédures, exception spécifications et signatures de méthodes. Dans certains cas, il peut être utile de définir dans l'interface des variables . On y spécifie souvent aussi la fonctionnalité des procédures et des méthodes incluses, soit par des commentaires ou (dans certains langages expérimentaux) par des assertions formelles logiques.
L'interface d'un module logiciel A est intentionnellement gardée rigoureusement séparée de l'implémentation de celui-ci. Ce dernier contient le code proprement dit des procédures et méthodes décrites dans l'interface (aux côtés du code des variables et procédures "privées"). Un module logiciel B qui utilise A (autrement dit un client de A) n'y accède pas directement, il y accède uniquement par le travers de l'interface de A. L'utilisation d'interfaces offre ainsi l'avantage qu'un remplacement d'implémentation de A par une autre, répondant aux mêmes spécifications de l'interface, ne peut causer de défaillance d'un module client B — si tant est bien sûr que son utilisation de A se conforme aux spécifications de l'interface (voir aussi principe de substitution de Liskov).