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

반응형