Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 인터페이스가 도입된 이유와 핵심 역할

인터페이스란 무엇인가?

자바에서 인터페이스(interface)는 클래스가 수행할 수 있는 동작에 대한 하나의 '계약(contract)'입니다. 즉, 인터페이스는 특정 클래스가 반드시 제공해야 하는 메서드의 목록을 정의하며, 이를 구현하는 클래스는 그 계약을 이행할 책임을 집니다.

클래스가 인터페이스를 구현(implements)하면, 해당 인터페이스에 선언된 모든 추상 메서드(abstract method)에 대한 실제 구현을 반드시 제공해야 합니다. 인터페이스는 여러 클래스가 공통으로 가져야 할 공통 동작의 집합을 정의하고, 이를 구현하는 클래스들은 그 동작에 동의한 뒤 각자의 방식대로 구현체를 작성하게 됩니다.

객체 간 통신 계약으로서의 역할

인터페이스의 가장 중요한 용도 중 하나는 두 객체 사이의 통신 계약을 제공하는 것입니다.

어떤 클래스가 특정 인터페이스를 구현하고 있다는 사실만 알아도, 우리는 그 클래스가 인터페이스에 선언된 메서드들의 구체적인 구현을 반드시 포함하고 있다는 것을 보장받을 수 있습니다. 따라서 내부 구현이 어떻게 되어 있는지 몰라도 해당 메서드를 안전하게 호출할 수 있습니다.

다시 말해, 두 객체는 서로의 구체적인 구현 세부사항에 의존하지 않고, 인터페이스에 정의된 계약만을 기반으로 소통할 수 있습니다. 이러한 느슨한 결합(loose coupling)은 코드의 유연성과 유지보수성을 크게 향상시킵니다.

다중 상속 문제에 대한 해결책

자바는 다중 상속(multiple inheritance)을 지원하지 않습니다. 다중 상속이란 하나의 하위 클래스가 둘 이상의 직접적인 상위 클래스(superclass)로부터 상속받는 것을 의미합니다.

다중 상속은 편리해 보이지만, 두 상위 클래스가 이름은 같지만 서로 충돌하는 구현을 가지고 있을 경우 심각한 모호성 문제가 발생합니다. 컴파일러 입장에서는 어느 쪽 구현을 상속해야 할지 판단할 수 없기 때문입니다.

자바는 이 문제를 둘 이상의 인터페이스를 동시에 구현하는 것을 허용함으로써 우회적으로 해결했습니다. 인터페이스에는 실제 실행 코드가 없는 추상 메서드만 선언되어 있으므로, 여러 인터페이스를 함께 구현하더라도 구현 충돌이 발생하지 않습니다.

참고: 자바 8 이후의 변화

자바 8부터는 인터페이스에도 default 메서드와 static 메서드를 정의할 수 있게 되었습니다. 다만 여러 인터페이스에서 같은 시그니처의 디폴트 메서드를 상속받는 경우에는 충돌이 발생할 수 있으며, 이때 개발자가 명시적으로 오버라이드하여 충돌을 해결해야 합니다.

정리

  • 인터페이스는 클래스가 수행할 수 있는 동작에 대한 계약이다.
  • 인터페이스를 구현한 클래스는 선언된 모든 추상 메서드의 구현을 제공해야 한다.
  • 객체 간 통신은 구체적인 구현이 아닌 인터페이스의 계약을 기반으로 이루어진다.
  • 자바가 다중 상속을 지원하지 않는 대신, 다중 인터페이스 구현으로 그 필요를 충족시킨다.