내가 대학교 내내 C언어만 배우다가 객체지향언어를 처음으로 배우면서, 인터페이스란 단어를 접했던 것 같다.
당시에는 많은 자료를 검색해보아도 이해가 잘 안되었기 때문에, 이에 대한 내용을 최대한 이해하기 쉽고 디테일하게 설명하고자 한다.
먼저, 인터페이스에 대해서 알아보자
인터페이스라는 영어에서도 알 수 있듯이, Inter(상호간에) Face(얼굴을 맞대다)라는 뜻이다.
명사로서는 상호간에 얼굴을 맞대는 그러한 지점이라는 뜻이다.
따라서, 인터페이스를 위해서는 두 가지 조건이 충족되어야한다.
조건 1. 서로 다른 두개의 객체의 존재
조건 2. 상호작용
위의 조건이 충족된다면 언제나 인터페이스가 존재한다.
예를 들어보자. 미국에 있는 사람과 한국에 있는 사람이 존재하고(조건 1) 서로 대화를 통해 의견을 주고받고 싶다(조건 2)고 하자. 미국에 있는 사람은 전화기를 통해 번호를 입력한다. 한국에 있는 사람은 전화기가 없기 때문에, PC를 통해 인터넷 전화를 받는다. 이 때 서로가 상호작용을 위해서 실제로 보는 것, 그것이 바로 인터페이스이다. 즉, 미국에 있는 사람의 인터페이스는 전화기가 되고, 한국에 있는 사람은 인터넷 화면이 된다.
이 때, 중요한 것은 서로는 서로의 상호작용이라는 목적을 달성하기 위해 인터페이스 너머에 있는 통신방법, 통신규칙, 물리적인 전자적데이터의 흐름, 전화기 작동원리, 인터넷 동작원리와 같은 것들을 알 필요가 없다는 것이다. 단지 우리가 목적을 달성하기 위해 필요한 것은, 인터페이스의 사용방법일 뿐이다. 그리고 이러한 방식을 우리는 캡슐안에 꽁꽁싸매어져서 안(구현, implementation)이 보이지 않고 바깥(인터페이스, interface)만 보이는 것처럼, 캡슐화(Encapsulation)라고 한다.
만약 인터페이스가 유지된다면, 사용자입장에서는 내부에서 어떠한 방식으로 통신을 변경하든, 전화기를 바꾸든, 컴퓨터이용 환경을 바꾸든, 사용자의 사용방법의 변화없이 이용이 가능하므로 매우 편리하다. 또한, 전화기, 컴퓨터는 얼마든지 인터페이스만 유지된다면 다른 제품으로 갈아끼워도 사용하는데 문제가 없다. 이러한 설계를 Plug-in architecture라고 한다. 인터페이스를 유지한채로 내부만 콘센트에 끼웠다 뺐다가 하는 것처럼 교체하는 것이다.
그렇다면 캡슐 내부로 들어가서, 사용자 입장에서는 그렇지만, 만약 전화기 제조사의 입장에서는 어떨까?
전화기는 통신사업자가 제공하는 규칙에 따라 제작해야 한다고 하자. 그러면 그 규칙이 전화기를 제작하기위한 인터페이스가 되고, 해당 규칙에 따라 전화기를 제조해야 한다. 통신사업자는 인터페이스를 제공하고, 전화기 업체는 그 인터페이스를 구현하는 것이다. 즉, 서로 다른 두 객체(통신사업자, 전화기 제조업체) 중 한쪽에서 상호작용을 위한 인터페이스를 제공하고, 그것에 따라 다른 한쪽에서 구현을 하는것이다. 전화기 제조업체에서도 사용자와의 상호작용을 위해 사용자에게 인터페이스를 제공할 수 있다. 하지만, 많은 사용자가 버튼을 누르는 방식으로 전화기를 사용하고 있다면 다른 방식으로 쉽사리 인터페이스를 변경하기 어렵다. 이런 경우에는 인터페이스 방식은 전화기 제조업체가 제공하지만 사용자의 익숙함에 큰 영향을 받게 된다.
지금까지 말한 구조는 그림으로 다음과 같이 표현될 수 있다.
사용자 |
전화기업체 |
통신사업자 |
인터넷전화서비스업체 |
사용자 |
위와 같은 계층을 통해 서로간에 상호작용 하며, 계층간의 경계에는 인터페이스가 존재하고, 각 층에서는 인접한 계층 너머의 것들을 알 수 없다. 이러한 설계가 Layered Architecture이다. 물론 우리가 관심있는 수준에 따라서 계층을 다시 내부적으로 나눌 수 있다.
여기서 한가지 중요한 것은, 인접한 두 계층 중 어느곳에서 인터페이스를 제공하는지의 여부이다. 즉, 인터페이스를 구현하는 쪽은 항상 인터페이스에 종속되어있다. 이것은 비즈니스에서는 비대칭적인 영향력을 야기한다.
만약, 통신사업자가 통신규칙 인터페이스를 제공하면서 전화기 업체가 그것을 따라 만들어야 한다면, 통신사업자가 인터페이스 변경을 마음먹기에 따라서, 전화기업체는 구현을 변경해야한다.
예를 들어, 통신규칙중에 반드시 통신사업자가 제공하는 칩을 전화기에 심어야한다는 제약사항 따위가 있고, 그 칩을 사용하려면 돈을 지불해야한다고 하면 전화기업체는 해당 인터페이스에 따라 구현하기 위해 반드시 칩을 사야만 한다.
그렇다면 통신사업자가 인터페이스가 변경되어 칩을 변경해야하고, 해당 인터페이스는 더 많은 통신기능을 제공할 경우에, 더 많은 통신기능을 제공하는 인터페이스가 대세가 된다면, 전화기 제작업체는 울며겨자먹기로 칩을 바꾸는데 비용을 지불해야만 할 것이다.
이것은 우리가 요즘 듣는 플랫폼 비즈니스와 일맥상통한다. 플랫폼업체는 자기만의 인터페이스를 제공하고, 그 위에서 사용자는 많은 것들을 할 수 있다. 하지만, 인터페이스에 종속됨으로서 변경이 있을 때 플랫폼 업체에 따라야 하고, 익숙하면 익숙할 수록 쉽사리 다른 인터페이스로 변경하기를 껴려하게 된다. 플랫폼 비즈니스에서 플랫폼업체는 막강한 힘을 갖게 된다. 그렇다면 플랫폼 업체에게 중요한것은 무엇일까? 바로 최대한 많은 종속성을 확보하는 것이다. 즉, 최대한 많은 사용자가 플랫폼을 이용하도록 하는 것이다. 하지만 이러한 종속성이 항상 한방향으로만 흐르는 것은 아니다. 만약, 다른 플랫폼 업체가 제공하는 인터페이스가 가장 대중적이라면, 다른 플랫폼 업체들도 해당 인터페이스를 따르는게 일반적으로 초기에 사용자를 많이 확보하는 길일 것이다. 즉, 오히려 사용자가 인터페이스의 결정에 영향을 미치는 것이다.
따라서, 위에서 보았듯 엄청난 시장점유율을 차지하는 전화기제작업체가 나는 A라는 통신규칙으로 전화기를 구현하겠다고 선포하고 해당 통신규칙을 제공하는 인터페이스만 사용한다면, 대부분의 통신사업자들은 그러한 방식의 인터페이스를 제공할 것이고, 이것은 위에서 서술한 것과 역전된 힘의 관계를 낳게 된다. 심지어는 전화기 제작업체에서 인터페이스를 제공해버릴수도 있다...!
인터페이스와 구현은 위에서 서술한 두가지 조건,
조건 1. 서로 다른 두개의 객체의 존재
조건 2. 상호작용
이 충족된다면 항상 존재할 수밖에 없다. 그리고 비즈니스관계에서 인터페이스는 일반적으로 비대칭적으로 결정된다.
이러한 개념은 프로그래밍에서까지 확장해 적용가능하다.
그것은 다음에 알아볼 것이다...