자바 인터페이스 다중 구현 | 자바 입문강좌 34

자바 인터페이스 다중 구현

인터페이스는 다중 구현이 가능합니다. 자바에서 클래스의 확장(extends)은 한개의 클래스만 가능하지만 인터페이스는 다중 구현이 가능하도록 해놨습니다.

인터페이스 정도까지 진도를 나갔다면 이제 좀 골치가 아파올텐데요. C언어 계열에서는 포인터와 메모리가 발목을 잡는다면 자바에서는 인터페이스 부터 사람을 피곤하게 합니다.

한가지 팁은 너무 지엽적인 것 부분적인 내용에 집착하지 않는 것이 좋습니다. 인터페이스는 설계상 이점을 위해 사용하는 클래스입니다. 설계는 나무도 보지만 숲을 볼 수 있어야 합니다. 여기 왜 이런 나무가 심어져 있지? 가 아니라 아 전체 숲을 위해서 여기 나무를 심었구나~ 라는 부분까지 고려해야 합니다.

C에서도 마찬가지지만 이 모든 것에 메모리에 대한 이미지 모델을 머리속에 가지고 있어야 유리합니다. 프로그래밍만 배워서 중급단계에 도달 할 수는 있지만 근본적으로 컴퓨터의 구조 원리에 대한 지식이 없으면 그 이상 진전하는데 어려움을 겪습니다. 베테랑 엔지니어들이 강조하는 부분입니다.

그리고 사실 프로그래밍이 이해가 되고 재미있으면 억지로 배우라 하지 않아도 자연스럽게 컴퓨터 구조를 알게 됩니다.

다중 구현 예제

다중 구현이라고 용어가 어렵지만 implements 구현하다 multi 여러개의 뜻입니다. 하나의 클래스에 2개 이상의 인터페이스를 구현할 수 있습니다.

아래의 예제는 인터페이스 A1과 B1을 클래스가 구현합니다. 당연히 두 인터페이스의 메소드를 오버라이드 해야하고 default 메소드가 겹치는 경우가 생기면 어느 쪽을 구현할지 알 수 없으므로 default 메소드도 구현해야 합니다.

이렇게 다중 구현을 하다보면 위에서 내려오는데 겹쳐서 충돌이 일어나는 부분이 생깁니다. 클래스에서 왜 한개만 상속하는지 이해할 수 있습니다. 상속을 한 클래스에서 받으면 이런 문제는 일어나지 않습니다.

이런 경우 컴파일러가 충돌에 대한 자체적인 해석을 할 수도 있지만 자바에서는 그런 모호한 선택을 하지 않습니다. 최대한 프로그래머가 실수할 여지를 주지 않는다는게 자바의 철학이기도 합니다. 같은 객체 지향 프로그래밍 언어지만 C++과는 확실히 차이 나는 부분입니다.

package com.kay;

public class Main {

    public static void main(String[] args) {
        MultiInterface m1 = new MultiInterface();

        A1 a1 = m1;
        a1.styleA();
        a1.styleSame();

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

        B1 b1 = m1;
        b1.styleB();
        b1.styleSame();

//        original instance
        System.out.println("-----------------------------------");

        m1.styleA();
        m1.styleB();
        m1.styleSame();

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

        MultiInterface m2 = (MultiInterface)b1;
        m2.styleA();
        m2.styleB();
        m2.styleSame();
    }
}

interface A1{
    public void styleA();
    default public void styleSame(){
        System.out.println("A1 implementation");
    }
}
interface B1{
    public void styleB();
    default public void styleSame(){
        System.out.println("B1 implementation");
    }
}
class MultiInterface implements A1, B1{

    @Override
    public void styleA() {
        System.out.println("multi interface implements A1 style");
    }
    @Override
    public void styleB() {
        System.out.println("multi interface implements B1 style");
    }
    @Override
    public void styleSame() {
        System.out.println("this should be overrided");
    }
}
multi interface implements A1 style
this should be overrided
-----------------------------------
multi interface implements B1 style
this should be overrided
-----------------------------------
multi interface implements A1 style
multi interface implements B1 style
this should be overrided
-----------------------------------
multi interface implements A1 style
multi interface implements B1 style
this should be overrided

문법을 너무 부분적으로 해석하지 말고 전체 흐름을 읽어야 합니다. 객체 지향 프로그래밍은 코드를 위에서 부터 아래로 읽지 않습니다. 클래스와 인터페이스간의 관계를 머리속에 그릴 수 있어야 합니다.

프로그래밍을 실습할 때 타인의 코드를 타이핑하는 것만으로는 부족합니다. 클래스 하나를 정의해도 자신의 코드로 만드는 최소한의 노력이 필요합니다.

요약

자바 인터페이스 다중 구현에 대해서 알아봤습니다.

아래의 외부참고문서의 영문 문서들을 잘 읽어보는 것을 추천합니다. 인터페이스는 문법이지만 OOP의 철학을 담고 있습니다. 여러 문서들의 관점을 흡수한다면 훨씬 빠르게 적응할 수 있습니다.

각 문서에서 어떤 것을 강조하는지 차이점을 구분하면서 보는 것도 흥미롭습니다.

외부참고문서

Multiple Inheritance of State, Implementation, and Type (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance) (oracle.com)

Multiple inheritance by Interface in Java 자바 인터페이스 다중 구현 (tutorialspoint.com)

Interface in Java – Javatpoint

Java and Multiple Inheritance – GeeksforGeeks

자바 인터페이스 다중 구현, 상속

Leave a Comment