Java

[Java] Java8 default 인터페이스

Junuuu 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