람다식이란 ?
람다식은 익명함수를 표현하는 하나의 표현식입니다. 이는 식별자 없이 실행가능한 함수 즉, 함수를 따로 만들지 않고 코드 한줄에 함수를 써서 그것을 호출하는 방식입니다. Java 8 부터 함수적 프로그래밍(함수 지향)을 위해 람다식을 지원해서 사용하고 있습니다. 이를 이용하면 기존의 익명 객체를 구현하는 방식보다 더 간결하게 코드를 짤 수 있습니다.
람다식 사용법
(매개변수, ...) -> { 실행문 ... }
(매개변수, ...)는 오른쪽 중괄호 {} 블록을 실행하기 위해 필요한 값을 제공하는 역할을 합니다. 매개 변수의 이름은 개발자가 자유롭게 지정할 수 있으며 인자타입도 명시해줄 필요가 없습니다. "->" 기호는 매개 변수를 이용해서 중괄호 {}를 실행한다는 뜻으로 해석할 수 있다.
+유의사항
- 매개변수의 타입이 추론가능하다면 생략 가능
- 매개변수가 하나면 소괄호를 생략 가능
- 실행문이 하나의 명령문인 경우에는 중광호 생략 가능 (세미콜론 x)
- 실행문이 하나의 return 문이라면 중괄호 생략 불가능
- return 문 대신 표현식을 사용할 수 있고, 반환값은 결과값이 됨 (세미콜론 x)
람다식 예제
new Thread(new Runnable() {
public void run() {
System.out.println("Annoymous Thread");
}
}).start();
위는 기존의 익명 객체 방식의 쓰레드 동작입니다.
new Thread(()->System.out.println("Lambda Thread")).start();
람다식을 사용하면 기존의 코드를 위처럼 한 줄짜리 코드로 표현할 수 있습니다.
@FunctionalInterface
public interface Test{
public int plus(int a, int b);
}
// ImplementationClass.java
public class ImplementationClass implements Test{
@Override
public int plus(int a, int b){
return a + b;
}
}
// Main.java
public class Main{
public static void main(String[] args){
Test t1 = new ImplementationClass();
System.out.println(t1.plus(3, 4));
}
}
위의 예는 추상메서드를 갖는 인터페이스를 구현합니다. 클래스를 재사용할 수 있다는 장점이 있지만, 재사용할 필요가 없는 메서드의 경우에 위와 같이 코딩하는 것은 불필요한 클래스 파일이 하나 늘어나는 결과를 낳게 됩니다.
public class Main{
public static void main(String[] args){
TestInterface t2 = new TestInterface(){
@Override
public int plusAandB(int a, int b){
return a + b;
}
}
System.out.println(t2.plus(3, 4));
}
}
위처럼 익명 구현객체를 사용하면 불필요한 클래스파일이 생기지 않고 프로그래밍 과정도 간결해집니다.
public class Main{
public static void main(String[] args){
TestInterface t3 = (a, b) -> {return a + b;};
System.out.println(t3.plus(3, 4));
}
}
이를 람다식으로 표현한다면 위 같이 깔끔하고 간결하게 표현할 수 있습니다.
마무리
람다식 장점
-
코드를 간결하게 만들 수 있음
-
개발자의 의도가 명확히 드러남 (가독성)
-
개발 노력이 비교적 줄어듬
-
병렬 프로그래밍이 용이함.
람다식 단점
-
함수 재사용이 불가능
-
디버깅이 비교적 까다로움
-
재귀함수에는 부적합
+ 람다식을 사용하기 위한 인터페이스에는 조건이 있는데, 구현해야 하는 인터페이스의 추상 메서드가 단 1개 여야만 람다식을 사용할 수 있습니다(람다식과 인터페이스가 1:1로 연결되기 때문).
이외에도 람다식을 위해 지켜야할 규칙이 더 있는데, 이를 개발자들이 일일이 체크하려면 무척 번거로운데 이를 위한 방법이 @FunctionalInterface 애노테이션입니다. 이 애노테이션은 작성한 인터페이스가 구현해야 할 추상 메서드가 하나만 정의된 인터페이스인지를 확인해주는 역할을 합니다. 이를 작성하면 컴파일러가 알아서 에러를 잡아줍니다.
'Language > Java' 카테고리의 다른 글
JAVA - 프로젝트 패키지이름 명명(Naming) 관례 (0) | 2021.02.04 |
---|---|
Java - 스택 트레이스(Stack Trace) 읽기 (3) | 2020.10.09 |
Java - 메인 메서드가 public static void인 이유 (0) | 2020.09.28 |
Java - JPA란 ? (+ORM) (0) | 2020.09.21 |
Java - JDBC란 ? (0) | 2020.09.20 |