ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Java8 default 인터페이스
    Java 2022. 2. 28. 16:38

    default interface란?

     

    interface라 하면 추상화를 위해 method의 구현은 없고 선언만 있는 모습을 떠올리기 쉽습니다.

    public interface MyInterface{
    	int myAbstractMethod1();
    	int myAbstractMethod2();
    }

     

    하지만 Java8에서는 interface에 아래와 같은 method들을 정의하는 것이 가능해졌습니다.

    public interface MyInterface {
    	int myAbstractMethod1();
    	int myAbstractMethod2();
    	default int myDefaultMethod() {
    		return 0;
    	}
    
    	static int myStaticMethod() {
    		return 0;
    	}
    }

    키워드 default, static을 붙여 마치 추상클래스처럼 기본적으로 적용이 되는 method들을 추가시킬 수 있습니다.

     

     

    default interface는 왜 생긴걸까요?

    Java 8부터 람다라는 개념이 추가되면서 interface의 내용이 추가될 필요가 생겼습니다.

    여기서 interface에 method를 추가한다면 interface를 구현한 모든 클래스에도 해당 method를 구현해야 한다는 문제가 발생하게 됩니다.

     

    따라서 기존의 버전과 호환성 문제 / 사용자가 공통된 사항을 interface에 구현하기 위해서 default method과 static method를 작성할 수 있도록 하였습니다.

     

     

    default interface의 사용법

    public class ImplementingClass implements MyInterface{
    	@Override
    	public int myAbstractMethod1() {
    		int a = myDefaultMethod();
    		return a;
    	}
    	@Override
    	public int myAbstractMethod2() {
    		int b = Interface.myStaticMethod();
    		return b;
    	}
    }

    myMethod1 , myMethod2는 abstract class로 작성되어 있으므로 재정의하여 사용해야 합니다.

    하지만 myMethod3, myMethod4는 각각 default, static 클래스이므로 다음과 같이 아무런 구현없이 접근해서 사용할 수 있습니다.

     

    default method -> abstract method로 만들기

    public interface InheritingingInterface extends MyInterface{
    	int myDefaultMethod();
    }

    클래스를 상속하는 클래스가 있듯이, 인터페이스 또한 extends 키워드를 사용해 인터페이스를 확장할 수 있습니다.

    default method가 선언된 interface를 상속받아 다시 abstract method로 만들 수 있습니다.

     

    default method overriding 하기

    public interface InheritingingInterface extends MyInterface{
    	default int myDeafultMethod() {
    		return 2;
    	}
    }

    default method가 선언된 interface를 상속받아 deafult method를 override 하여 사용할 수 있습니다.

     

     

    deafult method의 상속문제

    자바는 다중상속이 되지 않습니다.

    하지만 interface에 method를 추가시킨다는 개념이 도입되면서 상속문제에 대해 어떻게 동작하는지 의문이 생길 수 밖에 없습니다.

     

    interface A 와 interface B가 같은 이름의 static 메서드를 가지면 어떻게 될까요?

    static 메서드는 InterfaceName.methodName() 으로 접근가능하기 때문에 크게 문제 되지 않습니다.

     

    interface A 와 interface B가 같은 이름의 default 메서드를 가지면 어떻게 될까요?

    두 인터페이스의 메서드 이름이 중복되었기 때문에 오버라이딩하여 사용하라고 합니다.

     

    다음과 같이 Override 하면 두 인터페이스의 메서드를 모두 사용할 수 있습니다.

    public interface DefaultInterface {
    
    	default void defaultMethod() {
    		System.out.println("DefaultInterface defaultMethod 실행");
    	}
    }
    
    public interface NewInterface {
    		
    	default void defaultMethod() {
    		System.out.println("NewInterface defaultMethod 실행");
    	}
    }
    
    public class InterfaceTest implements DefaultInterface,NewInterface {
    
    	public static void main(String[] args) {
    		
    		InterfaceTest object = new InterfaceTest();			
    		object.defaultMethod();				
    	}	
    
    	@Override
    	public void defaultMethod() {
    		// TODO Auto-generated method stub
    		DefaultInterface.super.defaultMethod();
    		NewInterface.super.defaultMethod();
    	}	
    }

     

    interface A 와 class B가 같은 이름의 default 메서드를 가지면 어떻게 될까요?

    다음과 같은 에러메시지가 나타나게 됩니다.

     

    다음과 같이 Override 하면 인터페이스와 클래스의 메서드를 모두 사용할 수 있습니다.

    public interface DefaultInterface {
    
    	default void defaultMethod() {
    		System.out.println("DefaultInterface defaultMethod 실행");
    	}
    }
    
    public class Parent {		
    	default void defaultMethod() {
    		System.out.println("Parent defaultMethod 실행");
    	}
    }
    
    public class InterfaceTest extends Parent implements DefaultInterface {
    	
        public InterfaceTest() {
    		super();		
    	}
        
    	public static void main(String[] args) {
    		
    		InterfaceTest object = new InterfaceTest();			
    		object.defaultMethod();				
    	}	
    
    	@Override
    	public void defaultMethod() {
        
    		DefaultInterface.super.defaultMethod();
    		super.defaultMethod();
    	}	
    }

     

    출처

    http://kbs0327.github.io/blog/technology/java8-default-interface/

     

    Java8 default 인터페이스

    JAVA8에 추가된 기능 - default interface

    kbs0327.github.io

    https://www.geeksforgeeks.org/default-methods-java/

     

    Default Methods In Java 8 - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org

     

    댓글

Designed by Tistory.