Programing Language/JAVA

함수형 인터페이스와 람다 표현식

칼쵸쵸 2020. 8. 11. 22:52

함수형 인터페이스

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. 불변성

: 한번 정의된 함수는 다른 함수에 의해서 변할수 없게 되며 안정적인 구현이 가능해 진다.