JAVA

람다식(Lambda expression)

미로910 2024. 9. 13. 09:47
1. 람다식의 기본 개념과 문법을 직접 말할 수 있다.
2. 기존에 자바 코드를 람다식 표현법을 사용해서 작업할 수 있다.
3. 함수형 인터페이스(Functional Interface)가 무엇인지 간단하기 말할 수 있다.
4. 자바8 버전부터 제공해주는 interface Function<T, R> 을 활용할 수 있다.

자바에서 람다식(Lambda expression)은 함수형 프로그래밍 개념을 도입한 것으로, 익명 함수(이름이 없는 함수)를 간결하게 표현할 수 있게 해 줍니다, 람다식은 자바 버전 8(2014년 출시)부터 사용할 수 있습니다. 추가로 자바 8은 함수형 프로그래밍을 지원하기 위한 여러 기능을 함께 도입했습니다

즉, 람다식을 사용하면 코드가 간결해지고, 특히 컬렉션이나 스트림 API 을 처리할 때 매우 유용합니다.

람다식은 주로 간단한 작업을 한 줄의 코드로 처리할 때 많이 사용하며 예를 들어, 리스트의 요소를 하나씩 처리할 때 기존 방식보다 훨씬 간단하게 표현할 수 있습니다.(스트림 API 학습 후 알아 봅시다)

 

함수형 프로그래밍 (Functional Programming)

수학적 함수의 개념에 기반한 함수를 기본 단위로 사용하여 문제를 해결하는 프로그래밍 패러다임입니다. 

  1. 순수 함수: 입력이 동일하면 항상 동일한 출력을 반환하는 함수로, 함수의 실행이 프로그램 상태나 외부 변수에 의존하지 않습니다. 즉, 부작용(side effects)이 없습니다.
  2. 불변성: 함수형 프로그래밍에서는 데이터를 변경하지 않고, 변경이 필요할 때는 기존 데이터를 복사한 후 수정합니다. 이는 불변 객체와 연결됩니다.
  3. 고차 함수: 함수를 인자로 전달하거나 함수에서 함수를 반환할 수 있습니다. 함수는 일급 객체(First-class citizen)로 취급됩니다. (ex: 비동기 처리)
  4. 함수 조합: 여러 함수를 조합하여 더 복잡한 함수를 만들 수 있으며, 이를 통해 코드를 간결하고 모듈화할 수 있습니다.
  5. 대표 언어 : Haskell, Scala 등

 

람다식의 기본 문법

람다식의 기본 형태
(매개변수) -> { 코드 블록 }
  • 매개변수: 함수가 입력받는 값입니다.
  • ->: 람다식에서 매개변수와 실행할 코드를 구분하는 화살표입니다.
  • 코드 블록: 매개변수로 받은 값으로 처리할 내용을 작성하는 부분입니다.

 

람다식을 사용하기 위한 주요 개념 (반드시 이해!)

람다식을 사용하기 위해 자바에서는 함수형 인터페이스(Functional Interface)가 필요합니다. 함수형 인터페이스는 단 하나의 추상 메서드만 가지고 있는 인터페이스를 말합니다. 대표적인 예로는 Runnable, Callable, Comparator, Consumer 등이 있습니다.

@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething();
}
: 추상 메서드만 단 하나만 가지므로 람다식을 사용하여 구현할 수 있다.
 
정리해 봅시다. 람다식을 사용할려면 먼저 함수형 인터페이스(Functional Interface)가 존재 해야 한다.

 

 


자 그럼 두 수를 입력 받아 더하는 add() 함수를 만들어 본다면 아래와 같은 코드가 된다.
int add(int x, int y){
return x + y;
}
 

위 코드를 람다 식으로 변경한다면 코드는 어떻게 될까?

(int x, int y) -> {return x+y;}
 

 
 

오류가 일어나는 이유는..

함수형 인터페이스를 만든 적이 없어서 즉! 람다 표현식을 쓰려면 함수형 인터페이스를 만들어야 한다!!

 

package lambda_ex;

// 람다식을 사용하기 위해서는
// 함수형 인터페이스가 먼저 만들어져 있어야 한다.
@FunctionalInterface
interface MathOperation {
	int operate(int x, int y);
}

public class MainTest {
	public static void main(String[] args) {

		// 핵심 !!
		// 함수형 인터페이스를 활용해서 내가 필요한 식을(람다 형태)을 직접 정의한다.
		// 식을 만들었다면 필요한 시점에 간결하게 호출해서 사용한다.
		
		// 식을 만들어 보자.
		MathOperation add = (int x, int y) -> {return x + y;}; 
		MathOperation subtract = (int x, int y) -> {return x - y;}; 
		MathOperation divide = (int x, int y) -> {return x / y;}; 
		MathOperation multiply = (int x, int y) -> {return x * y;}; 

		// 람다식을 호출하여 결과를 출력해 보자
		System.out.println("10 + 10 =  " + add.operate(10, 10));
		System.out.println("10 - 10 =  " + subtract.operate(10, 10));
		System.out.println("10 / 10 =  " + divide.operate(10, 10));
		System.out.println("10 * 10 =  " + multiply.operate(10, 10));
	}
}

실행 결과

 

식을 더 간결하게 쓸 수 있다! 단 어떤 경우에는 사용불가능 할 수도 있음.
	// 식을 만들어 보자.
		MathOperation add = (int x, int y) ->  x + y; 
		MathOperation subtract = (int x, int y) -> x - y; 
		MathOperation divide = (int x, int y) ->  {
			if(y == 0) {
				System.out.println(" Error : 어떤 수를 0으로 나눌 수 없음!! ");
				return 0;
			} else {
				return x / y;
			}
		}; 
		MathOperation multiply = (int x, int y) ->  x * y;

차이점 확인 !!

객체 지향 프로그래밍에서는 객체를 중심으로 코드를 작성하고, 그 객체 내의 메서드를 통해 동작을 정의합니다. 반면에 람다식은 함수형 프로그래밍 스타일을 반영하여 함수 자체를 간결하게 정의하고 사용합니다.

 

  • 객체 지향 프로그래밍은 상태와 동작을 함께 관리하고 구조적으로 코드를 작성하는 데 강점이 있습니다.
  • 람다식함수형 프로그래밍은 간단한 동작을 간결하게 표현하고, 함수 자체를 유연하게 재사용할 수 있습니다.

즉, 각 상황에 따라 장점이 다르므로, 어떤 작업을 수행하느냐에 따라 적합한 방식을 선택하는 것이 중요합니다.

'JAVA' 카테고리의 다른 글

레포지토리(Repository) & JpaRepository란?  (1) 2024.10.02
파싱이란 뭘까?(JSON 파싱 )  (0) 2024.06.07
JSON 파싱 연습  (0) 2024.06.07
(공부) 연결  (0) 2024.06.05
[JAVA] 네트워크 프로토콜  (0) 2024.05.24