익명 객체와 람다식(lambda)
람다식 사용법 세 줄 요약
- 함수형 인터페이스를 생성하고,
- 해당 인터페이스의 참조 변수를 통해 추상 메소드를 호출하는 데이터 처리부(메소드)를 만들고,
- 해당 인터페이스의 추상 메소드에 선언된 매개변수(데이터)의 처리 방법을 기술한다.
익명 객체
이름이 없는 객체를 뜻하며 함수형 프로그래밍에 사용됩니다.
종류에는 1) 익명 자식 객체와 2) 익명 구현 객체가 있습니다.
함수형 프로그래밍
함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법입니다.
데이터 처리부는 처리 방법은 없고 단지 데이터만 존재하기 때문에 외부에서 제공된 함수에 의존적입니다.
→ 함수(A) 결과 = A
→ 함수(B) 결과 = B
→ 데이터 처리의 다형성
익명 자식 객체
클래스를 상속해서 익명 객체를 만드는 경우
→ Tire 클래스의 익명 자식 객체 new Tire() { ... }
익명 구현 객체
인터페이스를 구현해서 익명 객체를 만드는 경우
→ RemoteControl 인터페이스의 익명 구현 객체 new RemoteControl() { ... }
람다식이란?
람다식
자바에서 제공하는 함수형 프로그래밍을 위한 문법(Java8~)
데이터 처리부에 제공되는 함수 역할을 하는 매개변수를 가진 중괄호{ } 블럭
자바는 람다식을 익명 구현 객체로 변환합니다. 이 때 사용되는 인터페이스는 함수형 인터페이스여야 합니다.
함수형 인터페이스
인터페이스가 단 하나의 추상 메소드를 가질 때, 이를 함수형 인터페이스라고 합니다.
함수형 인터페이스임을 보장하기 위해 @FunctionalInterface 어노테이션이 사용됩니다.
→ 컴파일 과정에서 추상 메소드가 하나인지 검사합니다.
람다식의 종류
매개변수가 없는 람다식
실행문이 하나만 있는 경우 중괄호{ }를 생략할 수 있습니다.
매개변수가 있는 람다식
매개변수 선언 시 구체적인 타입 대신에 var로도 사용할 수 있으나 생략하는 것이 일반적입니다.
매개변수가 하나만 있는 경우 괄호( )를 생략할 수 있습니다. 이 때 타입은 붙일 수 없습니다.
리턴값이 있는 람다식
return 문이 하나만 있는 경우 중괄호{ }와 함께 return 키워드를 생략할 수 있습니다.
리턴값은 연산식 또는 메소드 호출로 대체할 수 있습니다.
메소드 참조
매개변수의 정보 및 리턴 타입을 메소드를 참조해서 알아내는 것으로 매개변수를 생략할 수 있습니다.
예를 들어 Math 클래스의 정적 메소드인 max()의 경우 Math :: max와 같이 사용할 수 있습니다.
1) 정적 메소드와 인스턴스 메소드 참조
2) 매개변수의 메소드 참조
매개변수 a의 메소드 인자로 매개변수 b를 넘겨줄 수 있습니다.
String 매개변수 a, b의 사전순 비교를 위해 String 클래스의 compareIgnoreCase() 메소드를 호출하는 예시입니다.