자바로 프로젝트를 하면서 또 코테 문제를 풀면서 람다식은 자바의 엄청난 무기라는 것을 느꼈습니다. 그래서 이것이 자바다라는 책을 보면서 람다식을 공부한 내용을 정리해 봤습니다.
https://product.kyobobook.co.kr/detail/S000061695652
함수형 프로그래밍이란? 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법을 말합니다!! 데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공된 함수에 의존합니다.
함수는 함수의 입력값으로 데이터를 넣고 함수에 정의된 내용을 실행합니다. 그래서 동일한 데이터도 들어가는 함수에 따라 결괏값이 달라질 수 있습니다. 이 특성을 데이터 처리의 다형성이라고 부릅니다!!
이 부분을 쉽게 처리하기 위해 자바 8부터 람다식을 지원합니다.
람다식이란?
- 자바의 람다식은 자바 8부터 도입된 기능으로, 함수형 프로그래밍을 지원하기 위한 표현 방식입니다. 람다식은 익명 함수(Anonymous Function)를 생성하기 위한 간결한 구문을 제공하여 코드의 가독성과 유연성을 높여줍니다.
- 람다식은 메서드로 전달되거나 변수에 저장될 수 있는 코드 블록입니다. 일반적으로 람다식은 함수형 인터페이스(Functional Interface)를 구현하기 위해 사용됩니다. 함수형 인터페이스는 단 하나의 추상 메서드만을 가지는 인터페이스를 말하며, 람다식은 이 추상 메서드의 구현을 제공합니다.
람다식 : (매개변수, ...) -> {처리 내용}
람다식 변환
자바는 람다식을 익명 구현 객체로 변환합니다. 익명 구현 객체는 이름이 없는 인터페이스 구현 객체입니다.
public interface Calculable {
//추상 메소드
void calculate(int x, int y);
}
//익명 구현 객체
new Calculable() {
@Override
public void calculate(int x, int y) { 처리 내용 }
};
//람다식
(x, y) -> { 처리 내용 };
람다식은 인터페이스의 익명 구현 객체이므로 인터페이스 타입의 매개변수에 대입될 수 있다.
public void action(Calculable calculable) {
int x = 10;
int y = 4;
calculable.calculate(x,y); //데이터를 제공하고 추상 메소드를 호출
}
//람다식으로 action 호출
action( (x,y) -> {
int result = x + y;
System.out.println(result);
});
람다식의 종류
public interface Runnable {
void run();
}
//람다식
( ) -> { ... }
@FunctionalInterface
public interface Calculable {
void calculate(int x, int y);
}
//람다식
( x, y ) -> { ... }
- 람다식은 하나의 추상 메서드를 가지고 있어야 한다.
- 인터페이스가 함수형 인터페이스임을 보장하기 위해서는 @FunctionalInterface 어노테이션을 붙이면 됩니다.
- 위 어노테이션을 붙이는 것은 선택사항이지만, 컴파일 과정에서 추상 메서드가 하나인지 검사하기 때문에 정확한 함수형 인터페이스를 작성할 수 있게 도와줍니다.
매개변수 없는 람다식
함수형 인터페이스의 추상 메소드에 매개변수가 없을 경우 람다식은 다음과 같이 작성할 수 있습니다. 실행문이 2개 이상인 경우 중괄호를 생략할 수 없고, 하나일 경우는 생략할 수 있습니다.
( ) -> { ( ) -> 실행문
실행문;
실행문;
}
매개변수가 있는 람다식
함수형 인터페이스의 추상 메소드에 매개변수가 있을 경우 람다식은 다음과 같이 작성할 수 있습니다.
매개변수를 작성할 때 타입을 생략할 수 있습니다. 또는 var를 사용합니다.
// 타입 지정
(타입 매개변수, ... ) -> { (타입 매개변수, ... ) -> 실행문
실행문;
실행문;
}
// var로 지정
(var 매개변수, ... ) -> { (var 매개변수, ... ) -> 실행문
실행문;
실행문;
}
// 타입 지정 없이
(매개변수, ... ) -> { (매개변수, ...) -> 실행문
실행문;
실행문;
}
//매개변수가 하나
매개변수 -> { 매개변수 -> 실행문
실행문;
실행문;
}
리턴값이 있는 람다식
함수형 인터페이스의 추상 메소드에 리턴값이 있을 경우 람다식은 다음과 같이 작성될 수 있습니다.
return 문 하나만 있을 경우에는 중괄호와 함께 return을 생략할 수 있습니다. 리턴값은 연산식 또는 리턴값있는 메서드 호출로 대체할 수 있습니다.
(매개변수, ... ) -> { (매개변수, ...) -> return 값(생략가능)
실행문; (매개변수, ...) -> 값
return 값;
}
// actions((x,y) -> (x+y));
메서드 참조
메서드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거하는 것을 목적으로 한다.
(left, right) -> Math.max(left, right);
Math::max
위를 아래꺼로 대체 가능하다.
- 정적 메서드와 인스턴스 메서드 참조
- 정적 메서드를 참조할 경우에는 클래스 이름 뒤에 :: 기호를 붙이고 정적 메서드 이름을 기술한다. (클래스 :: 메서드)
- 인스턴스 메서드일 경우에는 먼저 객체를 생성한 다음 참조 변수 뒤에 :: 기호를 붙이고 인스턴스 메서드 이름을 기술한다. (참조변수 :: 메서드)
매개변수의 메소드 참조
(a, b) -> { a.instanceMethod(b); }
a 매개변수의 메소드를 호출해서 b 매개변수 매개값을 사용하는 경우가 존재한다.
이것을 메소드 참조로 표현하면 a의 클래스 이름 뒤에 :: 기호를 붙이면 된다.
클래스 :: instanceMethod
작성 방법은 정적 메소드 찾조와 동일하지만, a의 인스턴스 메소드가 사용된다는 점이 다르다.
생성자 참조
생성자를 참조한다는 것은 객체를 생성하는 것을 의미한다. 람다식이 단순히 객체를 생성하고 리턴하도록 구성된다면 람다식을 생성자 참조로 대치할 수 있다.
(a, b) -> { return new 클래스(a, b); }
클래스 :: new
'JAVA 공부' 카테고리의 다른 글
JVM, JRE, JDK에 대해서 (0) | 2023.08.03 |
---|---|
스트림이란? (1) (1) | 2023.07.11 |
자바의 컬렉션 프레임워크(Map) (1) | 2023.01.10 |
자바의 컬렉션 프레임워크(Set) (0) | 2023.01.10 |
자바의 컬렉션 프레임워크(List) (0) | 2023.01.09 |