트랙
/
Java
Java
/
학습 과정
/
인터페이스
인터

인터페이스 에서 Java

1개의 연습 문제

인터페이스 소개

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);
}

구현하는 클래스는 인터페이스가 정의한 모든 연산을 구현해야 해요.

인터페이스는 보통 다음 중 하나 이상을 해요:

  • 여러 다른 클래스를 사용하는 코드가 제네릭하게 다룰 수 있게 해줘요. 이 경우 인터페이스는 기본 클래스와 같은 역할을 해요. 그 예가 java.io.InputStream이에요.
  • 특정 목적을 위해 기능의 일부만 노출해요 (예: Comparable<T>).
  • 여러 구현이 공존할 수 있도록 클래스의 공개 API를 노출해요. 한 가지 예가 테스트 더블이에요.
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는 설계상 다중 상속을 지원하지 않지만, 인터페이스를 통해 일종의 다중 상속을 가능하게 해요.

게다가 인터페이스를 통해 다형성을 구현할 수 있다는 개념이 인터페이스 메커니즘을 뒷받침해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

인터페이스 배우기