자바 인터페이스 다중 상속 | 자바 입문강좌 35

자바 인터페이스 다중 상속

클래스와 인터페이스의 차이점 중에 다중 구현이 가능한 부분이라고 했습니다. 인터페이스간의 다중 상속도 가능합니다. 구현이냐 상속이냐 또 용어가 헷갈리기 시작하는 부분입니다.

정확한 구분을 위해서는 한글보다는 영어 원문으로 이해하는 것을 추천합니다. 기존 클래스 사용의 상속개념은 extends 키워드이고 인터페이스 구현은 implements 입니다. 역시 헷갈릴 겁니다만, 인터페이스는 인스턴스로 만들어 사용할 수 없다는 점을 잊지 않도록 합니다.

예제 코드를 통해 알아보겠습니다.

다중 상속 예제

문법적으로 보면 복잡합니다. 다소 테크니컬한 부분으로 보입니다.

인터페이스를 나누는 것은 어떤 특성이나 기준에 의합니다. 사실 두개로 나눌 것을 하나로 합칠 수도 있겠죠. 하지만 인터페이스 문법은 클래스보다 유연성을 더 주는 것 입니다. 클래스는 하나만 상속하고 인터페이스는 두개 이상 상속해도 된다는 것은 다소 자바의 철학을 보여주는 것 입니다.

클래스는 좀 무거운 개념입니다. 더 많고 좀 더 완전한 내용을 요구합니다. 클래스라는 단어의 어감 자체가 무겁습니다. 인간 클래스, 동물 클래스, 식물 클래스 등 꼭 뭔가 우리가 생각하는 그 개념이 들어있어야 할 것 같습니다.

반면 인터페이스는 좀더 가볍습니다.

마우스 인터페이스, 키보드 인터페이스, 마이크 인터페이스 처럼 한 개의 기능적인 면만 있으면 충분합니다. 자바 스윙 GUI로 윈도우 프로그래밍을 할 때 윈도우 이벤트에 관한 인터페이스를 사용합니다. 윈도우와 이벤트간의 통신적인 부분은 클래스로 표현하기는 좀 뭐합니다. 물론 클래스로도 구현할 수 있겠죠. 하지만 사람들이 봤을 때 이 부분은 인터페이스로 하면 좋겠다~고 느꼈다면 이벤트가 되는 것 입니다.

윈도우에서는 이벤트 리스너라는 것을 사용해서 윈도우 프로세스와 외부 인터럽트(interrupt)간의 통신이 이루어집니다. 이벤트 클래스보다는 이벤트 인터페이스가 더 개념적으로 어울리죠.

이런 개념은 기초학습을 마친 후 실용이나 상용 프로그램을 개발하다 보면 자연스럽게 정리가 됩니다. 초급 단계에서는 아이디어만 갖고 가도 괜찮습니다.

package com.kay;

public class Main {

    public static void main(String[] args) {
        Brotherhood bro1 = new Brotherhood();
        bro1.playGame();
        bro1.playSports();
        bro1.playChess();

        System.out.println("------------------------");

        OlderBrother bro2 = new Brotherhood();
        bro2.playGame();

        System.out.println("------------------------");
        LittleBrother bro3 = new Brotherhood();
        bro3.playSports();

        System.out.println("------------------------");
        Brotherhood bro4 = new Brotherhood();
        bro4.playGame();
        bro4.playSports();
        bro4.playChess();

    }
}

interface OlderBrother{
    void playGame();
}

interface LittleBrother{
    void playSports();
}

interface MyBrother extends OlderBrother, LittleBrother{
    void playChess();
}

class Brotherhood implements MyBrother{

    @Override
    public void playGame() {
        System.out.println("play game");
    }

    @Override
    public void playSports() {
        System.out.println("play sports");
    }

    @Override
    public void playChess() {
        System.out.println("play chess");
    }
}
play game
play sports
play chess
------------------------
play game
------------------------
play sports
------------------------
play game
play sports
play chess

위 코드에 대한 설명은 크게 필요치 않을 겁니다. 인터페이스의 추상 메소드들은 언젠가 클래스에 구현되야 합니다. 밑으로 계속 내려오다 보면 끝이 있습니다. 여기서 다형성을 적용하는데 인터페이스는 추상 클래스와 달리 base 인터페이스 참조변수로 sub 인터페이스에 접근할 수 없습니다. 그러기 위해서는 형변환을 해야합니다. 이것도 추상클래스와의 주요 차이점입니다.

언제 추상클래스를 써야할 지 인터페이스를 사용할 지 또 각각 어떤 차이가 있는지 세부적으로 정확하게 알고 사용합니다.

상속 및 구현을 동시에 사용

하나의 sub 클래스에서 base 클래스를 상속하고 인터페이스를 다중 구현할 수 있을까요?

  • 정답은 가능합니다.

아래와 같은 형식으로 상속과 인터페이스 다중 구현이 가능합니다. 실은 흔하게 볼 수 있는 방식입니다. 문법적으로는 extends 를 먼저 놓고 implements 를 뒤에 놓습니다.

class Brotherhood extends A1 implements MyBrother

어떤 것을 상속하고 어떤 것을 인터페이스로 구현할지도 설계상 문제입니다.

요약

실제로 인터페이스를 사용한다면 여러 클래스가 같은 메소드를 다르게 구현하는 경우를 생각해 볼 수 있습니다. 인터페이스에 메소드를 선언하고 각 클래스에서 다르게 구현하면 됩니다.

인터페이스의 적절한 사용은 프로그램의 확장성이라는 부분에서 큰 이점을 가져다 줍니다. 자바의 데이터베이스 인터페이스인 JDBC가 대표적입니다. 다양한 제조사의 DataBase 를 사용하더라도 Interface 만 달리하면 동일하게 접속할 수 있습니다.

외부참고문서

JDBC Tutorial | What is Java Database Connectivity(JDBC) – javatpoint

Java – Interfaces – Tutorialspoint

Interfaces and Inheritance in Java 자바 인터페이스 다중 상속 – GeeksforGeeks

Leave a Comment