JavaRush /Java Blog /Random-KO /커피 브레이크 #182. Java의 기능적 인터페이스

커피 브레이크 #182. Java의 기능적 인터페이스

Random-KO 그룹에 게시되었습니다
출처: DZone 다음은 Java의 기능적 인터페이스에 대한 개요입니다: 목적, 예제, 람다 표현식 및 사전 정의된 인터페이스 목록. 커피 브레이크 #182.  Java의 기능적 인터페이스 - 1객체지향 프로그래밍 언어인 Java는 이전에는 언어의 일부 기본 데이터 유형과 메소드를 제외한 모든 것이 클래스와 객체를 중심으로 돌아가기 때문에 독립적인 기능을 가질 수 없었습니다. 그러나 Java 8에는 기능적 인터페이스라는 새로운 개념과 Lambda 표현식, Time API, Stream API 등과 같은 다른 기능도 도입되었습니다. 이러한 기능적 인터페이스는 무엇이며 이를 정의하는 방법은 무엇입니까? 알아 보자!

인터페이스란 무엇입니까?

인터페이스는 시스템 요소의 상호 작용을 결정하는 규칙 집합입니다. 추상 메소드와 정적 상수를 포함하는 클래스의 개요라고도 합니다. 인터페이스에는 하나 이상의 추상 메서드가 포함될 수 있습니다. 또한 인터페이스를 사용하면 클래스에 대한 요구 사항, 즉 클래스에서 필요한 메서드를 설정할 수 있습니다. 간단히 말해서 인터페이스는 모든 구현 클래스가 준수해야 하는 계약과 같습니다. 예는 다음과 같습니다.
Interface A1
{
void method1();
String method2(String X);
}

Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
인터페이스를 구현하는 클래스가 인터페이스의 모든 메서드를 선언하지 않으면 코드가 실행되지 않고 오류가 발생합니다. “ 오류: A1은 추상이 아니며 A1의 추상 메서드를 재정의하지 않습니다. " (오류: A1은 추상이 아니며 A1의 추상 메서드를 재정의하지 않습니다.) JDK 8 이전에는 인터페이스가 구현을 정의할 수 없었지만 이제 인터페이스 메서드에 대해 기본 구현을 추가할 수 있습니다. 또한 정적 메서드와 기본 메서드를 정의할 수도 있습니다. 인터페이스에서 개체 없이 호출 가능 인터페이스는 주로 코드에서 다중 상속과 느슨한 결합을 달성하는 데 사용 됩니다. 이제 인터페이스에 대해 명확하게 이해했으므로 기능적 인터페이스가 무엇인지, 어떻게 작동하는지 살펴보겠습니다.

기능적 인터페이스란 무엇입니까?

기능적 인터페이스는 SAM(Single Abstract Method) 인터페이스라고도 합니다. 이름에서 알 수 있듯이 최대 하나의 추상 메서드를 가질 수 있습니다. 기능적 인터페이스에는 구현이 포함된 여러 정적 및 기본 메서드와 추가 추상 메서드가 있을 수 있습니다. 인터페이스를 기능적으로 표시하려면 @FunctionalInterface 주석이 사용됩니다 . 추가 메서드를 잘못 선언하는 것을 방지해야 합니다. 기능적 인터페이스가 인기를 끄는 이유는 익명의 번거로운 클래스 구현을 사용하지 않고도 람다 식을 사용하여 인터페이스를 생성할 수 있다는 점입니다. 인터페이스 내에 정의된 메서드는 기본적으로 추상 메서드이므로 기능 인터페이스에서 abstract 키워드 를 사용하는 것은 선택 사항입니다.

람다 표현식이란 무엇입니까?

람다 식은 자체적으로 실행되지는 않지만 기능적 인터페이스의 특정 메서드를 구현하는 데 사용되는 이름이 없거나 익명인 메서드입니다. 이는 다음과 같이 정의됩니다:
(parameter list) -> lambda body
코드에 표시되는 화살표 연산자( -> )를 람다 연산자라고 합니다. 예를 들어, 다음과 같은 메소드가 있다고 가정해 보겠습니다.
double getGoldenRatioValue() {
return 1.61803;
}
람다 표현식을 사용하면 다음과 같이 작성할 수 있습니다.
() -> 1.61803
보시다시피 람다 함수의 메서드에는 매개 변수가 없으므로 문의 왼쪽이 비어 있습니다. 오른쪽이 작업을 결정하므로 이 예에서는 황금 비율 값인 1.61803을 반환합니다. Java 8 이전에는 인터페이스를 구현하거나 내부 클래스 객체를 생성하는 것이 중요했지만 Java 8에서는 이제 기능적 인터페이스에 람다 표현식을 할당하기만 하면 됩니다.

기능적 인터페이스의 예

기능적 인터페이스를 생성하려면 @FunctionalInterface 주석을 사용 하거나 Java의 사전 정의된 기능적 인터페이스를 사용할 수 있습니다 .

