티스토리 뷰
기술 면접을 보면 가끔 자바8의 new features에 무엇이 있는지 질문 받을 때가 있다. 이제 자바 8을 실무에서 많이 사용하고 있는데도 정작 답변을 하려면 말문이 막힌다. 2014년도에 자바8 이 소개됐으니 6년이란 시간이 지났지만 commerical support 도 2030년까지 연장됐고 하니 정리를 하는 기분으로 대표적 기능을 한 개씩 작성해 봐야겠다.
람다표현식 (Lambda Expressions)
1. 무엇?
람다의 어원은 수학에서 왔다. 자세한 내용은 잘 모른다. 어쨌든 프로그래밍에서 말하는 람다는 익명 함수를 말한다. 람다 표현식은 익명 함수를 나타내는 표현식이다. 빠르고 간결하게 선언해서 사용할 수 있는 기능 블록이다. 밑에 코드는 자바스크립트(ES6+)의 Arrow Function을 이용한 람다 표현식 방법이다. 자바8부터 이와 비슷한 표기법이 가능하다는 이야기다.
let square = num => num * num;
2. Why lambda ?
그런데 람다가 필요한가, 기존 메서드랑 뭔가 다른게 있는건가..?
메서드와 람다는 어떤 기능을 처리하는 블럭이라는 점에서 공통적인 부분이 있다. 하지만 메서드와 람다(함수)는 몇 가지의 대표적 차이점이 있다. 세부 내용은 링크를 참고하고 https://sathyadotnet.blogspot.com/2014/02/difference-between-function-and-method.html
내가 강조하고 싶은 부분은 아래와 같다.
Lambda(Function) | Method |
객체에 속하지 않고 멱등하며 원자적이지 않은 외부값 변경을 할수 없다. | 객체에 속해 있고 객체 상태 정보를 변경한다. |
요즘은 대용량 데이터 처리의 필요성이 많고 해당 처리를 위해 분산 환경에서의 병렬처리 작업이 중요해졌다. 위에서의 람다의 특징이 병렬처리를 위한 멀티 쓰레딩 작업 환경에서의 안정성을 코드 차원에서 보장하게 된다.
또한 자바에서의 람다는 1급함수이다. 1급함수는 함수 자체를 매개변수로 제공하고 리턴값으로 사용할수 있고 변수에 할당할 수도 있다. 이러한 특징으로 람다는 다양한 기법을 통한 최적화 및 재사용성 높은 코드를 작성할 수 있다. 이외 여러가지 함수형 언어의 장점을 자바도 외면할 수 없기에 함수형 언어의 주요 패러다임을 억지로(?) 채용했을 것이라고 생각한다.
3. 이제 람다 표현식을 써보자
한개의 정수를 입력받고 입력받은 값의 제곱값을 반환하는 함수를 만들어 보겠다.
Java 8 이전
public class MyTest {
public static void main(String[] args) {
System.out.println(MyTest.power(10));
}
public static int power(int input) {
return input * input;
}
}
Java 8 이후
public class MyTest {
public static void main(String[] args) {
Function<Integer, Integer> power = (input) -> input * input;
System.out.print(power.apply(10));
}
}
위에서 본 람다 표현식이 익숙하지 않다면 오히려 더 복잡하게 느껴질 수 있다. 아래 다른 예제를 살펴보자 기존의 쓰레드 작성을 위한 코드이다.
Java 8 이전
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello M2SJ");
}
});
위 코드를 람다식으로 변경하면 아래와 같다.
Java 8 이후
Thread t = new Thread(() -> {
System.out.println("Hello M2SJ");
});
더 축약하면 이렇게까지 할 수 있다. 아름답다~!!; 고민 여지도 없이 써야 되겠다는 생각이 든다.
Thread t1 = new Thread(() -> System.out.println("Hello M2SJ"));
4. 억지로(?)
자바는 객체지향언어이고 객체지향언어를 구성하는 모든 요소는 type 이 필요하다.(int, boolean 같은 원시 타입도 Wrapper Class 들이 존재한다.) 위에서 억지로(?)는 농담이고 객체지향언어인 자바에서 람다를 사용하기 위해 위대한 자바 Contributor들은 기존의 interface 와 @FunctionalInterface 라는 어노테이션를 만들어서 적용시켰다.
@FunctionalInterface
위에서 Function<Integer, Integer> type이 있어다. 해당 인터페이스는 람다에서 사용하기 위해 자바에서 이미 구현해좋은 인터페이스들이다. Function<T, R> T가 입력값의 type 이고 R 이 리턴 type 이다. 해당 Function 인터페이스 코드를 살펴보면 아래와 같이 @FuncationalInterface를 확인할 수 있다.
@FuncationalInterface 어노테이션은 인터페이스당 한 개의 메서드만 구현하겠다는 의미이다. 즉 람다 함수를 사용할 인터페이스들이다.
java.util.function 패키지 밑에는 람다를 위한 미리 정의해 놓은 인터페이스들이 더 존재한다.
혹자들은 Java8 이상부터 모던 Java라고 하는 것 같다. 모던 자바를 활용하기 위해서 람다 표현식의 활용 능력은 자바 개발자로서 아주 중요한 부분인것 같다. 간단히 알아봤지만 잘 활용하기 위해서는 더 많은 공부가 필요할 것 같다.
'Java' 카테고리의 다른 글
Java8 New features #3 (Stream) (0) | 2020.08.19 |
---|---|
Java8 New features #2(default, static 메서드의 추가 ) (0) | 2020.08.18 |
Fork/Join Framework in Java (0) | 2020.06.16 |
Random Integer List in Java8 (0) | 2020.06.08 |
MessageFormat with Java (0) | 2020.05.26 |
- Total
- Today
- Yesterday