본문 바로가기
Back-End/Java

람다

by 달의 조각 2022. 7. 16.

 

람다식

 

함수(메서드)를 하나의 식으로 표현한 것으로, 람다식 도입으로 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 반환 타입과 이름이 지워지면서 익명 함수(이름이 없는 함수)라고 말한다.

 

장점

1. 코드 간결
2. 컬렉션 요소 필터링과 매핑 → 원하는 결과 쉽게 집계
3. 클래스와 객체 생성 없이 메서드 호출 가능
4. 메서드를 변수처럼 다룰 수 있다

 

형태

1. 익명 객체: 메서드에서 이름과 반환타입을 제거
2. 매개변수 선언부와 몸통 사이에 -> 추가  (매개변수) -> {실행 코드}
3. 런타임에 익명 구현 객체 생성

int max(int a, int b) {
	return a > b ? a : b;
}

(a, b) -> a > b ? a : b
//매개변수가 한 개이고 매개변수 타입이 없으면 () 생략 가능
a -> a * a
(int a) -> a * a

//매개변수가 2개 이상이고, 리턴문만 존재할 때 return 생략 가능, {}는 생략 불가
(num1, num2) -> {num1 + num2}

 

 

 

함수형 인터페이스

 

 

단 하나의 추상 메서드만 선언된, 람다식을 다루기 위한 인터페이스

1. 람다식 = 익명 클래스의 객체(객체의 선언과 생성을 동시에)
    ❓ 람다식(객체)를 다룰 참조변수 타입은?
    → Object? Object(리모컨)는 클래스 내 정의한 메서드를 정의하고 있지 않다
    💡 함수형 인터페이스로 다룬다!

2. 오직 하나의 추상 메서드만 정의되어 있어야 한다 - 그래야 람다식과 인터페이스의 메서드가 1:1 연결됨

@FunctionalInteface //함수형 인터페이스를 올바르게 정의했는지 검사
interface MyFunction {
	public abstract int max(int a, int b);
}

//-------------------------------------------------------------------

MyFunction f = new Function() {
		public int max(int a, int b) { //오버라이딩 - 접근 제어자는 좁게 못 바꾼다
			return a > b ? a : b;
		}
	};

 

3. 함수형 인터페이스 타입의 참조변수로 람다식을 참조한다! (매개변수 개수, 반환타입 일치해야 함)

MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5); //람다식(익명 함수) 호출됨

 

java.util.function 패키지

자주 사용되는 함수형 인터페이스

java.lang.Runnable 매개변수 X, 반환값 X
Supplier<T> 매개변수 X, 반환값 O
Consummer<T> 매개변수 O, 반환값 X
Function<T, R> 매개변수 1개, 반환값 O : 일반적인 함수
Predicate<T> 매개변수 1개, 반환값 boolean : 조건식 표현
BiConsumer<T, U> 매개변수 2개, 반환값 X
BiPredicate<T, U> 매개변수 2개, 반환값 boolean : 조건식
BiFunction<T, U, R> 매개변수 2개(T,U), 반환값 1개(R)
UnaryOperator<T> Function 자손 : 단항
매개변수 타입 = 반환값 타입
BinaryOperator<T> BiFunction 자손 : 이항
매개변수 타입 = 반환값 타입

 

 

 

메서드 참조

 

 

하나의 메서드만 호출하는 람다식 → 메서드 참조로 더 간단하게!

ClassName::method
Integer method(String s) {
	return Integer.parseInt(s);
}

//-------------------------------------------------------------------

Function<String, Integer> f = (String s) -> Integer.parseInt(s);

//-------------------------------------------------------------------

Function<String, Integer> f = Integer::parseInt;
//생성자
Function<Integer, MyClass> f = (i) -> new MyClass(i); //람다식
Function<Integer, MyClass) f2 = MyClass::new; //메서드 참조

'Back-End > Java' 카테고리의 다른 글

파일 입출력(I/O)  (0) 2022.07.18
스트림  (0) 2022.07.17
배열 문제 풀이  (0) 2022.07.06
조건문과 반복문 문제 풀이  (0) 2022.07.05
지네릭스, 열거형, 애너테이션  (0) 2022.02.21

댓글