람다식이란?
- 람다식은 함수형 프로그래밍 기법을 지원하는 자바의 문법 요소이다.
함수 - 기능 또는 동작을 정의한 일련의 명령모음
메서드 - 클래스 또는 인터페이스에 정의된 함수
- 객체 지향 프로그래밍에서는 함수는 항상 클래스 내부에 메서드로 존재해야 하고 메서드를 사용하기 위해서는 클래스의 객체를 먼저 생성한 후 메서드를 호출해야 한다.
- 이는 외부의 어떤 기능을 가진 함수를 정의하고, 이 함수를 호출함으로써 기능을 수행하는 본래의 함수형 프로그래밍과는 거리가 있다.
단 하나의 추상 메서드만을 포함하는 인터페이스를 함수형 인터페이스라고 하고, 이 함수형 인터페이스의 호출 및 기능을 구현하는 방법을 새로게 정의한 문법이 바로 "람다식" 이다.
"람다식"은 익명 이너 클래스의 축약된 형태
람다식 구현
- 구현된 추상 메서드를 람다식으로 표현할 때는 메서드명 이후의 소괄호와 중괄호만을 차례대로 포함하며, 이들 사이에는 람다식 기호인 화살표(->)가 들어간다.
- 이름없이 호출하기 때문에 추상 메서드가 2개 이상이라면 어떤 메서드를 구현한 것인지 구분할 수없어 구현이 되지 않는다.
(입력매개변수)->{
}
람다식의 약식표현 규칙
- 람다식은 익명 이너 클래스를 활용한
객체 생성 방법의 축약 형태이다.
- 중괄호안 실행문이 한개일시, 중괄호는 생략할 수 있다.
- 입력매개변수의 자료형은 생략할 수 있다.
- 메서드가 return 구문 하나만으로 이루어져 있을 때는 return을 생략할 수 있다.
- 입력변수가 한개일 때 입력변수 소괄호를 생략할 수 있다.
A a1 = (a) -> System.out.println(a);
A a2 = (a) -> a + b;
람다식 활용
- 람다식은 익명 이너 클래스 내부 구현 메서드의 약식 표현뿐만 아니라 메서드 참조와 생성자 참조에도 사용된다.
- 여기서 참조의 의미는 함수형 인터페이스의 메서드를 구현하는 데 있어 직접 구현하는 대신, 이미 있는 기능을 가져다 쓰겠다. 라는 뜻이다.
구현 메서드의 약식표현
- 함수형 인터페이스의 객체 생성 과정에서 익명 이너 클래스를 이용한 객체 생성 방식의 축약된 표현을 제공하는 것
- 익명 이너 클래스의 내부 구현 메서드를 단순히 축약해 표현한 형태
메서드 참조
- 추상 메서드를 직접 구현하는 대신, 이미 구현 완료된 메서드를 참조하는 것이다.
- 메서드를 참조하는 방식은
인스턴스 메서드 참조 와 정적 메서드 참조로 나누어 진다.
정의돼 있는 인스턴스 메서드 참조
A a = b::bcd
정의돼 있는 정적 메서드 참조
A a = B::bcd
첫 번째 매개변수로 전달된 객체의 인스턴스 메서드 참조
- 첫번째 매개변수로 인스턴스 메서드를 포함하고 있는 객체를 함께 전달하고, 이후 전달된 객체으 인스턴스 메서드를 참조할 때다.
- 객체변수를 추가로 받아와 객체변수로 메서드를 실행하므로, 참조 메서드보다 매개변수가 항상 1개더 많다.
- 클래스명 :: 인스턴스 메서드명
A a2 = String::length;
생성자 참조
- 생성자는 크게 배열 객체 생성자와 클래스 객체 생성자로 나뉜다.
배열 생성자 참조
- 함수형 인터페이스에 포함된 추상 메서드가 배열의 크기를 입력매개변수로 하며, 특정 배열 타입을 리턴한다면 구현 메서드의 내부에 반드시 new 자료형[]이 포함될 것이다.
- 이 때 인터페이스에 포함된 추상 메서드의 구현 메서드가 new 자료형[]과 같이 배열 객체의 생성 기능만을 수행할 때는 람다식의 배열 생성자 참조를 사용할 수 있다.
- 배열 타입 :: new
A a = int[]::new
클래스 생성자 참조
- 인터페이스의 추상 메서드가 클래스 타입의 객체를 리턴할 때도 배열과 마찬가지로 생성자 참조를 사용할 수 있다.
- 클래스명 :: new
A a = B::new