자바8 디폴트 메소드(Default Methods)

이진호·2022년 9월 3일
0

JAVA

목록 보기
7/10
post-thumbnail

Java 8 이전, 인터페이스에는 오직 추상 메소드만 가질 수 있었습니다. 해당 메소드에 대한 구현은 별도의 클래스에 제공되어야만 했으며, 따라서 인터페이스에 새로운 메소드가 추가될 때마다 해당 구현 코드를 별도의 클래스에 메소드 구현이 추가되어야만 했습니다. 이 문제를 극복하기 위해서 Java 8은 인터페이스를 구현하는 클래스에 영향을 주지 않고 인터페이스에 구현된 메서드를 추가할 수 있는 디폴트 메소드(Default Methods)라는 개념을 도입했습니다.

// A simple program to Test Interface default methods in java
interface TestInterface
{
    // abstract method
    public void square(int a);
  
    // default method
    default void show()
    {
      System.out.println("Default Method Executed");
    }
}
  
class TestClass implements TestInterface
{
    // implementation of square abstract method
    public void square(int a)
    {
        System.out.println(a*a);
    }
  
    public static void main(String args[])
    {
        TestClass d = new TestClass();
        d.square(4);
  
        // default method executed
        d.show();
    }
}

디폴트 메서드는 구현 클래스에서 메서드를 구현하지 않고도 람다 식(Java 8에서 추가)을 사용할 수 있도록 하위 호환성을 유지하기 위해 도입되었습니다.

디폴트 메서드는 defender methods 또는 virtual extension methods 라고도 불립니다.

디폴트 메소드와 다중 구현

인터페이스는 다중 구현을 허용합니다. 아래 예시와 같이 다중 구현된 인터페이스들이 동일한 디폴트 메소드명을 가질 경우가 생길수 있습니다.

이 경우 구현 클래스는 사용할 디폴트 메소드를 명시적으로 지정하거나 디폴트 메소드를 재정의해야합니다.

// A simple Java program to demonstrate multiple
// inheritance through default methods.
interface TestInterface1
{
    // default method
    default void show()
    {
        System.out.println("Default TestInterface1");
    }
}
  
interface TestInterface2
{
    // Default method
    default void show()
    {
        System.out.println("Default TestInterface2");
    }
}
  
// Implementation class code
class TestClass implements TestInterface1, TestInterface2
{
    // Overriding default show method
    public void show()
    {
        // use super keyword to call the show
        // method of TestInterface1 interface
        TestInterface1.super.show();
  
        // use super keyword to call the show
        // method of TestInterface2 interface
        TestInterface2.super.show();
    }
  
    public static void main(String args[])
    {
        TestClass d = new TestClass();
        d.show();
    }
}

정적 메소드(Static Methods)

디폴트 메소드와 별개로, Java 8에서 인터페이스에도 정적 메소드를 선언할 수 있게 되었습니다. 사용 방법은 클래스의 정적 메소드 동일합니다.

// A simple Java program to TestClassnstrate static methods in java
interface TestInterface
{
    // abstract method
    public void square (int a);
  
    // static method
    static void show()
    {
        System.out.println("Static Method Executed");
    }
}
  
class TestClass implements TestInterface
{
    // Implementation of square abstract method
    public void square (int a)
    {
        System.out.println(a*a);
    }
  
    public static void main(String args[])
    {
        TestClass d = new TestClass();
        d.square(4);
  
        // Static method executed
        TestInterface.show();
    }
}

출처

2개의 댓글

comment-user-thumbnail
2022년 9월 3일

좋은 글 잘봤습니다. 한가지 궁금한게 있는데요. 추상클래스의 구현체는 확장 측면에서 보고 인터페이스의 구현체는 명시된 기능을 구현하는 개념정도로 이해하고 사용하고 있는데요.
디폴트 메소드가 추가된 이상 인터페이스 또한 기본기능을 가지고 있기 때문에 인터페이스 또한 확장의 개념으로 사용할 수 있을 것으로 보이는데, 두가지를 구분해서 사용할 수 있는 명확한 기준을 가지고 계시는지 궁금합니다.

1개의 답글