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

Java 인터페이스 구현 시 하나의 메서드만 재정의할 수 있을까?

Java 인터페이스란?

Java에서 인터페이스(interface)는 메서드 원형(프로토타입)에 대한 명세입니다. 프로그래머에게 구현 방향을 제시하거나, 특정 타입의 메서드와 필드가 어떤 형태를 가져야 하는지 계약(contract)처럼 정의하고 싶을 때 인터페이스를 활용합니다.

인터페이스 타입의 객체를 생성하려면 해당 인터페이스를 구현(implements)하는 클래스를 작성해 모든 추상 메서드에 몸통(body)을 제공해야 하며, 그 후 구현 클래스의 객체를 만들어 사용할 수 있습니다.

모든 메서드를 구현하는 경우

interface Sample {
    void demoMethod1();
    void demoMethod2();
    void demoMethod3();
}
public class InterfaceExample implements Sample {
    public void demoMethod1() {
        System.out.println("This is demo method-1");
    }
    public void demoMethod2() {
        System.out.println("This is demo method-2");
    }
    public void demoMethod3() {
        System.out.println("This is demo method-3");
    }
    public static void main(String args[]) {
        InterfaceExample obj = new InterfaceExample();
        obj.demoMethod1();
        obj.demoMethod2();
        obj.demoMethod3();
    }
}

출력 결과

This is demo method-1
This is demo method-2
This is demo method-3

추상 메서드를 하나라도 생략하면?

인터페이스를 구현할 때는 모든 추상 메서드를 반드시 재정의(오버라이드)해야 합니다. 단 하나라도 재정의하지 않으면 컴파일 시점에 오류가 발생합니다.

예제

interface Sample {
    void demoMethod1();
    void demoMethod2();
    void demoMethod3();
}
public class InterfaceExample implements Sample {
    public void demoMethod1() {
        System.out.println("This is demo method-1");
    }
    public void demoMethod2() {
        System.out.println("This is demo method-2");
    }
    public static void main(String args[]) {
        InterfaceExample obj = new InterfaceExample();
        obj.demoMethod1();
        obj.demoMethod2();
    }
}

출력 결과

InterfaceExample.java:6: error: InterfaceExample is not abstract and does not override abstract method demoMethod3() in Sample
public class InterfaceExample implements Sample{
       ^
1 error

위 오류는 demoMethod3()가 재정의되지 않았다는 사실을 알려 주는 컴파일 에러입니다. 즉, 인터페이스의 추상 메서드 중 하나라도 빠지면 코드 자체가 성립하지 않습니다.

하나의 메서드만 재정의하는 두 가지 방법

그럼에도 불구하고 실질적으로는 하나의 메서드만 구현하고 싶은 경우가 있습니다. 이럴 때 사용할 수 있는 방법이 두 가지 있습니다.

방법 1: 나머지 메서드를 빈 몸통으로 구현

나머지 메서드들도 형식상 구현은 하되, 실행 내용이 없는 빈 몸통으로 남겨두는 방식입니다.

interface Sample {
    void demoMethod1();
    void demoMethod2();
    void demoMethod3();
}
public class InterfaceExample implements Sample {
    public void demoMethod1() {
        System.out.println("This is demo method-1");
    }
    public void demoMethod2() {
    }
    public void demoMethod3() {
    }
    public static void main(String args[]) {
        InterfaceExample obj = new InterfaceExample();
        obj.demoMethod1();
        obj.demoMethod2();
        obj.demoMethod3();
    }
}

출력 결과

This is demo method-1

방법 2: 나머지 메서드를 디폴트(default) 메서드로 선언

Java 8부터 도입된 디폴트(default) 메서드는 구현 클래스에서 재정의할 의무가 없습니다. 따라서 인터페이스 안에서 나머지 메서드를 default 키워드로 선언해 두면, 구현 클래스에서는 필요한 메서드 하나만 재정의하면 됩니다.

interface Sample {
    void demoMethod1();
    default void demoMethod2() {
        System.out.println("Default demo method 2");
    }
    default void demoMethod3() {
        System.out.println("Default demo method 3");
    }
}
public class InterfaceExample implements Sample {
    public void demoMethod1() {
        System.out.println("This is demo method-1");
    }
    public static void main(String args[]) {
        InterfaceExample obj = new InterfaceExample();
        obj.demoMethod1();
        obj.demoMethod2();
        obj.demoMethod3();
    }
}

출력 결과

This is demo method-1
Default demo method 2
Default demo method 3

정리

결론적으로 Java 인터페이스를 구현할 때는 원칙적으로 모든 추상 메서드를 재정의해야 하며, 하나라도 누락되면 컴파일 오류가 발생합니다. 하지만 하나의 메서드만 실질적으로 구현하고 싶다면, ① 나머지 메서드를 빈 몸통으로 두거나 ② 인터페이스 쪽에서 default 메서드로 선언하는 방법으로 이를 해결할 수 있습니다. 특히 default 메서드는 Java 8 이후 인터페이스 설계 유연성을 크게 높여 준 기능이므로 적극적으로 활용해 보시기 바랍니다.