목차
1. 함수형 인터페이스란?
- 추상 메소드가 딱 하나인 인터페이스
- SAM(Single Abstract Method) 인터페이스
- @FuncationInterface 애노테이션을 가지고 있는 인터페이스
- 추상 메소드만 1개이면 되고 static 메소드나 default 메소드는 여러 개 포함할 수 있습니다.
- 함수형 인터페이스를 이용해 람다 표현식을 구현(사용)할 수 있습니다.
- 람다를 구현하기 위해 함수형 인터페이스를 사용한다고 볼 수 있습니다.
2. 함수형 인터페이스 생성하기
- 인터페이스에서 메소드의 접근 지정자를 지정하지 않을 경우 기본 값이 abstract이므로 추상메소드를 작성할 경우 abstract를 생략해도 됩니다.
[반환 값이 없는 함수형 인터페이스]
@FunctionalInterface
public interface TestVoidFuncInterface {
void printText();
static void staticMethod() {
System.out.println("static Method");
}
default void defaultMethod1() {
System.out.println("default Method1");
}
default void defaultMethod2() {
System.out.println("default Method2");
}
}
[반환 값이 있는 함수형 인터페이스]
@FunctionalInterface
public interface TestReturnFuncInterface {
int operation(int...num);
static int addNumber(int num1, int num2) {
return num1 + num2;
}
default int multiplyNumber(int num1, int num2) {
return num1 * num2;
}
}
3. 함수형 인터페이스 사용하기
[반환 값이 있는 함수형 인터페이스]
@FunctionalInterface
public interface TestReturnFuncInterface {
// 가변 매개변수
int operation(int...num);
// static 메소드
static int addNumber(int num1, int num2) {
return num1 + num2;
}
// default 메소드
default int multiplyNumber(int num1, int num2) {
return num1 * num2;
}
}
[구현 1: 익명 내부 클래스]
[익명 클래스 형식]
클래스 인스턴스 = new 클래스() {
};
public class Exe {
public static void main(String[] args) {
// 익명 내부 클래스
TestReturnFuncInterface anonymousInnerClass = new TestReturnFuncInterface() {
@Override
public int operation(int... num) {
int TempSum = 0;
for(int a : num) {
TempSum += a;
}
return TempSum;
}
};
// 구현한 추상 메소드
int result1 = anonymousInnerClass.operation(1,2,3,4,5,6,7,8,9,10);
System.out.println(result1); // 55
// static 메소드
int result2 = TestReturnFuncInterface.addNumber(1,2);
System.out.println(result2); // 3
// default 메소드
int result3 = anonymousInnerClass.multiplyNumber(10,20);
System.out.println(result3); // 200
}
}
[구현 2: 람다]
[람다 형식]
(인자 리스트) -> {바디}
public class Exe {
public static void main(String[] args) {
// 람다: 바디가 여러 줄인 경우
TestReturnFuncInterface lambda1 = (int...num) -> {
int TempSum = 0;
for(int a : num) {
TempSum += a;
}
return TempSum;
};
int result1 = lambda1.operation(1,2,3,4,5,6,7,8,9,10);
System.out.println(result1); // 55
// 람다: 바디가 한 줄인 경우 {} 생략 가능
TestReturnFuncInterface lambda2 = (int...num) -> Arrays.stream(num).sum();
int result2 = lambda2.operation(1,2,3,4,5,6,7,8,9,10);
System.out.println(result2); // 55
}
}
'Backend > Java' 카테고리의 다른 글
[java] 자바 8 람다표현식과 함수형 인터페이스 (함수형 프로그래밍) (0) | 2021.12.12 |
---|---|
[java] 자바 8 표준 함수형 인터페이스 (java.util.function) (1) | 2021.12.07 |
[JAVA] 자바 AES 암호화 하기 (AES-128, AES-192, AES-256) (0) | 2021.08.28 |
[JAVA] 자바 Hmac 암호화 하기 (HMAC-MD5, HMAC-SHA256, HMAC-SHA512) (2) | 2021.08.16 |
[JAVA] 자바 SHA 암호화 하기 (SHA1, SHA2, SHA3) (0) | 2021.08.15 |