너무나 많은 곳에 쓰이는 단어 인터페이스(Interface)..
UI(User Interface), 프로그래밍 언어에서 부르는 Interface, API, CGI 등..
우리는 가끔 여러 사람 혹은 다른 회사와 공동 프로젝트 진행시
"인터페이스를 맞추자"
"인터페이스를 열어 달라"
"인터페이스 만들어 주세요"
"이렇게 하기로 인터페이스 정해 놓게 왜 인터페이스대로 하지 않습니까?"
이말을 두루뭉술하게 여러곳에 적용해서 아주 빈번히 사용하고 있다.
용어를 설명하는데 있어서 일반 사전적인 의미와 컴퓨터 사전적인 의미는 많이 다르다.
주로 컴퓨터의 용어가 더 많은 의미를 내포하고 있는데..
여러 방면에서 사용하고 있는 말이지만..
프로그래밍 언어에서의 인터페이스의 역할에 대해 그리고
이말을 사용하고 있는 공통적인 의미는 '약속'라는 뜻이 아닐까.?
라는데서 이글을 써내려 가려고한다.
프로그래밍 언어에서 Interface는 무엇으로 사용하는가..
Interface
하면 떠오르는 것들.
폴리모피즘, 상속, 오버라이드, 동적 바인딩
(저는 이런것들이 떠오르네요^^)
본인은 C++을 주력 언어로 사용하고 있지만..
java로 Interface라는 것으로 풀어 보려고한다.
개인적으로는 java가 더 후대 언어라서 인지 C++ 보다는 좀더 언어가 명확하다라고 해야할까? 좀더 과학적이랄까.
(java의 문법자체는 C에서 나온것에 이라는것에는 이견이 없습니다. 따라서 C 문법의 단점 또한 계승하고 있지요..-.-)
암튼 java를 해본지 너무 오래 되긴했지만(달갑진 않지만 지금도 언어 자체가 진화하고 있더군요..), java로 부터 나름대로 느낌점은 그렇다.
(뭐가 더 우수한 언어이고, 뭐가 좋은지에 대한 논쟁은 이 글에서 논하고자 하는 쟁점은 아니므로 있는 그대로만 받아들여 주시기 바랍니다.)
일단 문법적으로 Interface를 파악해 볼까!
java에서 Interface라는 키워드를 적었을때 문법적인 제약이 발생한다.
1. prototype만 기술
2. 자체 객체생성(instance) 할 수 없음.
3. 반드시 sub class에서 구현.
4. 그리고 접근자는 public !!
1~3번 은 문법적인 제약 조건이지만..
4번은 Interface를 사용하는것에 대한 아주 큰 의미를 내포하고 있다.
혹은 Interface를 사용하는 의미의 전부라고도 할 수 있다.
4번으로 인해 1~3이 왜 저러한 제약 조건이 붙은것인지에 대한 이유가 되기도 한다.
java쪽 기술에서 보면 J2EE라는 기술이 있고, API에서는 javax로 따로 분류하고 있는데..
Database관련하여 JDBC라는것이 있다.
Interface를 설명하는데 아주 좋은 예라 할 수 있다.
ODBC도 동일하지만 JDBC만을 예로 들자면
JDBC를 이용하여 개발시 우선 3가지 요소가 존재한다.
1. SUN : Interface 만 제공
2. DB 벤더 : Interface 구현
3. 개발자 : Interface 활용
우선 SUN사에는 sql을 이용할 수 있는 interface만 만든다(정확히 표현하자면 '명세한다', '공개한다').
DB 벤더는 SUN서 공개한 Interface를 보고 구현을 한다(이것이 드라이버가 되겠지요).
개발자는 드라이버에서 구현된 Interface를 호출해서 쿼리를 던진다.
그럼 가정을 해보자.
SUN에서 Interface를 제공하지 않았다면 어떻게 될까.
A라는 DB 벤더는 독자적인 인터페이스를 만들어서 함수를 제공할것이다.
B라는 DB 벤더 또한 독자적인 인터페이스를 만들어서 함수를 제공할것이다.
C 벤더 또한 마찬가지로 독자적인 구현...
(아...우울해지겠죠...그쵸..?)
예를 들어 각 회사에서 쿼리를 실행하는 함수 다음과 같이 정의 했다.
A: runExec(string str)
B: RunQuery(String str)
C: ExcuteQuery(String str)
이와 같이 각 벤더가 정의 했다면 개발자는 각 벤더의 API문서를 봐야 할것이다.
왜 냐하면 Interface가 모두 다르기 때문에..
(이런것들을 native driver라 부르지요..)
좀더 들어가서 개발자는 위 세가지 DB를 모두 지원하는 어플리케이션을 만든다고 가정한다면..
if문의 분기 처리로 호출할것인지.. 이때부터 난잡해지는 코드에 고민에 빠지게 된다.
하지만 JDBC를 이용하면 SUN에서 Interface를 공개(혹은 제약) 했기때문에...
각 DB 벤더는 그 Interface 명으로 Interface를 자사의 DB에 맞게 각기 구현해야만한다.
따라서 개발자는 각 벤더가 어떻게 구현했는지 알 필요가 없다.
개발자는 각 DB 벤더가 어떻게 구현했는지는 몰라도 "나는 이 Interface만 호출하면 원하는 결과를 얻을 수 있다"라는 것을 알고있다.
각 벤더의 API문서를 볼 필요도 없고(아주 가끔은 필요할 수 도..) 개발자는 SUN에서 제공한 Interface에대한 명세만 보면 되니까.
'SUN에서 Interface라는 제약을 뒀기 때문에 각 벤더가 자사의 DB에 맞게 구현됐다'라고 보장을 받을 수 있기 때문이다.
언어의 문법상 Interface는 상속하여 반듯이 구현해야 하기 때문에 각 DB 벤더는 알아서 구현했을 것이다.
그럼 여기서 초반부에 Interface는 '약속'이다라고 무작정 정의해버린 문장에 부합된다고 볼 수 있지 않을까.
여기서 Interface를 다른 말로 바꾸어 보면..
Interface는
약속이다.
공개이다.
명세이다.
규약이다.
프로토콜이다.
모두 맞는 말이 아닐까..
위에서 나열한 1~4에 대한 내용이 4이기 때문에 1~3이 그렇게 될 수 밖에 없다는것에 대한 이유가 된다고 볼 수 있다.
아주 간단하게 정리해보자
Interface는 어떻게 구현됐는지는 모르지만, Interface만 호출하면 원하는것을 얻을 수 있다.
그러므로 인터페이스 공개(public)가 아닌것이 의미가 있을까!!
("공개가 아닌 인터페이스는 의미가 없다"라고 정의 해도 되겠지요?)
Interface를 활용한기술이 또 무엇이 있을까?
RMI
CORBA
COM
EJB
...
...
위 기술중 한가지는 반듯이 써봤을것을 믿어 의심치 않는다.
COM을 사용하면서 우리는 COM에서 제공한 Interface만 보고 작성한다.
어떻게 작성되어 있는지 우리는 알지 못하지만, Interface를 호출하면 된다는것 만큼은 알고있기 때문에..
왜냐하면 그렇게 약속했으니까, 규약했으니까, 공개했으니까.
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=70&MAEULNO=4&no=128&page=3