-
[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/
https://www.geeksforgeeks.org/default-methods-java/
'Java' 카테고리의 다른 글
[Java] Collections.sort () VS Arrays.sort() (0) 2022.03.10 [Java] BufferedWriter vs println 속도분석 (0) 2022.03.04 [Java] 자바의 인자 전달 방식 (call by value와 call by reference) (0) 2022.02.27 [Java] 이클립스 글자 안 보일 때 해결 방법(이클립스 흰 화면 출력 시 해결 방법) (0) 2022.02.26 [Java] DTO, DAO, VO란? (0) 2022.02.19