인터페이스 default 메소드로 기존 인터페이스를 해치지 않게 확장 하기

인터페이스 default 메소드로 기존 인터페이스를 해치지 않게 확장 하기

1
2
3
4
5
6
7
8

package com.github.sejoung.codetest.lamdas;

public interface SimpleInterface {
public void doSomeWork();
}


위에 인터페이스를 상속받아 구현한 케이스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

package com.github.sejoung.codetest.lamdas;

public class SimpleInterfaceImpl implements SimpleInterface{
@Override
public void doSomeWork() {
System.out.println("Do Some Work implementation in the class");
}

public static void main(String[] args) {
SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
simpObj.doSomeWork();
}
}

실행결과

1
2
3
4
5

Do Some Work implementation in the class

Process finished with exit code 0

위에 인터페이스에 하나를 추가하면

1
2
3
4
5
6
7
8
9
10

package com.github.sejoung.codetest.lamdas;

public interface SimpleInterface {
public void doSomeWork();
public void doSomeOtherWork();

}


상속받은 클래스에서 컴파일 에러가 난다.

1
2
3

Class 'SimpleInterfaceImpl' must either be declared abstract or implement abstract method 'doSomeOtherWork()' in 'SimpleInterface'

여기서 편하게 추가 할수있는 방법은

1
2
3
4
5
6
7
8
9
10
11

package com.github.sejoung.codetest.lamdas;

public interface SimpleInterface {
public void doSomeWork();
default public void doSomeOtherWork(){
System.out.println("DoSomeOtherWork implementation in the interface");
}
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

package com.github.sejoung.codetest.lamdas;

public class SimpleInterfaceImpl implements SimpleInterface{
@Override
public void doSomeWork() {
System.out.println("Do Some Work implementation in the class");
}

public static void main(String[] args) {
SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
simpObj.doSomeWork();
simpObj.doSomeOtherWork();

}
}

실행결과

1
2
3
4
5
6

Do Some Work implementation in the class
DoSomeOtherWork implementation in the interface

Process finished with exit code 0

그럼 이런 경우에는 한번 보자

1
2
3
4
5
6
7
8
9
10
11

package com.github.sejoung.codetest.lamdas;

public interface InterfaceWithDefaultMethod {
public void someMethod();
default public void someOtherMethod(){
System.out.println("Default method implementation in the interface");
}
}


1
2
3
4
5
6
7
8
9
10

package com.github.sejoung.codetest.lamdas;

public interface InterfaceWithAnotherDefMethod {
default public void someOtherMethod(){
System.out.println("Default method implementation in the interface");
}
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

package com.github.sejoung.codetest.lamdas;

public class DefaultMethodSample implements
InterfaceWithDefaultMethod, InterfaceWithAnotherDefMethod {

@Override
public void someMethod() {
System.out.println("Some method implementation in the class");
}

public static void main(String[] args) {
DefaultMethodSample def1 = new DefaultMethodSample();
def1.someMethod();
def1.someOtherMethod();
}
}


컴파일 메시지

1
2
3
4
5
6
7

D:\repo\codeTestJDK8\src\main\java\com\github\sejoung\codetest\lamdas\DefaultMethodSample.java
Error:(4, 9) java: cannot find symbol
symbol: class InterfaceWithDefaultMethod
Error:(4, 37) java: cannot find symbol
symbol: class InterfaceWithAnotherDefMethod

같은 이름에 동일한 디폴트 메소드가 있을때는 에러메시지를 나타내어 준다

위에 처럼 디폴트 메소드를 사용하면 기존 인터페이스를 해치지 않고 확장 할수 있는 방법이 있다.

참조