목차
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로 직렬화 할 수 있도록 함.
결론
인터페이스는 잘 사용하면 프레임워크나 배보되는 공용 컴포넌트, 유틸 등을 개발할 때 효과적임.
반대로, 일반 웹 개발 프로젝트에서는 오히려 복잡도만 증대시키는 상황이 많기도 함.
잘 사용해야 한다.
'Language > JAVA&Spring' 카테고리의 다른 글
[Spring] Error executing DDL : 테이블 생성 오류 Trouble Shooting (0) | 2022.10.24 |
---|---|
[Spring] DAO, DTO, VO 개념 간단 정리 (0) | 2022.10.24 |
[JAVA] 가비지 컬렉션 GC (1) | 2022.10.11 |
[JAVA] 좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2022.09.16 |
댓글