본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-04-27자바공부(람다식 lambda함수형 인터페이스)

반응형

함수형 인터페이스란 하나의 메소드만 담고있는 인터페이스이다. 

 

위의 그림은 우리가 자주 보던 형식이다. 왼쪽부분을 보면 인터페이스를 하나 만들었고 그 인터페이스를 구현하는 클래스를 하나 만들고 메인에서 구현된 클래스를 인스턴스화 하여 사용한것이다 . 

 

이렇게 사용한것은 우리가 예전부터 사용하던 방식이다 . 오른쪽은 익명 클래스로 생성과 동시에 구현을 하면서 사용한것을 볼수 있다.. 

 

왼쪽같은 경우는 다른 클래스들 여려곳에서 사용할때 주로 사용하지만 오른쪽 같은 경우는 한번만 사용할떄 사용된다. 

 

그렇다면 람다는 어떻게 사용하는 것일까 . 오른쪽의 경우를 줄일수 있는대로 줄여 놓은 것이라고 생각하면 된다. 

예) a = a +2  를 a+=3 처럼 줄여 주는것이다 익숙해지면 편하게 사용 가능하다 

 

위 그림을 보면 인스턴스를 생성할때 우리는 충분히 앞을 보고 유추 가능하다 그래서 생략 가능 할 것이다. 

 

아까 생략에 이어 함수형 인터페이스는 메소드가 하나 뿐이니 메소드 자체도 생략해도 될것이다. 

 

그럼 이렇게 나올것인데 첫줄을 보면 첫줄에 s 는 분명 매개변수라고 생각할 수도 있지만. 반대로 기존에 있던 변수있수도 있다. 그래서 나온것이 두번째 줄이고 그것보다 더 줄인것이 맨 마지막줄이고 이게 람다라고 보면 된다 . 

 

람다식의 생략 

 

1 . 이렇게 생략이 가능 하고 또 매개변수가 2개이상인 람다식도 있다 . 

2. 그리고 또 반환값이 있는 람다식 

3. 매개변수가 없는 람다식 

 

그리고 인터페스를 작성을 할때 어노테이션을 사용하여 제어할수도 있다. 

함수형 인터페이스는 하나의 메소드만 가지고 있어야 하는데 조건에 부합되지 않는다면 컴파일 오류를 띄우줘라 라고 

@FunctionalInterface (어노테이션) 을 붙여서 사용할수 있다 

첫번째 것은 이정도면 이해가 될것이다. 

그런데 문제는 두번째이다. 보면 메소드가 3가지가 있다. 그렇담 람다를 사용할수 있을까? 라는 의문이 들텐데 총 3가지 메소드 중에 첫번재 Cal 메소드는 구현이 안되있는 추상메소드이고 add 와 sub는 이미 구현이 되어있다. 

그래서 이런 경우에도 람다식으로 사용이 가능하다 ! 

 

4.람다식 과 제너릭 

 

 

연습문제 

interface Calculate<T>{
	T cal(T a , T b);
}

public class Lambda {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

//		Calculate<Integer> cal2 = (a , b) -> a + b ;
//		Calculate<Double> cal3 = (a , b) -> a + b ;
//		Calculate<Integer> cal4 = (a , b) -> a - b ;
//		Calculate<Double> cal5 = (a , b) -> a - b ;
//		System.out.println(cal2.cal(3,4));
//		System.out.println(cal3.cal(2.5,7.1));
//		System.out.println(cal4.cal(4,2));
//		System.out.println(cal5.cal(4.9,3.2));
		//메소드 호출함과 동시에 보내주기 
		calAndShow((a,b)->a+b,3,4);
		calAndShow((a,b)->a+b,2.5,7.1);
		calAndShow((a,b)->a-b,4,2);
		calAndShow((a,b)->a-b,4.9,3.2);
		
	}
	
	public static<T> void calAndShow(Calculate<T> op , T n1, T n2) {
		T r = op.cal(n1, n2);
		System.out.println(r);
	}
}

람다식으로 변경하기

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Lambda_Self {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("아옳옳");
		list.add("아옳");
		list.add("아옳옳옳옳");
		
		
		Collections.sort(list,(s1, s2) -> s1.length() - s2.length()); 
		
		for(String s : list) {
			System.out.println(s);
		}					
	}
}

 

반응형