JavaRush /Java Blog /Random-KO /기능적 인터페이스 소개
minuteman
레벨 32

기능적 인터페이스 소개

Random-KO 그룹에 게시되었습니다
너무 많이 트롤링하지 마세요. 이제 막 기사 번역을 시작하는 중입니다. 기능적 인터페이스 소개 - 1

기능적 인터페이스 소개 - 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는 그림과 같이 이를 잘못된 것으로 표시합니다. 기능적 인터페이스 소개 - 2 인터페이스는 다른 인터페이스에서 상속할 수 있습니다. 인터페이스가 기능적 인터페이스에서 상속되고 새 추상 메서드를 포함하지 않는 경우 이 인터페이스도 기능적입니다. 그러나 인터페이스에는 하나의 추상 메서드와 여러 개의 기본 메서드만 포함될 수 있으며 여전히 기능적인 것으로 간주됩니다.
@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를 사용하는 경우 – 익명 내부 클래스를 사용할 때 힌트를 얻을 수 있습니다. 기능적 인터페이스 소개 - 3 이는 Java 8의 기능적 인터페이스 개념과 구현 방법에 대한 간략한 소개였습니다. 람다 표현식을 사용합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION