중첩 인터페이스(내부 인터페이스)는 다른 클래스나 인터페이스 내부에 선언된 인터페이스입니다. 이들은 큰 클래스를 구조화하고 구현 세부 사항을 숨기기 위해 처음 등장했습니다. 이러한 캡슐화는 계약을 논리적으로 그룹화하여 코드의 가독성과 유지 관리를 크게 향상시킵니다.
자바의 초기 버전부터 클래스 및 다른 인터페이스 내에 정적 및 비정적 중첩 인터페이스를 선언할 수 있는 기능이 있었습니다. 이 관행은 대형 라이브러리(예: 자바 컬렉션)에서 확산되었습니다.
중첩 인터페이스의 가시성과 사용 범위에 대한 잘못된 이해는 종종 API 설계 오류와 애플리케이션 아키텍처의 복잡성을 초래합니다. 그들은 인스턴스의 멤버처럼 사용할 수 없으며, 본질적으로 항상 정적입니다.
중첩 인터페이스는 더 모듈화된 구조를 제공하고 오직 래퍼 클래스에만 관련된 특정 계약을 강조하는 데 사용됩니다. 예를 들어, Map 내의 Entry 인터페이스:
public interface Map<K, V> { interface Entry<K, V> { K getKey(); V getValue(); } Set<Entry<K, V>> entrySet(); }
주요 특징:
질문 1: 외부 클래스의 인스턴스 없이 중첩 인터페이스의 인스턴스를 생성할 수 있습니까?
예, 중첩 인터페이스는 정적으로 중첩되므로 외부 객체를 생성하지 않고도 별도로 구현할 수 있습니다.
질문 2: 클래스 내에서 중첩 인터페이스의 가시성 범위는 어떻게 됩니까?
가시성은 수정자(public, protected, private, package-private)에 의해 조절됩니다. 그러나 외부에서 접근이 필요할 경우, чаще всего public으로 설정합니다.
질문 3: 중첩 인터페이스가 또 다른 중첩 인터페이스를 포함할 수 있습니까?
예, 인터페이스는 어떤 정도의 중첩도 허용되지만, 실질적으로 흔하지는 않습니다. 가독성을 저하시킬 수 있기 때문입니다.
큰 프로젝트에서 Service 클래스 내에 10개 이상의 중첩 인터페이스를 정의했습니다. 연결의 수가 증가하면서 코드의 탐색 및 이해가 악화되었습니다.
장점:
단점:
DataProcessor 클래스 내에 Validator라는 중첩 인터페이스를 정의하여 오직 DataProcessor 내부에서만 구현되었습니다.
장점:
단점: