람다 도입된 이유
근래에 가장 핫한 용어 가운데 빅데이터가 있다. 빅데이터를 프로그램적으로 다룰 수 있는 방법이 필요해 졌다. 그 방법의 중심에는 멀티코어를 활용한 분산 처리, 즉 병렬화 기술이 필요하다.
이러한 추세에 대응하기 위해 자바8에서는 병렬화를 위해 컬렉션(배열, List, Set, Map)을 강화했고, 이러한 컬렉션을 더 효율적으로 사용하기 위해 스트림(Stream)을 강화했다. 또 스트림을 효율적으로 사용하기 위해 함수형 프로그래밍이 생겼고, 함수형 프로그래밍을 위해 람다가 생겼다. 또 람다를 위해 인터페이스의 변화가 수반됐다.
위의 내용을 순차적으로 정리하면 아래와 같다.
- 빅데이터 지원
- 병렬화 강화
- 컬렉션 강화
- 스트림 강화
- 람다 도입
- 인터페이스 명세 변경
- 함수형 인터페이스 도입
람다란 무엇인가?
람다란 한 마디로 코드 블록이다. 기존의 코드 블록은 반드시 메서드 내에 존재해야 했다. 그래서 코드 블록만 갖고 싶어도 기존에는 코드 블록을 위해 메서드를, 다시 메서드를 사용하기 위해 익명 객체를 만들거나 하는 식이였다. 하지만 람다 도입을 통해 이러한 수고를 할 필요가 없어졌다.
public class B001 {
public static void main(String[] args) {
MyTest mt = new MyTest();
Runnable run = mt;
run.run();
}
}
class MyTesy implements Runnable {
public void run() {
System.out.println("Hello Lamda");
}
}
위의 코드는 기존방식으로 Runnalble 인터페이스 구현체를 사용하는 코드이다. 코드를 개선해서 클래스 없이 익명 객체를 만들어 사용하는 코드를 만들어 보자.
public class B002 {
public static void main(String[] args) {
Runnable run = new Runnable() {
@Override
public void run() {
System.out.println("Hello Lamda");
}
}
run.run();
}
}
별도의 클래스 정의 없이 코드 블록인 메서드를 사용하고자 할 때 많이 사용되던 익명 객체를 사용하는 방법이다. 자바 8이전이라면 이 코드가 최선이라고 할 수 있다. 자바8에서는 람다를 사용하여 코드 블록만 사용할 수 있다.
public class B003 {
public static void main(String[] args) {
Runnable run = () -> {
System.out.println("Hello Lamda");
};
run.run();
}
}
이제 더는 익명 객체조차 만들 필요가 없다. 그러면 어떻게 이렇게 간단하게 변할 수 있는지 알아보자.
new Runnable()이 살아질 수 있었던 이유
Runnable 타입으로 참조 변수 run을 만들고 있으니 new Runnable()은 컴파일러가 알아낼 수 있다. 굳이 코드로 작성할 필요가 없어진 것이다.
public void run() 메서드가 단순하게 ()로 변결될 수 있는 이유
Runnable 인터페이스가 가진 추상 메서드가 run() 메서드 단 하나이기 때문이다.
람다 구조
(인자 목록) -> { 로직 }
람다에서는 로직이 단 한 줄로 표기되는 경우 블록 기호 {}마저 생략 할 수 있다.
함수형 인터페이스
추상메서드를 하나만 갖는 인터페이스를 자바8 부터는 함수형 인터페이스라고 한다. 이런 함수형 인터페이스만을 람다식으로 변경할 수 있다.
@FunctionlInterface
interface MyFunctionalInterface {
public abstract int runSomething(int count);
}
인터페이스인 MyFunctionalInterface 위에 @FunctionalInterface 어노테이션을 붙이는 것은 옵션이다. 이 어노테이션을 붙은 경우 컴파일러는 해당 인터페이스가 함수형 인터페이스의 조건이 맞는지 검사한다. 즉, 단 하나의 추상 메서드만을 갖고 있는지 확인한다.
댓글남기기