오늘 정리해볼 것은 Kotlin interface와 Java interface의 차이에 대한 내용입니다.
일단 interface부터 잠깐 설명을 해보고자 합니다.
개발을 하다보면 Interface를 많이 얘기를 합니다.
Interface는 설계도이기도 하며, 이렇게 만들겠다는 약속(규약)입니다.
예를 들어 A라는 개발자와 B개발자가 협업을 합니다.
A개발자는 B개발자가 만든것을 필요로 하는데, B개발자는 아직 개발을 안해놓은 상태입니다.
그렇다면 A개발자는 놀고있어야 할까요?
B개발자가 이렇게 구현하겠다고 약속한다면 A개발자는 놀지 않고 개발을 하겠죠?
이처럼 Interface는 상호간의 약속입니다.
그외에 결합도가 낮춰지는 효과 또한 있습니다.
Java에서는 interface를 만들때 내부를 구현하지않습니다.
설계도이기 때문에 굳이 내부에 코드가 들어갈일은 없겠죠?
하지만 추후에 abstract class역할을 더하고자 default keyword
를 통해 내부구현이 가능해졌습니다.
여담으로 default keyword
는 JDK 1.8부터 구현이 만들어졌다고 하네요.
//불가능
public interface test1 {
String test(){}; //Interface abstract methods cannot have body
}
//가능
public interface test1 {
default String test() {
String a = "";
return a;
}
}
하지만 코틀린에서는 어떨까요?
코틀린에서는 구현방식이 조금 다릅니다.
코틀린에서는 static으로 DefaultImpls가 만들어 집니다.
interface test {
val valueTest: Int
fun functionTest(){
println("test")
}
}
// 변형됨
public interface test {
int getValueTest();
void functionTest();
// DefaultImpls 생성
public static final class DefaultImpls {
public static void functionTest(@NotNull test $this) {
String var1 = "test";
System.out.println(var1);
}
}
}
해당 상속을 받고 super를 부르면 해당 static함수가 호출됩니다.
@JvmDefault 주석을 사용한다면 코틀린에서도 default keyword
를 사용할 수 있습니다.
하지만 JVM 1.8 이하에서 바이너리 호환성이 깨져버립니다.
그렇기에 별로 사용하지는 않는 주석입니다.
public interface test {
int getValueTest();
@JvmDefault
default void functionTest() {
String var1 = "test";
System.out.println(var1);
}
}
또한 최근에는 위의 Deprecated
되었으며, 컴파일 인수에 -Xjvm-default=enable
을 통해 호출이 가능합니다.
읽어주셔서 감사합니다.