본문 바로가기

TIL

[Java]람다식(Lambda Expression)

728x90

함수형 프로그래밍 기업을 지원하는 자바의 문법요소이다

람다식은 메서드를 하나의 '식(expression)으로 표현한 것으로 , 코드를 매우 간결하면서 명확하게 표현 할 수있다는 장점이 있다

객체지향적 언어의 특성을 가진 자바의 특성에 따라 일반적인 함수가 아니라 익명의 객체이기 때문에 기본 자바의 문법 요소를 해치지 않으면서 함수형 프록래밍 기법을 사용할 수 있는 장치가 필요하다 이에따라 함수형 인터페이스가 만들어졌다.

 

학습 목표

  • 람다식이 무엇이고, 어떻게 사용할 수 있는 지 이해할 수 있다.

람다식에서는 기본적으로 반환타입과 이름을 생략할 수 있다. 즉 익명함수라고 부르기도한다

메서드 바디에 실행문이 하나만 존재할 때 중괄호를 생략할수있고, 매개변수 타입을 쉽게 유추할 수 있는 경우에는 매개변수의 타입을 생략할 수 있다.

  • 함수형 인터페이스를 통해 람다를 다루는 방법을 이해하고 설명할 수 있다.

람다식 또한 객체이다 더 정확히는 이름이 없기 때문에 익명 클래스라 할 수 있다.

익명 클래스란 객체의 선언과 생성을 동시에 하여 오직 하나의 객체를 생성하고, 단 한번만 사용되는 일회용 클래스이다

익명 객체를 생성하여 참조변수에 담아준다하더라도 메서드를 사용할 수 있는 방법이 없다. 이같은 문제를 해결하기 위해 사용하는 자바의 문법 요소가 함수형 인터페이스(Functional Interface)이다. 기존의 인터페이스 문법을 활용하여 람다식을 다루는 것. 이것이 가능한 이유는 람다식도 결국 하나의 객체이기 때문에 인터페이스에 정의된 추상메서드를 구현할 수 있기 때문이다.

함수형 인터페이스에는 단 하나의 추상 메서드만 선언될 수 있는데 이것은 람다식과 인터페이스의 메서드가 1:1로 매칭되어야하기 때문이다.

매개변수와 리턴값이 없는 람다식

 매개변수와 리턴값이 없는 추상 메서드를 가진 함수형 인터페이스가 있으면 이 인터페이스를 타겟 타입으로 갖는 람다식은 매개변수가 없다 그 이유는 accept()가 매개변수를 가지지 않기 때문이다.

람다식이 대입된 인터페이스의 참조변수는 accept()를 호출할 수 있다. accept()의 호출은 람다식의 중괄호{}를 실행시킨다.

 

public class MyFunctionalInterfaceExample {
	public static void main(String[] args) throws Exception {
		MyFunctionalInterface example;
		example = () -> {
			String str = "첫 번째 메서드 호출!";
			System.out.println(str);
		};
		example.accept();

		example = () -> System.out.println("두 번째 메서드 호출!");
		//실행문이 하나라면 중괄호 { }는 생략 가능
		example.accept();
	}
}

// 출력값
첫 번째 메서드 호출!
두 번째 메서드 호출!

매개변수가 있는 람다식

매개변수가 있고 리턴값이 없는 추상메서드를 가진 함수형 인터페이스

람다식이 대입된 인터페이스 참조 변수는 accept()를 호출 할 수 있다.

 

리턴값이 있는 람다식

매개변수와 리턴값을 가지는 추상메서드를 포함한 함수형 인터페이스

이 인터페이스를 타겟 타입으로 갖는 람다식이 매개변수가 두개인 이유는 accept()가 매개변수를 두개 가지기 때문이다.

또한 accept()가 리턴타입이 있기 때문에 중괄호{}에는 return문이 있어야함

 

자바에서 기본적으로 제공하는 함수형 메서드

자바에서는 빈번하게 사용되는 함수형 인터페이스를 기본적으로 제공하고있다. 기본적으로 내장된 함수형 인터페이스를 사용하여 매번 가은 기능을 수행하는 함수형 인터페이스를 직접 만드는 번거로움을 줄여주는 것이다.

 

  • 람다식을 메서드 참조 방식으로 변환할 수 있다.

메서드 참조는 람다식에서 불필요한 매개변수를 제거할 때 주로 사용한다

즉 람다식으로 더욱 간단해진 익명 객체를 더욱더 간단하게 사용하고싶은 개발자의 니즈가 반영된거다.

람다식은 단순히 두개의 값을 메서드의 매개 값으로 전달하는 역할만 하기 때문에 다소 불편하다 이경우 입력값과 출력값의 반환타입을 쉽게 유추 할 수 있기 때문에 입력값과 출력밧을 일일이 적어주는게 크게 중요하지 않다.

메서드 참조도 람다식과 마찬가지로 인터페이스의 익명 구현 객체로 생성되므로 인터페이스의 추상 메서드가 어떤 매개 변수를 가지고, 리턴 타입이 무엇인가에 따라 달라진다. 

메서드 참조는 정적 혹은 인스턴스 메서드를 참조할 수 있고 생성자 참조도 가능하다.

정적메서드와 인스턴스 메서드 참조

정적 메서드를 참조할 경우에는 클래스 이름 뒤에 ::기호를 붙이고 정적 메서드 이름을 기술하면된다.

클래스 ::메서드

인스턴스 메서드의 경우 먼저 객체를 생성한 다음 참조변수 뒤에 :: 기호를 붙이고 인스턴스 메서드 이름을 기술하면 된다.

참조 변수 :: 메서드

생성자가 오버로딩 되어 여러 개가 있을 경우 컴파일러는 함수형 인터페이스의 추상 메서드와 동일한 매개 변수 타입과 개수를 가지고 있는 생성자를 찾아 실행한다.

 

728x90

'TIL' 카테고리의 다른 글

[Java]추상화(Abstraction)  (0) 2022.09.16
[Java]스트림(Stream)  (0) 2022.09.15
[Java]애너테이션(Annotation)  (0) 2022.09.15
[Java] 다형성(Polymorphism)  (0) 2022.09.14
[네트워크][HTTP]에러코드  (0) 2022.09.14