람다식
람다식은 익명함수를 이용해서 익명 객체를 생성하기 위한 식이다.
JDK 1.8에서부터 도입되었고 당연히 1.8버전부터 사용 가능하다.
객체지향 언어인 자바 안에 함수 지향 방식인 람다 표현식을 혼용함으로써 더욱 간결한 프로그래밍이 가능하다.
이곳 저곳 참고자료를 들여다 보면 자바에서 람다에 대한 퍼포먼스와 실용성을 인정하느냐 마느냐 갑을논박도 있고,
자바의 강력한 객체지향적 특성에다 찬물을 끼얹는 존재로 치부하는 경우도 있다.
이번 포스팅에는 자바에서의 람다식 사용 방법에 기초하는 포스팅을 쓰고,
추후에는 람다식이 자바에 도입되는데에 대한 이해와 배경을 토대로 나의 경험과 생각을 덧대어 써볼 생각이다.
람다식은 기본적으로 함수를 만들어 사용한다.
기존에는 인터페이스타입 변수에 인터페이스를 구현체를 대입하여 사용하였다.
람다식은 인터페이스의 구현체를 람다 표현식으로 작성하여 인터페이스타입의 변수에 대입하여 사용한다.
우선 파라미터가 다른 메서드를 정의한 인터페이스를 4개 만든다.
LamdaInteface1.java |
package chap1; public interface LamdaInteface1 {
public void method(String s1, String s2, String s3); // String 타입의 데이터 3개를 파라미터로 받는 메서드
} |
LamdaInteface2.java |
public interface LamdaInteface2 { public void method(String s1); // String 타입의 데이터 1개를 파라미터로 받는 메서드 } |
LamdaInteface3.java |
package chap1; public interface LamdaInteface3 { public void method(); // 파라미터가 없는 메서드 } |
LamdaInteface4.java |
package chap1; public interface LamdaInteface4 { public int method(int x, int y); // int 타입의 데이터 2개를 파라미터로 받아 정수로 반환하는 메서드 } |
이렇게 파라미터가 다른 여러 인터페이스를 만든 이유는 람다식을 사용할때 파라미터에 따라
불필요한 괄호 생략이 가능함을 설명하고자 한 것이다.
지난 인터페이스를 다루는 포스팅에서는 메서드를 정의한 후 구현 클래스를 생성하여 구현을 했다.
람다식은 어떻게 작성하는지 코드로 확인해보자.
MainClass.java |
public static void main(String[] args) {
LambdaInterface1 li1 = (String s1, String s2, String s3) -> -- ① { System.out.println(s1 + " " + s2 + " " + s3); li1.method("Hello", "java", "World");
System.out.println();
LambdaInterface2 li2 = (s1) -> { System.out.println(s1); }; -- ② li2.method("Hello");
LambdaInterface2 li3 = (s1) -> System.out.println(s1); -- ③ li3.method("Hello");
LambdaInterface2 li4 = s1 -> System.out.println(s1); -- ④ li4.method("Hello");
LambdaInterface3 li5 = () -> System.out.println("no parameter"); -- ⑤ li5.method();
LambdaInterface4 li6 = (x, y) -> { -- ⑥ int result = x + y; return result; }; System.out.printf("li6.method(10, 20) : %d\n", li6.method(10, 20));
li6 = (x, y) -> { int result = x * y; return result; }; System.out.printf("li6.method(10, 20) : %d\n", li6.method(10, 20));
li6 = (x, y) -> { int result = x - y; return result; }; System.out.printf("li6.method(10, 20) : %d\n", li6.method(10, 20));
} |
① : 접근자, 반환형, return 키워드 없이 파라미터와 실행문 만으로 작성한다.
③ : 실행문이 1개 일때 '{ }' 를 생략할 수 있다. (조건문에서 문장이 하나일때 '{ }'를 생략하는 것과 같음)
④ : 파라미터와 실행문이 1개일때 '( )' 와 '{ }'를 생략할 수 있다.
⑤ : 파라미터가 없을 땐 '( )' 만 작성한다.
⑥ : 리턴 값이 있는 경우