본문 바로가기
Java

Lambda

by 스르나 2020. 7. 9.

람다 표현식

 

자바 8부터 람다 표현식이 추가 되었다. 람다표현식의 등작으로 자바에서도 함수형 프로그래밍이 가능해졌는데 이것은 자바의 큰 변화이다.

 

우선 람다의 기본적인 개념부터 설명해보자

자바에서의 람다는 기본적으로 익명 클래스와 동급으로 취급되는 객체처럼 사용이 된든것이다.

그렇기 때문에 변수에 대입을 하듯이 사용이 가능하고 매개변수의 인자로 전달 또한 되면서 기본의 자바의 체계에 무리를 안준다.

 

그렇다면 기초적인 사용법을 보자

 

우선 아래의 코드는 자바에서의 기본적인 메소드이다.

int foo(int num){
	return num;
    }

위의 메소드를 람다로 표현 하면 아래와 같다.

 

(int num) -> {return num;}

 

보다싶이 차이점은 반환타입, 메소드명이 없다는 것이다.

 

그리고 메소드의 형태가 총 4가지인데

 

  1. 매개변수가 없고, 반환값이 없는 형태
  2. 매개변수가 있고, 반환값이 없는 형태
  3. 매개변수가 없고 반환값이 있는 형태
  4. 매개변수가 있고 반환값이 있는 형태

각각의 경우에 따라 람다식은 아래와 같다.

 

//매개변수가 없고, 반환값이 없는 형태
() -> {System.out.println("Hello world!");};

//매개변수가 있고, 반환값이 없는 형태
(Integer i) -> {System.out.println(i);};

//매개변수가 없고 반환값이 있는 형태
() -> {return 55;};

//매개변수가 있고 반환값이 있는 형태
(Integer num) -> {return num;};

 

 

그렇다면 이런 람다식을 어디에 넣어서 쓸 수 있는지도 알아야 하니 함수형 인터페이스를 알아보자

람다식은 익명 클래스와 동급이니. 람다를 만들어서 다른 곳에 대입을 할 수 있다. 이때 람다식을 대입하기 위해 만드는 것이 함수형 인터페이스이다.

 

@FunctionalInterface
public interface FooInterface {
    int foo(int num);
}

위처럼 인터페이스에 @FunctionalInterface라는 어노테이션을 붙이고 아래에 딱 한가지의 메소드를 정의해주면 된다.

어노테이션은 단순히 컴파일러가 제대로 선언되었는지 확인을 하기 위한 용도이니 안써도 사용가능은 하지만 안전성을 위해 꼭 써주도록 하자.

 

그리고 메소드는 반드시 한가지여야 한다. 그래야 람다식이 대입이 된다. 람다식 자체가 아래와 같이 사용되는 것이기 때문에 한번에 이해가 갈 것이다. 즉, 동등한 메소드가 필요한 것이기 때문이다.

 

(int num)-> {return num;);



new Object(){
	int foo(int num){
    	return num;
        }
    }

 

그리고 이런 함수형 인터페이스를 선언 했다면 아래와 같이 사용할 수 있다.

 

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

        FooInterface fooInterface = (int num) -> {return  num;};

        System.out.println(fooInterface.foo(55));
    }
}

이렇게 사용할 수 있다. 이러면 fooInterface를 통해 즉시 사용도 가능하고 필요한 경우 매개변수로 전달도 가능하다.

'Java' 카테고리의 다른 글

Thread-1  (0) 2021.02.08
Interface  (0) 2020.09.21
Generic  (0) 2020.07.21
Stream  (0) 2020.07.15
lambda2  (0) 2020.07.10