주요글: 도커 시작하기
반응형

자바에서 인터페이스는 다음과 같은 형태의 코드로 구성됩니다.

public interface Component {
    public void init();
    public void start();
    public Status getStatus();
    ...
}

인터페이스의 가장 큰 특징은 구현이 없이 약속(contract)만 정의했다는 겁니다. 예를 들어, 자바 1.4까지는 쓰레드 프로그래밍을 하려면 반드시 Runnable 인터페이스를 만들어야 했는데, 이 Runnable 인터페이스에 선언된 run() 메소드는 쓰레드가 시작될 때 실행된다는 걸 명시하고 있습니다.

인터페이스로는 어떻게 동작할 것이다라는 기능만 명세(specification)하고 그 명세에 따라 클래스를 구현(implementation)하는 것은 이젠 많은 개발자들에게 익숙한 방식입니다. 자바에서는 이미 Runnable 인터페이스를 사용해서 쓰레드를 구현하고 있고, 서블릿은 Servlet 인터페이스를 사용해서 서블릿을 구현하고 있습니다. EJB에서는 EJB의 기능을 명세한 인터페이스를 만들고, 그 인터페이스를 implements한 구현 클래스를 만들도록 하고 있구요.

이렇듯 몇년 동안 나온 기술들은 하나같이 인터페이스를 사용해서 기능을 명세하고 있고, 이 명세에 따라 클래스를 구현하도록 유도하고 있습니다. (심지어, Hibernate, Strut니 하는 오픈소스 기술들 역시 내부적으로 기능을 정의한 인터페이스와 그 인터페이스를 구현한 클래스로 구분되어 있습니다.)

인터페이스가 이렇게 많은 곳에서 기능을 명세하는 데 사용되는 가장 큰 이유는 인터페이스를 사용함으로써 구현에 의존적이지 않은 코드를 만들 수 있기 때문입니다. 예를 들어, EJB 콘테이너를 생각해보죠. EJB API는 크게 SessionBean과 EntityBean 인터페이스를 정의하고 있으며, 이들 인터페이스에는 빈 컴포넌트가 지켜야 할 규칙(즉, 메소드)이 명시되어 있습니다. 개발자들은 그 규칙에 따라 EJB 컴포넌트를 만들게 됩니다. 개발자가 어떤 클래스를 만들었던지간에 SessionBean 내지 EntityBean 인터페이스에서 정의한 대로 클래스를 구현했다면, EJB 콘테이너는 그 클래스를 사용할 수 있게 됩니다. 즉, 클래스의 구현에 상관없이 동일한 방식으로 모든 EJB 컴포넌트를 다룰 수 있게 되는 것이죠. 스트러츠 역시 구현에 상관없이 동작합니다. 개발자가 Action에서 명세한 대로 클래스를 구현했다면, 스트러츠는 올바르게 동작합니다.

이렇듯 인터페이스의 가장 큰 힘은 기능의 정의와 기능의 구현을 분리할 수 있다는 데 있으며, 이는 구현의 확장 및 교체가 쉽다는 걸 의미합니다. 마치, 똑같은 커넥터를 사용하는 컴퓨터 키보드를 쉽게 교체할 수 있듯이, 프로그램 모듈도 동일한 인터페이스를 채택하도록 함으로써 쉽게 교체할 수 있게 되는 것이죠.

여러분도 교체 가능한 모듈을 설계해야 한다거나, 확장이 쉬운 구조를 만들고 싶다면 인터페이스를 사용하세요. 그럼 답이 보일겁니다.

+ Recent posts