자바 8 이전
우선 람다식을 이해하기 전에 아래 형식이 자바 8 이전에 람다를 사용하던 기본 형식이다.
public interface Test {
public void a(int x);
}
public class Hello implements Test{
@Override
public void a(int x) {
System.out.println("");
}
}
람다식으로 바뀔 부분은 구현체 부분인 @Override 영역이 람다식으로 문법이 바뀐다.
그러므로 람다식은 항상 인터페이스가 존재해야 사용 가능하다.
자바 8의 람다식
기본적으로 람다식은 () -> {}의 형식으로 쓰인다.
(int x) -> { System.out.println(x); }
int x 매개변수로부터 값을 받아 System.out.println(x)를 뿌려주는 예제다.
위에 서술했듯이 람다식도 당연히 인터페이스를 오버라이드 해서 사용한다. 아래의 코드를 봐보자.
public interface Test {
public void a(int x);
}
public static void main(String[] args) {
Test test = (x) -> { System.out.println(x); };
test.a(3);
}
//3이 출력된다.
여기서 사라진 코드는 @Override, 메소드명이고 남아있는 것은 매개변수와 구현내용이다.
그리고 전체를 생성자로 묶어서 test 객체로 받을 수 있다.
이렇게 통째로 생략이 가능한 이유는 없어도 알아 먹을 수 있는 정보였기 때문이다.
그 결과 필요없는 것 다 빼고 Test 인터페이스에 있는 메소드를 자동 매핑해서 Override 한다.
지금은 a라는 메서드가 하나밖에 없지만 있는데, 만약에 2개가 있다면? 에러 난다.
그래서 추상 메서드는 항상 1개만 존재하기 때문에 이름을 지정하지 않고도 해당 메서드를 Override 해올 수 있다.
인터페이스의 클래스에 있는 추상 메서드에 설정된 매개변수(int x)와 람다식에서 던지는 매개변수(int x)가 일치하면 메소드 이름에 상관없이 오버라이드 된다.
public static void main(String[] args) {
String[] strs = {"a", "b", "c"};
List<String> list = Arrays.asList(strs);
list.forEach(item -> System.out.println(item));
}
보통 위와 같은 스타일로 많이 사용된다. list의 요소를 item에 하나씩 넣어 출력 하는 코드다.
list.forEach(System.out::print);
자바 8 에서 이중 콜론을 사용하는 경우도 있는데 이 역시 람다식이다.
람다식에서 좌측과 우측의 요소가 같을 경우 생략을 위해 사용한다.
언제 사용하나?
자바 8 이전의 방식도 때에 따라 어느 것을 사용하느냐에 따라 가독성이 달라지는데 보통 Stream, Thread, GUI, 간단한 반복문 처리 등에서 많이 사용되어 가독성이 향상된다.
'☕ Java' 카테고리의 다른 글
[Java vs Node.js] 무엇이 더 좋을까? (0) | 2022.01.23 |
---|---|
기본 생성자(Default Constructor)가 필요한 이유 (0) | 2021.03.30 |
[JSP] 캐시 방지 & 캐시 삭제 팁 (0) | 2021.03.22 |
JSP 내에 쓰일 수 있는 태그 종류 (0) | 2021.01.21 |
JVM, JRE, JDK 차이 (0) | 2020.02.11 |