인터페이스! 다시 생각하기


오광신
E-mail:raytrust@nser.co.kr
(주)엔써 커뮤니티
Homepage:http://my.dreamwiz.com/raytrust/


시작하며......

   지난호의 [디자인패턴(8)-안정성과 투명성]에서도 Interface에 대한 얘기가 아주 잠깐 언급되었다. 아는 사람은 다 알겠지만, 설계에서의 Interface에 대한 중요성은 아무리 강조해도 지나치지 않을 것이다. Interface의 개념을 잡지 못하고서는 Design Pattern을 잡는 다는 것도 불가능한 일이 될 것이다. 그러나, 현재 주위의 자바 개발자들 중 대부분이 Interface의 중요성을 간과하고 있다. 대부분의 자바 초보 개발자들이 Interface 하면 다중 상속을 위한 개념으로만 생각하고들 있을 것이다. 또한, 자바 입문서를 보더라도 Interface에 대해 기본적인 상식만 설명하고 그냥 넘어가는 경우가 많다. 이제는 Interface를 더 자세히 엿 보아야 할(?) 시간이 온 것 같다. 필자도 실력이 아주 뛰어나지는 않지만, Interface를 오해하고 있는 개발자를 위해서 Interface를 소개하려 한다. 참고로, 이 문서는 Java Tutorial중에서 Trail: Learning the Java Language, Lesson: Object-Oriented Programming Concepts을 기본으로 하고 있다는 것을 밝혀둔다. 남의 지식을 마치 내 것처럼 사용하는 것은 훔치는 것이나 마친가지이기 때문이다. 필자도 필자의 생각으로 글을 쓰고 싶었으나, 이 글보다 더 좋은 글이 나오지 않을 것 같아서 이 글을 인용하기로 했다. 하루 빨리 우리나라에서도 이정도의 글을 쓸 수 있는 디자이너가 나왔으면 하는 바램이다. 비록 남의 글을 인용했지만, 그냥 번역은 하지 않으려고 노력했다. 읽고 이해하기 쉽게 쓰려고 노력했는데...... 서론이 너무 길었나 보다. 이제부터 Interface에 세계로 들어가 보자. 들어가기 전에, 이 글을 읽는 독자가 객체 지향의 개념이 없다면 먼저 객체 지향 개념부터 공부하기를 바란다. 그럼, 지금까지 알고 있던 Interface의 개념을 모두 지우고 새롭게 시작해 보도록 하자. 그래야 이해가 더 빠를 것이다. GO! GO!

인터페이스(Interface)란 무엇인가?

   Java 프로그래밍 언어에서의 인터페이스에 대해 얘기해 보기 전에 인터페이스란 단어에 대해 먼저 살펴보자. 단어적인 의미로 보면, 인터페이스란 서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템이다 (interface is a device or a system that unrelated entities use to interact.). 이러한 정의에 따른다면 과연 어떤 것들을 인터페이스라고 생각할 수 있을까? 잘 떠오르지 않겠지만, 우리는 이미 일상 생활에서 많은 인터페이스를 사용하고 있다. 예를 몇 가지 들어보도록 하자. 우선 집에서 텔레비젼을 볼 때 많이 사용하는 리모트 컨트롤러를 생각해 보자. 이 리모트 컨트롤러는 텔레비젼을 보는 나와 텔레비젼 사이의 인터페이스이다. 그리고, 우리가 대화할 때 사용하는 한국어 또한 대화하는 두 사람 사이의 인터페이스이다. 군대에서 강요되는 움직임에 대한 규약도 서로 다른 계급의 군인들 사이의 인터페이스이다. 그렇다면, 이제 다시 Java 프로그래밍 언어로 돌아와서 생각해 보자. Java 프로그래밍 언어에서, 인터페이스는 서로 관계가 없는 객체들이 서로 상호 작용을 하기 위해서 사용하는 방법(device)이다. 인터페이스는 아마도 합의된 행동을 의미하는 프로토콜과 가장 유사할 것이다. 사실, 다른 객체 지향 언어들도 인터페이스의 기능을 가지고 있다. 그러나, 몇몇 언어에서는 인터페이스를 프로토콜이라고 명명하기도 한다.

   이러한 개념만으로 이해가 가지는 않을 것이다. 그래서, 자전거(bicycle)라는 클래스를 가지고 예를 한 번 들어보도록 하자.

   자전거라는 클래스와 자전거의 클래스 구조도(hierarchy)는 자전거가 할 수 있는 것과 할 수 없는 것을 정의한다. 그러나 자전거들은 세상에 존재하는 다른 것들과 상호 작용을 한다. 예를 들어, 상점에서의 자전거는 재고 관리 프로그램에 의해서 관리되어질 수 있다. 재고 관리 프로그램은 각각의 품목이 가격과 재고번호 같은 확실한 정보를 제공하는 동안에는 재고 관리 프로그램이 관리하는 품목의 클래스가 무엇인지 전혀 신경쓰지 않는다. 재고 관리 프로그램은 서로 관계가 없는 품목들의 클래스 관계(relationship)를 강요하기 보다는, 대신 품목에 대한 정보를 알 수 있도록 하는 규약을 만든다. 이러한 규약(protocol)은 인터페이스에서 상수와 메서드들 정의하는 방법으로 만들어질 수 있다. Inventory(재고) 인터페이스는 재고번호를 할당하고 소매 가격을 가져오고 설정할 수 있는 메서드들과 그외의 필요한 메서드들을, 구현(implement)이 아니라, 정의(definition)해야 한다. 간단한 Inventory 인터페이스는 다음과 같다.

