Language/JAVA&Spring

[JAVA] 인터페이스 사용 이유 (Interface)

지과쌤 2022. 9. 15.
반응형

목차

 

    1.  협업

    Todo : 한국인을 위한 번역기 제작. 한사람은 영어 번역 클래스, 다른 한사람은 중국어 번역 클래스 제작

    /**
     * @author 팀원1
     */
    public class EnglishTrans {
      public String koreanToEnglish(String str) {
        //TODO: 한국어를 영어로 번역
      }
      public String englishToKorean(String str) {
        //TODO: 영어를 한국어로 번역
      }
    }
    /**
     * @author 팀원2
     */
    public class ChineseRendering {
      public String translateChinese(String str) {
        //TODO: 한국어를 중국어로 번역
      }
      public String translateKorean(String str) {
        //TODO: 중국어를 한국어로 번역
      }
    }

    각자의 코딩 스타일이 적나라하게 반영됨. -> 메서드명, 클래스명 모두 다름.

     

    이후, 또다른 팀원에게 화면에 제공할 API를 만들어달라고 요청. 새 팀원은 클래스명을 전달받아 개발 시작함.

    EnglishTrans trans = new EnglishTrans();
    String str = trans.koreanToEnglish(str);
    // TODO: Business Login
    ...
    
    ChineseRendering rendering = new ChineseRendering();
    String str = rendering.translateChinese(str);
    // TODO: Business Login
    ...

    인터페이스를 사용한다면?

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

    위와 같이 공통적으로 implements 할 인터페이스를 만들었다.

    이후, 만들어질 각각의 클래스에서 Translation 인터페이스를 implements 할 예정.

    /**
     * @author 팀원1
     */
    public class EnglishTranslation implements Translation {
      
      @Override
      public String translate(String str) {
        //TODO: 한국어를 번역
      }
      
      @Override
      public String translateInto(String str) {
        //TODO: 한국어로 번역
      }
    }
    /**
     * @author 팀원2
     */
    public class ChineseTranslation implements Translation {
    
      @Override
      public String translate(String str) {
        //TODO: 한국어를 번역
      }
      
      @Override
      public String translateInto(String str) {
        //TODO: 한국어로 번역
      }
    }

    API 호출하는 부분

    Translation trans = new EnglishTranslation();
    String str = trans.translate(str);
    // TODO: Business Login
    ...
    
    Translation trans = new ChineseTranslation();
    String str = trans.translate(str);
    // TODO: Business Login
    ...

    인터페이스를 이용하여 원하는 언어에 따라 클래시를 골라 객체를 생성하여 쓰면 된다.

    통째로 로직을 복사-붙여넣기 하여 재활용하기도 편하다.

    2. 교체 용이

    Todo : 암호화 기능 개발

    public interface Crypto {
      // 암호화
      public String encrypt(String str);
      // 복호화
      public String decrypt(String str);
    }

    위와 같이 인터페이스로 표준을 먼저 잡은 후, 구현체 개발 진행.

    public class SHA512Crypto implements Crypto {
    
      @Override
      public String encrypt(String str) {
        // TODO: SHA512 방식으로 암호화
      }
      
      @Override
      public String decrypt(String str) {
        // TODO: SHA512 방식으로 복호화
      }
    }

     

    이후 SHA512 방식이 아닌 다른 방식으로 교체를 우너하는 경우, 클래스를 만들어 이름만 교체하면 된다.

    다시말해, 교체할 때는 객체를 생성하는 클래스만 변경해주면 그 아래 로직은 수정할 일이 없다.

    Crypto crypto = new SHA512Crypto(); // 기존 SHA512 방식
    String enc = crypto.encrypt("1234");

    ->

    Crypto crypto = new SuperPowerCrypto(); // 신규 개발한 암호화 방식
    String enc = crypto.encrypt("1234");

    단, 인터페이스에 정의되어 있지 않고 클래스에만 존재하는 메서드를 사용할 땐, 교체 용이의 이유로 활용이 어려울 수 있다.

    3. 다중 상속

    실제 자바에서 사용하고 있는 부분을 예로 보자.

    public class HashMap<K,V> extends AbstractMap<K,V>
      implements Map<K,V>, Cloneable, Serializable {
    }

    기본적으로 Map이라 Map 인터페이스를 구현함.

    Cloneable로 인스턴스가 복제 가능하도록 하였고, Serializable로 직렬화 할 수 있도록 함.

    결론

    인터페이스는 잘 사용하면 프레임워크나 배보되는 공용 컴포넌트, 유틸 등을 개발할 때 효과적임.

    반대로, 일반 웹 개발 프로젝트에서는 오히려 복잡도만 증대시키는 상황이 많기도 함.

     

    잘 사용해야 한다.

     

    출처 : https://gofnrk.tistory.com/22

    반응형

    댓글

    💲 추천 글