interface 개념을 알아봅시다


자바나 C#, PHP, Typescript 등에서 에는 interface를 제공하지만 interface 를 제공하지 않는 언어도 많습니다. interface 가 없는 언어는 순수 추상 클래스 등 인터페이스를 대신하는 기능을 제공합니다. 그렇다면 이제 인터페이스에 대해서 이야기해보죠.

선언과 구현

인터페이스는 기본적으로 객체에 대한 선언과 구현을 분리하는 기능을 가지고 있습니다. 선언이라는 것은 어떤 것을 하겠다는 뜻입니다. 일반적인 언어 생활에서도 누군가 ‘나는 개발자가 되겠다’고 말한다면 선언했다고 합니다. 그 사람이 어떻게 개발자가 될지는 구체적으로는 모르겠지만요…

interface Walkable {
   void walk();
}

위의 코드는 Walkable 이라는 인터페이스를 만들었습니다. 이 인터페이스는 walk 이라는 기능이 있다는 것을 ‘선언‘하는 것입니다. 그게 어떻게 동작하는 것을 몰라도 우선 Walkable 이라는 인터페이스는 walk이라는 기능을 하겠다는 것입니다.


class Robot implements Walkable {
   public void walk(){
       System.out.println("뚜벅 뚜벅");
   }
}

위의 코드는 Robot이라는 클래스가 Walkable 인터페이스를 ‘implements’ 한 코드입니다. walk 기능은 인터페이스에서는 어떻게 동작하는지 알 수 없지만 Robot 에서는 walk 가 어떻게 동작하는지 알 수 있습니다.

System.out.println("뚜벅 뚜벅");

우리는 Robot 클래스에서 walk 기능이 위의 코드로 ‘구현’ 되었습니다. 인터페이스는 어떤 기능을 선언할 수 있도록 합니다.

인터페이스는 약속

인터페이스는 약속입니다. 어떤 기능이 어떤 일을 할지 미리 약속을 하는 것입니다. 개발자 A와 B 가 있습니다. A와 B는 계산기를 만드는 프로젝트를 하고 있습니다. A는 B에게 ‘덧셈 기능을 구현’하라고 이야기 했습니다. B는 A에게 ‘어떻게 구현’하느냐고 물어보았고 A는 ‘잘 모르겠지만 두 실수를 입력 받아서 실수를 리턴하도록 하는데 어떻게 구현되는지는 잘모르겠으니 알아서 잘 구현해보라’ 했습니다. 그리고 A는 B에게 다음과 같은 인터페이스를 넘겼습니다.

interface Addable {
   //...
  double add(double a, double b);
  //...
}

많은 경우, 기능들이 실제로 어떻게 동작하는지 구현하기 전까지 알기 어려운 경우가 많습니다. 그래서 인터페이스를 이용하여 어떻게 주고 받자라고 약속을 하게 되고 그것이 바로 인터페이스입니다.

델리게이트

위의 예의 A는 B가 구현한 코드를 어떻게 사용할까요? 바로 델리게이트 형식으로 사용할 수 있습니다. 델리게이트는 위임하다라는 뜻입니다. 델리게이트 객체지향언어의 주요 개념입니다. 두 객체가 있다고 하면 위임하는 객체가 있고 위임 받는 객체가 있습니다. 델리게이트는 객체가 어떻게 서로 소통하는지 보여주는 가장 간단한 방법입니다. 다음의 예제는 A 가 작성하고 있는 계산기의 일부 코드 입니다.

class Calculator {
   //...
   protected Addable addable;
   //..

   public double add(double a, double b){
       return this.addable.add(a,b);
   }
}

A는 당장 덧셈이 어떻게 구현되는지 몰라도 B가 대신 잘 구현해 줄 것이라고 생각하고 미래에 사용할 객체에게 덧셈 기능을 대신 처리하도록 ‘델리게이트’ 처리를 했습니다. 다시 말해서 구현을 처리 위임한 것입니다.