interface Inventory {

             public void setInventoryNumber(String initInventoryNumber);

             public void setRetailPrice(double newRetailPrice);

             public double getRetailPrice();

}

소스 1 : Inventory Interface

   재고 관리 프로그램에서 자전거가 제대로 관리되어지기 위해서, 자전거 클래스는 Inventory 인터페이스를 구현(implement)함으로써 이러한 규약(protocol)에 동의해야만 한다. 클래스가 인터페이스를 구현하는 경우, 클래스는 인터페이스에 정의된 모든 메서드들을 구현한다는 것에 동의하는 것이다. 따라서, 자전거 클래스는 재고번호를 할당하고 소매 가격을 가져오고 설정할 수 있는 메서드들과 그외의 필요한 메서드들에 대한 구현을 제공해야만 한다. 위에서 정의한 Inventory 인터페이스를 구현한 간단한 Bicycle 클래스는 다음과 같다.

class Bicycle implements Inventory {

             String inventoryNumber;
             double retailPrice;

             public void setInventoryNumber(String initInventoryNumber) {
                          this.inventoryNumber = initInventoryNumber;
             }

             public void setRetailPrice(double newRetailPrice) {
                          this.retailPrice = newRetailPrice;
             }

             public double getRetailPrice() {
                          return this.retailPrice;
             }

}

소스 2 : Inventory Interface를 구현한 Bicycle 클래스

   이제 우리는 클래스 구조도의 위치에 상관없이 클래스들에 의해 구현되어질 수 있는 규약(protocol)을 정의하는 경우에 인터페이스를 사용할 수 있다. 인터페이스는 다음과 같은 경우에 유용하게 사용할 수 있다:

          서로 관계가 없는 클래스들 사이의 유사한 특성들을 부자연스러운
          클래스 관계를 설정하지 않고 얻어내야 하는 경우
          하나 또는 그 이상의 클래스들에서 똑같이 구현되어질 것 같은 메서드를
          선언해야 하는 경우
          클래스 자체를 드러내지 않고 객체의 프로그래밍 인터페이스를 제공해야
          하는 경우

마치며......

   Java 프로그래밍 언어에서의 Interface에 대해서 다시 한번 생각해 볼 수 있도록 글을 쓴다고 썼는데... 개발자들이 더 헷갈리지는 않을지 걱정이 먼저 앞선다. 우선 설계가 없는 프로젝트의 경우 이 글을 필요가 없을지도 모른다. 개발만 하면서 인터페이스를 제대로 사용하는 경우를 필자는 거의 보지 못했다. 보통 제대로 된 설계를 하는 경우에만 인터페이스를 제대로 사용하는 것 같다. Design Pattern을 공부하는 독자라면 인터페이스의 중요성을 새삼 느낄 수 있을 것이다. 우선 이번호에 제대로 된 구현 코드가 없어서 더 어려워 하시는 독자가 있을 지도 모르겠다. 시간이 된다면 다음에는 인터페이스를 구현하여 사용하는 제대로 된 예제를 가지고 다시 만나고 싶다. 이 글에 대한 어떠한 메일도 환영한다. 이상한 점이나 궁금한 점이 있으면 메일을 보내주길 바란다. 이 글을 읽고 Java 개발자들이 Interface에 대해 다시 한번 곰곰히 생각해 준다면 더 바랄 것이 없을 것이다.

참고 문헌

[1] The Java Tutorial
      Trail: Learning the Java Language
      Lesson: Object-Oriented Programming Concepts
      http://java.sun.com/docs/books/tutorial/java/concepts/interface.html


 oonewsletter - 2000/11/25