[Java] 14장 - 람다식

N’oublie pas de t’aimer·2025년 1월 6일

Java

목록 보기
6/18

람다식

  • 함수(메서드)를 간단한 식으로 표현하는 방법

기존

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

(a, b) -> a > b ? a : b

로 나타낼 수 있다.

  • 익명 함수
int max(int a, int b) {
	return a > b ? a : b;
}

대신

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

cf) 함수와 메서드의 차이
근본적으로 동일하지만 함수는 일반적 용어, 메서드는 객체지향 개념 용어이다.
함수는 클래스에 독립적이고, 메서드는 클래스에 종속적이다.
다만 자바에서는 함수가 클래스 밖에 있을 수 밖에 없으므로 메소드밖에 존재하지 않는다.

람다식 작성하기

  • 메서드의 이름과 반환타입을 제거하고 ->를 블록 앞에 추가한다.
  • 반환값이 있는 경우, 식이나 값만 적고 return문은 생략 가능하다. 또한 ;도 붙이지 않는다.
  • 매개변수의 타입이 추론 가능하면 생략가능하다. (대부분의 경우 생략 가능)

따라서

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

(a, b) -> a > b ? a : b

로 나타낼 수 있다.

람다식 작성 시 주의 사항

  • 매개변수가 하나인 경우, 괄호 생략 가능. 단, 타입이 없을 때만 가능하다.

  • 블록 안의 문장이 하나 뿐일 때 괄호 생략 가능. 또한 ;도 붙이지 않는다.

  • 하나뿐인 문장이 return 문이면 괄호를 생략할 수 없다.

람다식의 예

익명 객체

자바에서는 메서드만 따로 존재할 수 없기 때문에 람다식은 익명 함수가 아니라 익명 객체이다.

(a, b) -> a > b ? a : b

는 사실

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

와 같다.

익명 객체: 객체의 선언과 생성을 동시에 한다.
람다식은 객체이므로 람다식을 다루기 위한 참조변수가 필요하다.

Object obj = (a,b) -> a > b ? a : b; // 람다식
Object obj = new Object() {
	int max(int a, int b) {
    	return a > b ? a : b;
    }
};

그러나

int value = obj.max(3, 5);

위 문장을 호출 시 에러가 발생한다. Object 클래스(리모컨 역할)에는 max()가 없기 때문이다.

이를 해결하기 위해 필요한 것이 함수형 인터페이스이다.

함수형 인터페이스

  • 함수형 인터페이스는 단 하나의 추상메서드만 선언된 인터페이스이다.
@FunctionalInterface
interface MyFunction {
	public abstract int max(int a, int b);
}
MyFunction f = new MyFunction() {
				public int max(int a, int b) {
                	return a > b ? a : b;
                }
              };
int value = f.max(3,5); // OK. MyFunction에 max()가 있기 때문
  • 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있다.
    단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 한다.
MyFunction f = (a,b) -> a > b ? a : b;
int value = f.max(3,5); // 실제로는 람다식이 호출됨.

함수형 인터페이스 예시

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list, new Comparator<String>() {
						public int compare(String s1, String s2) {
                        	return s2.compareTo(s1);
                        )
                      });

interface Comparator<T> {
	int compare(T o1, T o2);
}
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

로 대체할 수 있다.

함수형 인터페이스 타입의 매개변수, 반환타입

void aMethod(MyFunction f) {
	f.myMethod(); // MyFuction에 정의된 메서드 호출
}

즉 매개변수로 함수형 인터페이스 타입을 받는 것은 매개변수로 람다식을 받는 것과 같다.

MyFunction f = () -> System.out.println("myMethod()");
aMethod(f);

혹은

aMethod(() -> System.out.println("myMethod()"));

으로 호출할 수 있다.

MyFunction myMethod() {
	MyFunction f = () -> {};
    return f;
}

=

MyFunction myMethod() {
	return () -> {};
}
profile
매일 1퍼센트씩 나아지기 ୧(﹒︠ ̫ ̫̊ ̫﹒︡)୨

0개의 댓글