함수형 인터페이스
package prac;
@FunctionalInterface
public interface AnyInterface {
int method1(int a);
static void print()
{
System.out.println("hi");
}
default void print2()
{
System.out.println("hi2");
}
}
함수형 인터페이스는 추상 메서드를 1개 가진 인터페이스로 정의 된다.
추상 메서드는 1개이며 Static 메서드 Defalt 메서드 등 다른 한정자 메서드들은 상관 없다.
추상 메서드가 2개 이상이면 @FunctionalInterface 어노테이션에 의해서 컴파일 오류가 발견된다.
함수형 인터페이스는 익명 내부 클래스를 구현하여 사용한다.
익명 내부 클래스
package prac;
public class main {
public static void main(String[] args) {
AnyInterface any = new AnyInterface() {
@Override
public void method1(int a) {
return a+1;
}
};
any.method1();
}
}
익명 내부 클래스는 인터페이스를 생성과 동시에 override 하여 메서드를 구현하며 이를 객체로 사용할 수 있게 된다.
익명 내부 클래스는 JAVA8 이전 버전에서 사용되었으며 JAVA8 이후에는 이를 람다식을 활용하여 구현 할 수 있다.
람다식으로 구현한 익명 내부 클래스
package prac;
public class main {
public static void main(String[] args) {
AnyInterface any = (a) ->
{
return a+1;
};
System.out.println(any.method1(1));
}
}
익명 내부 클래스를 구현 하는 과정에서 new를 사용하여 객체를 생성하고 이를 override하여 메서드를 정의하는 부분을 "() -> 함수정의" 라는 간단한 코드로 변환하였으며 코드량을 줄이고 보다 간편하게 사용할 수 있게 되었다.
위와 같은 람다정의식을 사용하기 위하여 함수형 인터페이스는 단 한개의 추상메서드만을 가지고 있다.
이러한 형태의 메서드 선언을 통해 자바에서 함수형 프로그래밍을 사용 할 수 있다.
함수형 프로그래밍을 통해 다음과 같은 함수 구현이 가능해 진다.
1. 함수를 First class object로 사용할 수 있다.
: 함수 파라미터, return, 변수에 주입되어서 사용될 수 있다.
2. 순수 함수로 구현
: 함수 밖에 있는 값을 변경할 수 없게 되며 이에 따라 함수사용으로 인해 예상치 못한 사이드 이펙트를 줄일 수 있다.
3. 고차 함수로 구현
: 함수가 함수를 매개변수로 받을 수 있으며 함수를 리턴하는 할 수 있게 된다. 이를 통해 함수를 조합하여 다른 함수를 유동적으로 구현 할 수 있게 된다.
4. 불변성
: 한번 정의된 함수는 다른 함수에 의해서 변할수 없게 되며 안정적인 구현이 가능해 진다.
'Programing Language > JAVA' 카테고리의 다른 글
AutoBoxing vs UnBoxing (0) | 2021.02.21 |
---|---|
Platform Independent Language (0) | 2021.02.21 |
JAVA Stream API -1 (기본 사용법) (0) | 2021.01.21 |
Effective Final과 lambda expression의 Scope (0) | 2020.08.16 |
JAVA 기본 함수형 인터페이스 정리 (0) | 2020.08.16 |