[210615] java Lambda Expression

iseeu95·2021년 6월 15일
0

Java

목록 보기
7/12

java Lambda Expression


1. 람다식이란?

익명객체를 생성하기 위한 표현식..
옛날부터 들었지만 손이 안갔는데 이참에 써봤다.

1.1 람다식 이전

public interface Kuruma {
	public void iku();
}

public class Benz implements Kuruma{
    @Override
    public void iku() {
    	System.out.println("ike!!");
    }
}

public class Main {
	public static void main(String[] args) {
    	Kuruma bz = new Benz();
        bz.iku();
    }
}

java에서 interface를 이용해 다형성을 제공하기 위해서는 interface를 만들고, 그것을 구현한 class를 작성한 뒤, 사용시에는 interface 타입의 참조변수에 interface를 구현한 class의 객체를 생성하여 사용했다.

흐름을 보면

※익명 객체

public class Main {
	public static void main(String[] args) {
    	Kuruma bz = new Kuruma() {
        	public void iku() {
            	System.out.println("ike!!");
            }
        };
        bz.iku();
    }
}

혹은 다음과 같이 실행하는 쪽에서 익명 객체를 만들어 사용했다. 하지만 Kuruma를 구현한 객체가 자주 사용되어야 하면, 위 코드를 계속해서 반복해서 사용하게 되며 지저분한 코드가 될 것

1.2 람다식 사용

public class Main {
	public static void Main(String[] args) {
    	Kuruma bz = () -> System.out.println("ike!!");
        bz.iku();
    }
}


2. 람다식 표현법

람다식은 매개변수 + 실행문 구성 -> 접근자, 반환형 모두 생략

()->{}; 형태로 구성되며, 첫 괄호 ()에 해당 interface 함수의 매개변수를 입력하면 된다.
그 다음 ->를 입력하고, {} 안에 실행 할 코드를 작성

2.1 예제

우선 람다식에 사용 될 Interface 생성

public interface Calculator {
	public int call(int num1, int num2);
}

1. 기본 사용법( (매개변수 타입) -> {}; )

public static void main(String[] args) {
	Calculator cal = (int num1, int num2) -> {return num1 + num2; };
        System.out.println(cal.cal(1,2));
}   

2. 매개변수 타입 생략( (매개변수) -> {}; )

기본 사용법에서 매개변수가 1개 이거나, 2개 이상의 매개변수의 타입이 모두 같을 때에는 타입 생략이 가능

public static void main(String[] args) {
	Calculator cal = (num1, num2) -> {return num1 + num2; };
        System.out.println(cal.cal(1,2));
}  

3. 매개변수가 없는 경우( () -> {}; )

public static void main(String[] args) {
	Calculator cal = () -> {System.out.println("매개변수가 없는 경우")};
        cal.cal();
}  

4. 중괄호 생략( () -> ; )

public static void main(String[] args) {
	Calculator cal = (num1, num2) -> num1 + num2; 
        System.out.println(cal.cal(1,2));
}  

실행할 문장이 1개 일 때는 {} 생략 가능하며
이 때 반환이 필요한 메소드는 return 생략이 필수

5. 소괄호 중괄호 생략( 매개변수 -> ; )

public static void main(String[] args) {
	Calculator cal = num1, num2 -> System.out.println(num1);
        cal.cal(1);
}  

매개변수가 1개이고, 실행 할 문장도 1개면 (), {} 생략 가능


3. 람다 사용 조건

람다식을 사용하기 위한 Interface에는 조건이 있다.
구현해야 할 Interface의 추상 메소드가 단 '1개' 이어야 한다는 조건!
2개 이상인 경우 어떤 메소드를 람다식으로 표현했는지 알 수 없으니 당연하다
하지만 모든 Interface를 검사하며 개발하기엔 너무 어렵다.
그래서 나온 방법이

3.1 @FunctionalInterface Annotation

바로 @FunctionalInterface 어노테이션을 사용하는 것!

@FunctionalInterface
public interface Calculator {
	public int cal(int num1, int num2);
        public void cal2();
}    

위와 같이 람다식으로 표현하기 위해 사용 될 Interface 위에 @FunctionalInterface만 붙여주면 컴파일 시 알아서 에러를 잡아준다.

profile
Better than Yesterday

0개의 댓글