람다식

InOut·2023년 5월 16일
post-thumbnail

람다식이란

  • JDK1.8부터 함수형 언어의 기능을 추가시킴
  • 함수(메서드)를 간단한 식(expression)으로 표현하는방법
  • 익명 함수(이름이 없는 함수, anonymous function)
ex)
int max(int a, int b) {
	return a > b ? a : b;
}

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

함수와 메서드의 차이

  • 근본적으로는 동일하지만 함수는 일반적용어, 메서드는 객체지향개념 용어
  • 함수는 클래스에 독립적, 메서드는 클래스에 종속적
  • 자바에는메서드밖에 없지만(클래스에 종속) 함수형 언어의 기능이 있기 때문에 자바에서 함수라고 하면 메서드라고 이해하면 된다.

사용법

  1. 메서드의 이름과 반환타입을 제거하고 '->'를 블록 {} 앞에 추가
int max(int a, int b) {
	return a > b ? a : b;
}
-------->
(int a, int b) -> {
	return a > b ? a : b;
}
  1. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에 ';' 안 붙임)
(int a, int b) -> {
	return a > b ? a : b;
}
--------->
(int a, int b) -> a > b ? a : b
  1. 매개변수의 타입이 추론 가능하면 생략가능(대부분의 경우 생략가능)
(int a, int b) -> a > b ? a : b
--------->
(a, b) -> a > b ? a : b

람다식 작성할 때 주의사항

  1. 매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)
	(a) -> a * a      -->    a -> a * a 	//OK
(int a) -> a * a	  -->	int a -> a * a // 에러
  1. 블록 안의 문장이 하나뿐 일 때, 괄호 {} 생략 가능(끝에 ';' 안 붙임)
(int i) -> {
	System.out.println(i)
}

------>
(int i) -> System.out.println(i)

단, 하나뿐인 문장이 return문이면 괄호 {} 생략 불가


람다식은 익명 함수가 아니라 익명 객체

  • 위에서는 익명 함수라 했지만 자바는 메서드만 따로 존재할 수 없다.
  • 자바에서는 익명함수가 아니라 익명 객체이다.
(a, b) -> a > b ? a : b

== 	둘은 같다.

new Object() {
	int max(int a, int b) {
    	return a > b ? a : b;
    }
}
  • 객체의 선언과 생성을 동시에 함.
  • 람다식(익명 객체)을 다루기 위한 참조변수가 필요.
Object obj = new Object() {
	int max(int a, int b) {
    	return a > b ? a : b;
    }
};


--
Object obj = (a, b) -> 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); //	실제로는 람다식(익명 함수)이 호출 됨

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

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

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

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

--> 더 짧게 가능
aMethod( () -> System.out.println("myMethod()") );

함수형 인터페이스 타입의 반환타입

MyFunction myMethod() {	// 이 메서드는 람다식을 반환한다는 뜻
	MyFunction f = () -> {};
    return f;
}

--> 더 짧게 가능
MyFunction myMethod() {
	return () -> {};
}
profile
개발새발

0개의 댓글