자바의 정석 - 람다와 스트림 (1)

송용준·2023년 5월 31일

람다식(Lambda Expression)

  • 함수(메서드)를 간단한 '식'으로 표현하는 방법
  • 익명 함수
    반환타입, 이름을 지우고 화살표 (->)
  • 함수와 메서드의 차이
    근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향개념 용어
    함수는 클래스에 독립적, 메서드는 클래스에 종속적

람다식 작성하기

  1. 메서드의 이름과 반환타입을 제거하고, '->'를 블록{ } 앞에 추가한다.

  2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에 ';'안 붙임)

  3. 매개변수의 타입이 추론 가능하면 생략가능(대부분의 경우 생략 가능)

람다식 작성하기 - 주의사항

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

  2. 블록안의 문장이 하나뿐 일 때, 괄호{ } 생략 가능(끝에 ';' 안 붙힘)

람다식의 예

람다식은 익명 함수? 익명 객체!

  • 람다식은 익명함수가 아니라 익명 객체이다.
  • 람다식(익명 객체)을 다루기 위한 참조변수가 필요. 참조변수의 타입은?
Object obj = new Object(){
	int max(int a, int b) {
    	return a > b > a : b
    }
}

obj = (a, b) -> a > b ? a : b		// obj : 참조변수

int value = obj.max(3,5);	// 에러. Object클래스에 max()가 없음
class Java {
	public static void main(String[] args)  {
// 		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);				// 함수형 인터페이스
	}
}

함수형 인터페이스

  • 함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스
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. MyFunctino에 max()가 있음
  • 함수형 인터페이스의 타입의 참조변수로 람다식을 참조할 수 있음
    (단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 함)
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3,5);		// 실제로는 람다식(익명함수)이 호출됨

함수형 인터페이스 - example

  • 익명 객체를 람다식으로 대체

  • 함수형 인터페이스 타입의 매개변수
void aMethod(MyFunction f) {
	f.myMethod();		// MyFunction에 정의된 메서드 호출
}

@FunctionalInterface
interface MyFunction(){
	void myMethod();
}

MyFunction f = () -> System.out.println("myMethod()");	// 이 함수 두줄을
aMethod(f);

aMethod(() -> Systme.out.println("myMethod()"));	// 이렇게 한줄로 변환
  • 함수형 인터페이스 타입의 반한타입
MyFunction myMethod() { 	// 이 함수를
	MyFunction f = () -> { };
    return f;
}

MyFunction myMethod() {	// 이렇게 줄일 수 있음
	return () -> { };
}

( ) -> ~~~ : 람다식

profile
용용

0개의 댓글