interfaces는 클래스의 사용처와 구현을 분리하는 주된 수단이에요.
이런 분리는 구현을 유지보수할 때 유연성을 주고, 타입에 안전한 제네릭 동작을 지원하는 데 도움이 돼요.
인터페이스의 문법은 클래스와 비슷한데, 메서드가 시그니처로만 나타나고 본문은 제공되지 않아요.
public interface Language {
String speak();
}
public interface ItalianLanguage extends Language {
String speak();
String speakItalian();
}
public interface ScriptConverter {
void setVersion(String version);
String getVersion();
String convertCyrillicToLatin(String cyrillic);
}
구현하는 클래스는 인터페이스가 정의한 모든 연산을 구현해야 해요.
인터페이스는 보통 다음 중 하나 이상을 해요:
Comparable<T>).public class ItalianTraveller implements ItalianLanguage {
public String speak() {
return "Ciao mondo";
}
public String speakItalian() {
return speak();
}
}
public class ItalianTravellerV2 implements ItalianLanguage {
public String speak() {
return "migliorata - Ciao mondo";
}
public String speakItalian() {
return speak();
}
}
public class FrenchTraveller implements Language {
public String speak() {
return "Ça va?";
}
}
public class RussianTraveller implements Language, ScriptConverter {
private String version;
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public String speak()
{
return "Привет мир";
}
public String convertCyrillicToLatin(String cyrillic) {
throw new UnsupportedOperationException();
}
}
public class DocumentTranslator implements ScriptConverter {
private String version;
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
public String translate(String russian) {
throw new UnsupportedOperationException();
}
public String convertCyrillicToLatin(String cyrillic) {
throw new UnsupportedOperationException();
}
}
위 인터페이스와 클래스를 사용하는 코드는 다음과 같은 일을 할 수 있어요:
인터페이스는 모킹을 쉽게 할 수 있게 해주기 때문에 테스트를 지원하는 데 널리 쓰여요.
인터페이스는 extend 키워드로 다른 인터페이스를 확장할 수 있어요.
인터페이스의 멤버는 기본적으로 public이에요.
인터페이스는 중첩 타입을 포함할 수 있어요: interfaces, enums, classes.
여기서 그 타입을 감싸는 인터페이스는 네임스페이스 역할을 해요.
중첩 타입은 인터페이스 외부에서 인터페이스 이름을 앞에 붙이고 점 문법으로 멤버를 식별하는 방식으로 접근해요.
Java는 설계상 다중 상속을 지원하지 않지만, 인터페이스를 통해 일종의 다중 상속을 가능하게 해요.
게다가 인터페이스를 통해 다형성을 구현할 수 있다는 개념이 인터페이스 메커니즘을 뒷받침해요.