실시예 1

  • 먼저 @FunctionalInterface에 태그를 지정하고 추상 getGoldenRationValue() 메소드에 의해 호출되는 MyInterface 라는 인터페이스를 생성합니다 .
  • 그런 다음 메서드를 실행하기 위한 공용 클래스 main을 만듭니다 .
  • 기능적 인터페이스에서 람다 식을 사용하려면 MyInterfaceDemo 에 대한 참조를 선언 한 다음 해당 참조에 람다 식을 할당합니다.
  • 마지막으로 참조 인터페이스를 사용하여 황금 비율 값을 인쇄해 보겠습니다.
import java.lang.FunctionalInterface;

// Creation и маркировка функционального интерфейса
@FunctionalInterface

interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}

public class Main {
public static void main( String[] args ) {

//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;

System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
결론:
황금비율의 가치 = 1.61803

실시예 2

  • 이 예에서는 T 인수를 사용 하여 double을 출력으로 반환하는 미리 정의된 함수 인터페이스 ToDoubleFunction을 사용합니다 .
  • ToDoubleFuntion 에는 applyasDouble() 이라는 추상 메서드가 포함되어 있습니다 .
  • 마지막으로 공백을 포함하여 메시지의 전체 길이를 인쇄합니다.
import java.util.function.ToDoubleFunction;
public class MyInterface2 {

public static void main(String[] args) {

ToDoubleFunction<String> length = x -> x.length();

System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
결론:
54.0

사전 설치된 기능 인터페이스 목록

이제 기능적 인터페이스를 정의하는 방법을 알았으므로 미리 정의된(내장) 기능적 인터페이스가 몇 개 있는지 살펴보겠습니다. 다양한 상황에서 구현할 수 있는 4가지 주요 기능적 인터페이스 유형이 있습니다: 소비자 (Consumer) , 조건자(Predicate ), 함수(Function)공급자(Supplier ). 이 네 가지 인터페이스 중 Consumer , FunctionPredicate 에는 추가 기능 인터페이스가 있습니다. 다음은 Java에 내장되어 있거나 사전 정의된 모든 인터페이스 목록입니다. 메모. 아래 표에 언급된 T, U, R은 각각 연산의 첫 번째 인수(T), 두 번째 인수(U), 결과(R)의 타입을 나타냅니다.
상호 작용 유형
실행 가능
바이컨슈머(T, U) 티, 유 →
이중기능(T, U, R) 티, 유 → R
바이너리연산자 티, 티 <→ R
BiPredicate<T, U> T, U → 부울
부울 공급업체 → 부울
소비자 티 →
DoubleBinary연산자 더블, 더블 → 더블
DoubleConsumer 더블 →
DoubleFunction 더블 → R
DoublePredicate 이중 → 부울
이중 공급업체 부울 →
DoubleToInt함수 더블 → 정수
DoubleToLong 함수 이중 → 길다
DoubleUnaryOperator 더블 → 더블
함수<T, R> 티 → R
IntBinary연산자 정수 → 정수
내부소비자 정수 →
Int함수 정수 → R
IntPredicate int → 부울
내부공급자 → 정수
IntToDouble함수 정수 → 더블
IntToLong 함수 정수 → 긴
IntUnaryOperator 정수 → 정수
LongBinary연산자 길다, 길다 → 길다
LongConsumer 길다 →
LongFunction 길다 → R
LongPredicate 길다 →
롱공급자 → 길다
LongToDouble함수 길다 → 두 배
LongToInt함수 긴 → 정수
Long단항 연산자 길다 → 길다
ObjDoubleConsumer T, 더블 →
ObjIntConsumer T, 정수 →
ObjLongConsumer T, 롱 →
술부 T → 부울
공급자 → 티
ToDoubleBiFunction<T, U> T, U → 더블
ToDouble함수 T → 더블
ToIntBiFunction<T, U> T, U → 정수
ToInt함수 T → 정수
ToLongBiFunction<T, U> T, U → 길다
ToLong 함수 T → 길다
단항 연산자 티 → 티

요약하자면

이 게시물에서 기억해야 할 몇 가지 주요 내용은 다음과 같습니다.
  • 인터페이스는 추상화 메커니즘으로 작동합니다.
  • 기능적 인터페이스에는 구현이 포함된 여러 정적 및 기본 메서드와 추가 추상 메서드가 있을 수 있습니다.
  • 기능적 인터페이스 내부에 정의된 메서드는 기본적으로 추상이므로 더 이상 abstract 키워드를 사용할 필요가 없습니다.
  • 람다 식은 자체적으로 실행되지는 않지만 기능적 인터페이스의 특정 메서드를 구현하는 데 사용되는 익명 메서드입니다.
  • 기능적 인터페이스를 생성하려면 @FunctionalInterface 주석을 사용 하거나 Java의 사전 정의된 기능적 인터페이스를 사용할 수 있습니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION