람다표현식에 대해 알아보기
- Coding/Java
- 2020. 11. 6.
람다표현식이란?
람다표현식은 JAVA 8에 등장하였다. 익명 클래스처럼 이름이 없는 함수이면서, 메서드를 인수로 전달할 수 있다. 메서드로 전달할 수 있는 익명함수를 단순화한 것이다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트를 가질 수 있다.
람다표현식의 특징
익명 = 메서드의 이름이 없다.
- 함수 = 메서드처럼 특정 클래스에 종속되지 않는다.
- 전달 = 람다 표현식을 메서드 인수로 전달하거나 변수로 저장될 수 있다.
- 간결성 = 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다.
람다를 이용해서 간결한 방식으로 코드를 전달할 수 있다. 람다가 기술적으로 자바 8 이전의 자바로 할 수 없었던 일을 제공하는 것은 아니지만, 동작 파라미터를 이용할때 익명 클래스같은 판에 박힌 코드를 구현할 필요가 없다.
람다표현식을 사용해보자
1) 람다 사용 전
Comparator<Test> test = new Comparator<Test>() {
public int compare(Test t1, Test t2) {
return t1.getNumber().compareTo(t2.getNumber());
}
}
2) 람다 사용 후
Comparator<Test> test = (Test t1, Test t2) -> return t1.getNumber().compareTo(t2.getNumber());
코드가 훨씬 간결해졌다. 람다 표현식을 사용하면 compare 메서드의 body를 직접 전달하는 것처럼 코드를 전달할 수 있다.
람다표현식 분석
Comparator<Test> test = (Test t1, Test t2) -> return t1.getNumber().compareTo(t2.getNumber());
위 람다표현식을 설명해보자.
(Test t1, Test t2) : 람다 파라미터
- -> : 파라미터, 바디를 구분
- t1.getNumber().compareTo(t2.getNumber()) : body 부분
1) 람다 표현식은 return이 함축되어있어, 생략이 가능하다.
(int t) -> t.length();
2) 람다 표현식은 여러 행의 문장을 포함할 수 있다.
(int t1, int t2) -> {
System.out.println("안녕");
System.out.println("안녕하세요.");
}
3) 람다표현식은 파라미터가 없을 수 있고, return을 할 수 있다. 아래 예시는 int 42를 반환하는 코드이다.
() -> 42
함수형 인터페이스란?
어디에 어떻게 람다를 사용할까? 이것을 알아보기전에, 우리가 알아야할 개념이 있다. 함수형 인터페이스에 대해 알아보자.
public interface Predicate<T> {
boolean test (T t);
}
함수형 인터페이스는 하나의 추상 메서드를 지정하는 인터페이스이다. 자바 API의 함수형 인터페이스로 Comparator, Runnable 등이 있다.
default 메서드를 잠시 설명하자면, 인터페이스의 메서드를 구현하지 않은 클래스를 고려해서 기본 구현을 제공하는 바디에 포함하는 메서드이다. 많은 default 메서드가 있더라도 추상 메서드가 오직 1개이면 함수형 인터페이스이다.
람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있으므로 전체 표현식을 함수형 인터페이스의 인스턴스로 취급할 수 있다.
함수형 인터페이스의 예시, Runnable
1) 익명클래스를 사용한 코드
Runnable t1 = new Runnable() {
public void run() {
System.out.println("안녕");
}
}
2) 람다 표현식을 사용한 코드
Runnable t1 = () -> System.out.println("안녕");
위 2가지를 모두 호출하는 메소드를 살펴보자.
Runnable t1 = () -> System.out.println("안녕");
Runnable t1 = new Runnable() {
public void run() {
System.out.println("안녕");
}
}
public static void process(Runnable r) {
r.run();
}
process(r1); // (1)
process(r2); // (2)
process(() -> System.out.println("안녕")); // (3)
(1)은 람다표현식의 메소드를 호출한 것이고, (2)는 익명클래스의 메소드를 호출한 것이다. (3)은 직접 전달된 람다 표현식을 사용하고있다.
'Coding > Java' 카테고리의 다른 글
빌더 패턴의 권장 이유 (0) | 2020.11.06 |
---|---|
실행 어라운드 패턴 (0) | 2020.11.06 |
java8의 LocalDateTime 클래스 날짜시간 (0) | 2020.11.06 |
자바 8의 Optional 등장 (0) | 2020.11.06 |
java에서 get() NullPointerException 일때 (0) | 2019.10.22 |