☕️ 람다식(Lambda Expressions) 이란?
람다식이란 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어이다. 함수를 람다식으로 표현하면 메서드의 이름 없이 사용할 수 있게 되는데, 이 때문에 익명 함수라고도 불린다.
람다식은 자바 8부터 사용 가능하며 이로 인하여 자바에서도 함수형 프로그래밍이 가능하게 되었다.
☕️ 람다식(Lambda Expressions)의 장단점
- 람다식(Lambda Expressions)의 장점
- 코드를 간결하게 만들 수 있다.
- 식에 개발자의 의도가 명확히 드러나 가독성이 높아진다.
- 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다.
- 병렬프로그래밍이 용이하다. - 람다식(Lambda Expressions)의 단점
- 람다를 사용하면서 만든 무명함수는 재사용이 불가능하다.
- 디버깅이 어렵다.
- 람다를 무분별하게 사용할 경우, 비슷한 함수가 중복 생성될 수 있다.
☕️ 람다식(Lambda Expressions)의 기본문법
람다식의 기본 문법을 알아보기 전에 인터페이스를 사용함에 있어 기존방식과 람다식을 사용할 때의 차이점을 알아보자.
매개변수(num)를 받아 제곱을 계산하는 메서드(square)를 가진 인터페이스가 있다고 가정해 보자.
interface SquareIF {
int square(int num);
}
해당 메서드를 사용하기 위해서는 구현 클래스를 만들어야 하며, 구현 클래스에서 오버라이딩한 메서드를 호출해야 최종적으로 원하는 값을 얻을 수 있다.
class SquareImpl implements SquareIF {
@Override
public int square(int num) {
return num * num;
}
}
public class Test {
public static void main(String[] args) {
SquareIF squareIF = new SquareImpl();
System.out.println(squareIF.square(2)); // 4
}
}
또 다른 방법으로는 익명 클래스를 활용하는 방법도 있을 것이다.
public class Test {
public static void main(String[] args) {
SquareIF squareIF = new SquareIF() {
@Override
public int square(int num) {
return num * num;
}
};
System.out.println(squareIF.square(2)); // 4
}
}
두 방법 모두 실행까지 꽤나 많은 타이핑이 있었다. 이제 람다식을 사용한 예제를 확인해 보자.
public class Test {
public static void main(String[] args) {
SquareIF sif1 = (int a) -> {
return a * a;
};
System.out.println(sif1.square(2)); // 4
}
}
람다식을 사용한 코드를 보면 기존 코드와 다르게 SquareImpl 클래스 없이 square() 메서드를 사용한 것을 볼 수 있을 것이다.
이와 같이 람다식을 사용하게 되면 불필요한 코드를 줄여준다는 장점을 가지고 있다.
또한 익명클래스와 비교해 보았을 때도 조금 더 간결한 코드를 통해 가독성을 높일 수 있다는 장점도 있을 것이다. 당장은 큰 차이를 못 느낄 수 있겠지만 특징에 따른 생략이 가능하여 더 간결한 코드가 될 수도 있다.
이제 람다식의 기본 문법에 대해서 알아보자. 람다식의 기본 구문은 다음과 같다.
(매개변수) -> {함수 몸체}
위 코드에 대입해 보면, 매개변수는 (int a)가 되는 것이고 함수몸체는 {return a * a}가 되는 것이다.
람다식은 상황에 따라 기본문법을 더욱 간결하게 작성할 수도 있다. 자세한 설명은 아래의 코드를 통해 알아보도록 하자.
interface SquareIF {
int square(int num);
}
public class LambdaSample {
public static void main(String[] args) {
/*
* 추상 메서드를 하나만 갖는 인터페이스를 자바 8부터는 함수형 인터페이스라고 하며,
* 이런 함수형 인터페이스만을 람다식으로 표현 가능하다.
*/
SquareIF sif1 = (int a) -> {
return a * a;
};
System.out.println(sif1.square(1)); // 1
/*
* 1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
* - Square(int num)를 통해 a가 int일 수 밖에 없으므로 int를 생략할 수 있다.
* - (int a)가 (a)로 변경되었다.
*/
SquareIF sif2 = (a) -> {
return a * a;
};
System.out.println(sif2.square(2)); // 4
/*
* 2. 매개변수가 하나인 경우는 소괄호를 생략할 수 있다.
* - 1번 규칙에 의해 (a)로 변경되었으며, 매개변수가 1개이기 때문에 소괄호도 생략 가능하여 a가 되었다.
*/
SquareIF sif3 = a -> {
return a * a;
};
System.out.println(sif3.square(3)); // 9
/*
* 3. 함수의 몸체가 하나의 명령문만 있을 경우, 중괄호도 생략가능하다. 단, return구문은 생략해야한다.
*/
SquareIF sif4 = a -> a * a;
System.out.println(sif4.square(4)); // 16
}
}
예제를 통해 람다식의 문법에 대해서 알아보았다. 최종적으로 사용한 코드를 보면 확실히 간결해진 것을 느낄 수 있을 것이다.
이후 포스팅에서는 람다식과 밀접한 관련이 있는 '함수형 인터페이스'와 '메서드 참조'에 대해서 다뤄볼 예정이다.
References.
1. 망나니개발자 - [Java] 람다식(Lambda Expression)과 함수형 인터페이스(Functional Interface) - (2/5)
2. 코딩 바다에서의 항해일지 - [Java] 람다식(Lambda) 익히기
'IT' 카테고리의 다른 글
[Java] 진법 변환(10진수 <-> N진수) (1) | 2025.01.22 |
---|---|
[Java] 메서드 참조(Method Reference) (1) | 2025.01.22 |
[Java] 함수형 인터페이스(Functional Interface) (1) | 2025.01.22 |
[Java] Set과 equals() 및 hashCode()의 관계 (1) | 2025.01.22 |
[Java] 컬렉션 프레임워크(Collection Framework) (1) | 2025.01.22 |