[Java] Java8 default 인터페이스
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