너무 많이 트롤링하지 마세요. 이제 막 기사 번역을 시작하는 중입니다.
인터페이스는 다른 인터페이스에서 상속할 수 있습니다. 인터페이스가 기능적 인터페이스에서 상속되고 새 추상 메서드를 포함하지 않는 경우 이 인터페이스도 기능적입니다. 그러나 인터페이스에는 하나의 추상 메서드와 여러 개의 기본 메서드만 포함될 수 있으며 여전히 기능적인 것으로 간주됩니다.
기능적 인터페이스 소개 - Java 8에서 재현된 개념
전 세계의 모든 Java 개발자는 다음 인터페이스 중 하나를 한 번 이상 사용해 본 적이 있습니다:java.lang.Runnable
, java.awt.event.ActionListener
, java.util.Comparator
, java.util.concurrent.Callable
. 그들은 모두 한 가지 공통점이 있는데, 그것은 모두 하나의 방법만을 가지고 있다는 것입니다. JDK에는 이러한 인터페이스가 많이 있으며 Java 개발자가 만든 다른 인터페이스도 있습니다. Single Abstract Method interfaces
이러한 인터페이스는 (SAM 인터페이스) 라고도 합니다 . 이러한 인터페이스를 사용하는 가장 널리 사용되는 방법 중 하나는 다음 예제와 같이 이러한 인터페이스를 사용하는 익명 내부 클래스를 만드는 것입니다.
public class AnonymousInnerClassTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A thread created and running...");
}
}).start();
}
}
Java 8에서는 SAM 개념이 다시 생성되어 기능적 인터페이스라고 합니다. 람다 식, 메서드 참조 및 참조 생성자를 사용하여 표현할 수 있습니다. 주석을 추가한 인터페이스가 기능 수준에서 작동하지 않을 때 컴파일러 수준에서 오류를 발생시키는 데 사용되는 새로운 @FunctionalInterface 주석이 생성되었습니다. 하나의 추상 메서드를 사용하는 간단한 기능적 인터페이스를 살펴보겠습니다.
@FunctionalInterface
public interface SimpleFunInterface {
public void doWork();
}
인터페이스는 클래스에서 추상 메서드를 선언할 수도 java.lang.Object
있지만 이 경우 인터페이스를 기능적으로 선언할 수도 있습니다.
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
public String toString();
public Boolean equals(Object o);
}
인터페이스에 또 다른 추상 메서드를 추가하자마자 IDE는 그림과 같이 이를 잘못된 것으로 표시합니다.
그 밖에 읽을 내용: |
---|
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
default public void doSomeWork() {
System.out.println("Doing some work in interface impl...");
}
default public void doSomeWork() {
System.out.println("Doing some other work in interface impl...");
}
}
맨 위의 예는 여전히 기능적 인터페이스입니다. 이제 람다 표현식을 사용하여 익명 내부 클래스를 대체하여 기능적 인터페이스를 구현하는 방법을 살펴보겠습니다.
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
public static void main(String[] args) {
carryOutWork(new SimpleFunInterface() {
@Override
public void doWork() {
System.out.println("Do work in SimpleFun impl...");
}
});
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
}
public static void carryOutWork(SimpleFuncInterface sfi) {
sfi.work();
}
}
프로그램의 결과는 다음과 같습니다.
Do work in SimpleFun impl...
Do work in lambda exp impl...
Java 람다 표현식 구문(Netbeans 8 Nightly 빌드)을 지원하는 IDE를 사용하는 경우 – 익명 내부 클래스를 사용할 때 힌트를 얻을 수 있습니다. 이는 Java 8의 기능적 인터페이스 개념과 구현 방법에 대한 간략한 소개였습니다. 람다 표현식을 사용합니다.
GO TO FULL VERSION