우선 리눅스 시스템 프로그래밍 책에서의 API에 대한 정의는 다음과 같다.
API (Application Programming Interface) : 소프트웨어의 소스 코드 레벨에서 서로 인터페이스 하는 방식을 정의함
위는 책에서 ABI (Application Binary Interface)와의 차이점을 쉽게 설명하기 위해 내린 정의다.
위의 정의를 이해하기 위해 우선 인터페이스(interface)의 정의를 살펴보면 다음과 같다.
인터페이스(interface) : 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면
위의 정의는 사전적인 의미로 소프트웨어의 관점에서 본다면 작게는 서로 다른 두 개의 클래스 사이를 이어주고, 크게는 서로 다른 시스템끼리의 기능을 이어주는 다리 역할을 해준다고 볼 수 있다.
기능을 이어주는 다리 역할을 하기 위해서 서로 어떤 식으로 요청을 하면 어떤 결과를 반환해주는지, 즉 클래스 사이, 시스템 사이의 연결을 위한 방법을 정의하는 것이 필요하다.
따라서 서로의 사용 방법을 정의한 것을 인터페이스라고 할 수 있다.
인터페이스의 개념에 대한 예시는 다음과 같다.
어느 회사에서 TV와 리모컨을 개발했다고 상상해보자.
리모컨에서는 볼륨 up 버튼을 누르면 1이라는 신호를 보내고, 볼륨 down 버튼은 누르면 2라는 신호를 보낸다.
그리고 TV에서는 1이라는 신호를 받으면 실제로 볼륨을 높이고 2를 받으면 볼륨을 줄이도록 설계되었다.
위와 같은 상황에서 새로운 리모컨을 개발한다고 했을 때
볼륨 up 버튼을 누르면 1이라는 신호가 나오고
볼륨 down 버튼을 누르면 2라는 신호가 나온다면 같은 TV에도 볼륨 조절에 사용이 가능할 것이다.
이때 리모컨과 TV는 각각 1이라는 신호와 2라는 신호에 대해서 어떤 결과를 내놓을지에 대해(볼륨 조절) 약속(1이 오면 볼륨 up, 2가 오면 볼륨 down)을 한 상태이다.
이 약속한 내용이 바로 인터페이스 라고 할 수 있다.
이러한 인터페이스를 사용했을 때의 장점 중 하나는 호환성이라고 할 수 있다.
위의 예제처럼 새로운 리모컨을 만든다고 해도 볼륨 조절에 있어서 위의 인터페이스를 지킨다면 TV의 볼륨을 조절하는 기능에 대해 이전의 TV와 호환성을 가질 수 있기 때문이다.
다음 글에서는 다시 API의 정의로 돌아와서 과연 코드 레벨에서의 인터페이스가 어떤 의미인지 살펴보자
Reference
리눅스 시스템 프로그래밍. 로버트 러브