자바는 객체 지향 프로그래밍이기 때문에 어떤 기능을 구현하고 싶다면 클래스를 설계하고 그 내부에 변수와 메서드를 정의하여 구현했었습니다.

여기에 자바 8부터 함수형 프로그래밍 방식을 지원하고 있습니다, 이를 람다식이라고 합니다.

이 함수형 프로그래밍 방식은 함수를 구현하고 함수를 호출함으로써, 들어온 매개 변수를 기반으로 함수가 수행이 됩니다.

여기서 중요한 점은 외부에 있는 변수를 사용하면 외부에 부수적인 영향(Side Effect)을 미칠 수 있으며, 이로 인해 에러와 잘못된 결과 값을 도출할 수 있기 때문에 외부 변수를 사용하지 않고, 매개 변수를 받고 그 매개 변수를 내부에서만 수행이 되기 때문에 외부에 영향을 끼치지 않습니다.

이게 좋은 점이 동시에 여러 함수가 호출되어도 문제가 발생하지 않는다는 것입니다. 즉, 여려 자료가 동시에 수행되는 병렬처리가 가능합니다.

람다식 문법

  • 함수의 이름은 정의하지 않습니다.
  • 매개 변수와 매개 변수를 이용한 실행문입니다.
    (매개 변수) -> {실행문;}

기본적으로 저희가 함수를 정의할 때는 아래와 같이 정의했었습니다.

// 두 수를 더하는 함수
int add(int x, int y){

    return x+y;
}

위의 함수를 람다식으로 표현할 때는 다음과 같이 정의할 수 있습니다.

(int x, int y) -> {return x+y;}

여기서 추가적으로 자료형을 생략할 수 있고, 매개 변수가 하나인 경우 아래와 같이 괄호를 생략할 수 있습니다. 하지만 매개 변수가 2개 이상인 경우 괄호를 생략할 수 없습니다.

str->{ System.out.println(str);}

또한, 실행문이 한 문장인 경우 괄호 생략이 가능합니다.

str-> System.out.println(str);

바로 위 코드에서 주의할 점은 실행문이 한 문장이라도 return문(반환문)은 괄호를 생략할 수 없습니다. 바로 아래와 같은 코드는 에러가 발생합니다.

str-> return str.length();  // 에러

하지만, 실행문이 한 문장의 반환문인 경우엔 return과 괄호를 모두 생략가능합니다. 즉, return 지정어를 사용할 경우 괄호를 생략하면 안되지만, 실행문이 한 문장이고 반환하려고 할 경우, return과 괄호를 생략해도 됩니다.

(x, y) -> x+y;
str -> str.length;

함수형 인터페이스

함수형 인터페이스라는 것은 람다식을 선언하기 위한 인터페이스를 뜻하고 익명 함수와 매개 변수만으로 구현되기 때문에 인터페이스는 단 하나의 메서드만을 선언해야합니다.

바로 아래와 같이 인터페이스에 @FunctionalInterface 애너테이션을 사용하여 선언할 수 있습니다.

@FunctionalInterface
public interface FunctionalInterfaceTest {
	int getMax(int x, int y);
}

@FunctionalInterface함수형 인터페이스라는 의미이며, 내부에 여러 개의 메서드를 선언하면 에러가 발생하게 됩니다.

위에서 작성한 코드를 main에서 아래와 같이 호출할 수 있습니다.

public class LambdaTest {
	public static void main(String[] args) {
    	// 람다식을 인터페이스 자료형 max 변수에 대입
		FunctionalInterfaceTest max = (x, y)->(x>= y)? x:y; 
        
		// 인터페이스 자료형 변수로 함수 호출
		System.out.println(max.getMax(10, 20));
			
	}

이상으로 자바 8부터 사용 가능한 함수형 프로그래밍 방식인 람다식에 대해서 간단히 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글