자바에서 Interface를 사용하는 이유

Interface에서 메소드를 정의만 해놓고, 이 Interface를 implements로 상속받은 Class에서 Interface의 메소드들을 구현할 수 있다.

하지만 왜 Interface를 써야하나? 라는 의문에 Interface 사용 이유를 찾아보고 정리했다.

Class만 사용한 경우

예로 한국인을 위한 번역기를 만들어 본다. 여러 언어들에 대한 번역 클래스가 아래와 같이 필요할 것이다.

// 한국어 - 영어
public class EnglishTrans {
    public String koreanToEnglish(String str) {
        //TODO: 한국어를 영어로 번역
    }
    public String englishToKorean(String str) {
        //TODO: 영어를 한국어로 번역
    }
}

// 한국어 - 중국어
public class ChineseTrans {
    public String koreanToChinese(String str) {
        //TODO: 한국어를 중국어로 번역
    }
    public String chineseToKorean(String str) {
        //TODO: 중국어를 한국어로 번역
    }
}

영어와 중국어에 대한 2개의 클래스가 만들어 졌다.

이제 위 클래스들을 사용해 보자. 먼저 영어 번역이다.

// 영어 번역
EnglishTrans trans = new EnglishTrans();
String str = trans.koreanToEnglish(str);

이번엔 중국어로 고쳐주고 싶다

// 중국어 번역
ChineseTrans trans = new ChineseTrans();
String str = trans.koreanToChinese(str);

위와 두 객체 선언 코드와 같이 각 기능에 대한 클래스를 사용할 때, 객체의 타입도 바뀌어 진다. 물론 여기에 기능적 문제는 없다. 하지만 언제나 개발은 만든다고 다가 아니다. 만들 때의 효율성, 그리고 그 이후의 유지보수 작업을 생각하며 개발을 해야한다.

만약 여러 사람이 협업을 하여 각자 다른 클래스를 개발한다면 문제는 더 심각해진다. 각자의 스타일대로 개발을 하여 클래스명, 메서드명, 객체명이 모두 제각각인 등 통일성이 없어져 가독성, 유지보수성 등이 떨어질 것이다.

이러한 코드에 공통적인 부분을 추상화하여, 개발의 효율성을 높이는 방법이 있다. 그것이 바로 인터페이스 기반 프로그래밍이다.

Interface를 사용한 경우

위 영어번역, 중국어 번역 기능 중 공통적인 부분은 한국어를 번역, 한국어로 번역이라는 것이다. 이 기능을 추상화하여 Interface를 만들어 보자

public interface Translation {
    // 한국어를 번역
    public String translate(String str);
    // 한국어로 번역
    public String translateInto(String str);
}

이제 추상화한 메소드들을 각 클래스에서 상속받아 세부 기능을 구현한다.

// 한국어 - 영어
public class EnglishTranslation implements Translation {
    @Override
    public String translate(String str) {
        //TODO: 한국어를 번역
    }
    @Override
    public String translateInto(String str) {
        //TODO: 한국어로 번역
    }
}

// 한국어 - 중국어
public class ChineseTranslation implements Translation {
    @Override
    public String translate(String str) {
        //TODO: 한국어를 번역
    }
    @Override
    public String translateInto(String str) {
        //TODO: 한국어로 번역
    }
}

클래스를 호출하는 부분은 아래와 같다.

// 영어 번역
Translation trans = new EnglishTranslation();
String str = trans.translate(str);

// 중국어 번역
Translation trans = new ChineseTranslation();
String str = trans.translate(str);

코드가 정리되고 통일성 있어졌다.

이젠 사용할 때 인터페이스를 이용해서 원하는 언어에 따라 사용할 클래스만 골라 객체를 생성하면 된다. 또한 코드의 재활용이 훨씬 용이해졌다.

물론 인터페이스를 만들지 않아도 협업 시에 서로 사용할 이름에 대해 약속하고, 오타 조심하고 하면 문제될건 없다. 하지만 이런 개발 시 이러한 구조를 가지고 가면 좀더 효율적인 개발을 할 수 있지 않을까?

정리하자면, Interface의 사용 이유는 아래와 같다.

  • 효율성 : 코드의 재활용이 가능하게 되고, 오타가 줄어 개발 시간을 단축 시킬 수 있다.
  • 표준화 : 협업 시에 최소한의 규약만으로 코드의 통일성을 확보할 수 있다.
  • 유연성 : 클래스간 결합도를 낮춰 코드의 종속성을 줄일 수 있다. 이를 통하여 유지보수성도 높일 수 있다.

Tags:

Categories:

Updated:

Leave a comment