매일같이 평범한 Java의 반복문과 함수를 선언하며 궁금했던 자바(Java)에서 사용하는 람다(Lamda)와 스트림(Stream)에 대한 문법에 대한 이해와 사용법에 알아보려고 한다. 어느 정도 코딩이나 알고리즘 문제를 풀다 보면 한 없는 조건문과 반복문만을 사용하고 있는데 람다와 스트림을 사용하면 생각보다 코드를 간결화할 수 있다. 간단하게 람다와 스트림의 사용법과 예제를 통하여 알아보도록 하자.
람다(Lamda)
Java의 Lamda는 메소드를 하나의 식(Expression)으로 표현한 것이다. 다른 말로 표현하자면 익명 함수(Anonymous function) 생성 문법이라 할 수 있다. 단, 제약조건이 있는데 클래스(Class)의 구성 멤버로 선언되어야 한다.
람다의 기본식
람다의 기본식은 아래와 같습니다.
람다를 사용할 때의 장점
- 코드의 간결성
- 지연연산 수행
- 병렬 처리 가능
람다를 사용할 때의 단점
- 람다식의 호출에 대한 어려움
- Stream 사용 시 단순 반복문(for 혹은 while)의 성능이 떨어집니다.
람다를 사용하는 예제
아래의 코드는 간단한 예제로 익명 함수를 사용하기 위하여 함수형 인터페이스를 선언한다. 함수형 인터페이스를 사용하기 위해서는 @FunctionalInterface 어노테이션을 사용하면 된다. 참고로 함수형 인터페이스에 선언된 추상화 메서드(abstract method)는 단 1개 만을 선언하도록 되어있기 때문에 여러 개를 선언하면 에러가 발생하니 참고한다.
//익명 함수를 사용하기 위한 인터페이스
@FunctionalInterface
interface AgeInterface {
int nextLevel(int curLevel);
}
public class Kkul {
public static void main(String[] args) {
int level = 2;
//익명 함수 선언
AgeInterface gettingAge = (curLevel) -> { return curLevel + 1; };
System.out.println( String.format("kullbung's current level is %d" , level) );
System.out.println( String.format("kullbung's next level is %d" , gettingAge.nextLevel(level)) );
}
}
함수형 인터페이스에 2개 이상의 추상화 함수를 선언할 경우 다음과 같이 에러가 발생한다.
=> Invalid '@FunctionalInterface' annotation; AgeInterface is not a functional interface
해결 방법은 함수를 1개로만 정의하고 함수형 인터페이스를 따로 선언하는 것이 좋다.
@FunctionalInterface
interface AgeInterface {
int nextLevel(int curLevel);
//2개 째의 함수를 선언해본다.
int nextLevel(int curLevel, int testLevel);
}
public class Kkul {
public static void main(String[] args) {
int level = 2;
//익명 함수 선언
AgeInterface gettingAge = (curLevel) -> { return curLevel + 1; };
System.out.println( String.format("kullbung's current level is %d" , level) );
System.out.println( String.format("kullbung's next level is %d" , gettingAge.nextLevel(level)) );
}
}
오늘은 람다에 대한 예제와 함수형 인터페이스에 대한 설명을 알아보았습니다. Java 에서 제공하는 함수형 인터페이스가 있는데 그에 관해서는 다음에 다뤄보도록 할게요. 감사합니다.
'개발자의삶 > Java' 카테고리의 다른 글
JPA를 사용하는 이유와 JPA 는 어떻게 객체 지향적인가? (0) | 2025.03.17 |
---|---|
Java) 숫자 자리수 맞추기, 패딩(String.format을 알아보자) (1) | 2023.01.03 |
Java 버전별 특징 및 GC 의 변화 (0) | 2022.11.17 |
댓글