티스토리 뷰
▶자바의 람다식(Lambda Expression)
이번 글에서는 JDK8에서 람다식(Lambda Expression)이 지원되면서 자바는 완전히 새로운 언어처럼 보이기 시작했는데요.
람다식의 등장으로 자바는 객체지향 언어의 특징과 함께 함수형 언어의 특성을 갖추게 되었습니다.
🔎 람다식 ?
람다식을 이용하면 코드가 간견해지고, 지연 연산 등을 통해서 성능 향상을 도모할 수 있는데요.
반면에 모든 엘리먼트를 순회하는 경우에는 성능이 떨어지고, 코드를 분석하기 어려워 질 수 있다는 단점도 존재합니다.
📌 람다식 형태
(매개변수, ...) -> { 실행문 }
화살표(->)를 기준으로 왼쪽에는 람다식을 실행하기 위한 매개변수가 위치하고, 오른쪽에는 매개변수를 이용한 실행 코드 혹은 실행 코드 블럭이 옵니다.
📌 람다식 쉬운 예시
우선 람디식을 사용하지 않았을 때 두 숫자가 주어졌을 때 이를 더해주는 메소드를 하나 선언해 보겠습니다.
public int sum(int a, int b) {
return a + b;
}
위 함수를 람다식으로 표현해 보면 다음과 같이 작성할 수 있습니다.
(a, b) -> a + b;
두 정수 a, b를 입력받아 두 값을 더하는 하나의 식이다.
한줄로 의도하는 동작을 명확하게 정의할 수 있었는데요.
메소드의 리턴 타입도 없고, 메소드의 이름도 없습니다.
이 때문에 람다식을 익명함수(Anonymous Function) 라고 부르기도 합니다.
📌 함수형 인터페이스 + 람다식 예시
람다식은 굉장히 간결해서 여러 부분에서도 빠르고 쉽게 사용이 가능한데요.
이번에는 지난 글에서 알아보았던 인터페이스 안에 오직 한 개의 추상 메소드를 가지는 함수형 인터페이스와 함께 람다식을 사용해 보는 예시를 살펴보려고 합니다.
우선 함수형 인터페이스 하나를 선언해 주겠습니다.
아래 함수는 매개변수로 number가 주어졌을 때 그 수가 10의 배수인지 아닌지 boolean값으로 리턴해주는 함수를 의도로 추상 메소드를 하나 선언해 주었습니다.
@FunctionalInterface
public interface LmbdaInter {
public static boolean checkMultipleOf10(int number);
}
이제는 위 함수형 인터페이스를 구현하여 사용하는 부분 코드를 보겠습니다.
public class LambdaTest {
public static void main(String[] args) {
LambdaInter lambdaInter = n -> n % 10 == 0;
System.out.println(lambdaInter.checkMultipleOf10(20)); // true
}
}
위 코드에 자세히 봐야 할 부분은 인터페이스를 구현하는 부분인데요.
LambdaInter lambdaInter = n -> n % 10 == 0;
우리는 LamdaInter라는 인터페이스에서 선언만 해두었던 단 하나의 메소드 checkMultipleOf10가 있었습니다.
이제 우리가 아는 대로라면 이 선언만 되어있던 추상 메소드를 상속을 받아 구현을 해야하는데요.
바로 자식 클래스에서 선언을 하고 구현을 하는 부분이라고 이해하면 됩니다.
➕ 람다식 기초 실습
PrintName이라는 함수형 인터페이스를 선언하여 성과 이름을 전달받는 getFullName이라는 추상 메소드를 선언합니다.
그 후에는 PrintNameTest이라는 클래스를 선언하여 인터페이스에서 선언만 해두었던 추상 메소드를 구현합니다.
package lambdaTask;
@FunctionalInterface
public interface PrintName {
public abstract String getFullName(string lastName, String firstName);
}
package lambdaTask;
public class PrintNameTest {
public static void printFullName(PrintName printName, String lastName, String firstName) {
System.out.println(printName.getFullName(lastName, firstName));
}
public static void main(String[] args) {
PrintNameTest.printFullName((lastName, firstName) -> lastName + firstName, "김", "도은");
}
}
위 코드에서 PrintNameTest 클래스에서 printFullName이라는 메소드를 정의했는데요.
처음에 보았을 때는 "아니 뭐야...구현을 안 했는데 어떻게 사용하겠다는 거지..?" 할 수 있는데
해당 클래스에서의 printFullName 함수도 구현만 해놓고 사용은 main에서 사용하는 것입니다.
main 메소드에서 (lastName, firstName) -> lastName + firstName 자체가 printName이 되는 것입니다.
PrintName 인터페이스가 함수형 인터페이스이기 떄문에 가능했는데요.
따라서 printFullName 메소드에서 printName, 성, 이름으로 매개변수를 지정했으므로
main 메소드에서도 값을 그렇게 넘겨줬던 것입니다.
- Total
- Today
- Yesterday
- 프론트엔드
- react
- frontend
- 디프만
- 프론트엔드 공부
- 스타일 컴포넌트 styled-components
- 데이터분석
- next.js
- 프로젝트 회고
- 리액트
- 자바스크립트
- HTML
- 프론트엔드 기초
- react-query
- 딥러닝
- 인프런
- CSS
- 리액트 훅
- 머신러닝
- jest
- testing
- TypeScript
- rtl
- 파이썬
- 타입스크립트
- 자바
- styled-components
- JSP
- 자바스크립트 기초
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |