백엔드/JAVA_이론공부

JAVA_람다(람다식)

반 불혹 2022. 9. 28. 16:38

람다

람다는 메서드를 하나의 식으로 표현한 것이다.

메서드를 일일히 선언해서 만들지 않아도 간단한 수학식처럼 간결하고 명확하게 표현이 가능하다. 

람다식 만들기

두 수를 더하는 메서드가 있다고 하자

int sum(int num1, int num2) {
	return num1 + num2;
}

이 메서드를 일단 람다식으로 만들면 

(int num1, int num2) -> { // 반환타입과 메서드명 제거 + 화살표 추가
	return num1 + num2;
}

위와 같이 메서드 명이 없어지고, 화살표(중요, 얘 있어야 댐)가 추가되고, 중괄호 안에 동작 내용(실행문)이 적힌다.

여기서 반환값이 있는 메서드는 return과 세미콜론(;)을 생략 가능하다.

(int num1, int num2) -> {
	num1 + num2
}

여기서 또 중괄호 없애고, 바로 반환값을 줄 수 있다. (실행문이 하나만 있기 때문)

(int num1, int num2) -> num1 + num2

여기서 또또 매개변수 타입이 쉽게 유추되는 경우면 (사실, 숫자 두개를 단순히 더하는거니까) 매개변수 타입을 생략 가능하다.

(num1, num2) -> num1 + num2

뭔가 엄청 축약된 람다식 완성

 

함수형 인터페이스

자바에서 함수는 클래스 안에서 정의 되어야 하기 때문에 메서드 독립으로 있을 수 없다.

그렇기 때문에 클래스 객체를 생성 후 이객체로 메서드를 호출해야 한다. 

그래서, 람다식도 사실 객체이다. 

위에서 메서드 이름을 지운것도 볼 수 있는데, 이름이 없는 상태이기 때문에 이를 익명클래스 라고 한다.

코드 예시

public class LamdaExample1 {
    public static void main(String[] args) {
		   /* Object obj = new Object() {
            int sum(int num1, int num2) {
                return num1 + num1;
            }
        };
			*/ 
		ExampleFunction exampleFunction = (num1, num2) -> num1 + num2
		System.out.println(exampleFunction.sum(10,15))
}

@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는 지 확인할 수 있도록
interface ExampleFunction {
		public abstract int sum(int num1, int num2);
}

// 출력값
25

위의 코드에서 ExamplFunction 을 이용해서 객체를 만들고 그 안에 람다식을 넣엇다. 

그리고, 해당 객체에 sum메서드를 호출해서 10, 15를 넣은 것을 볼 수 있다. 
(기존의 인터페이스 문법을 활용하여 람다식을 다루는 것이다. )

이처럼 람다식과 인터페이스의 메서드가 1:1로 매칭되어 동작해야 한다.

 

매서드 래퍼런스

람다식으로 메서드를 호출 할 수 있다. 

만약, 두 개의 수 중 큰 수를 내놓는 메서드가 선언 되어 있다고 하면,

코드 예시

(left, right) -> Math.max(left, right);

위와 같이 작성이 가능하다.

이 경우, 입력값과 출력값의 반환타입을 쉽게 유추 할 수 있기 때문에 입력, 출력값을 적어주지 않아도 된다.

// 클래스이름::메서드이름

Math :: max; // 메서드 참조

고러면 이렇게 또 간단한 람다식이 생겨난다.

IntBinaryOperator 인터페이스는 두 개의 int 매개값을 받아 int 값을 리턴하므로, Math::max 메서드 참조를 대입할 수있다.

IntBinaryOperator operato = Math :: max; //메서드 참조

 

정적 메서드를 참조 할 때 

클래스 :: 메서드

인스턴스 메서드를 참조 할 때

참조 변수 :: 메서드

 

생성자 참조

메서드 참조는 생성자 참조도 포함된다. 

생성자 참조 = 객체생성

객체를 생성하고 반환하도록 구성된 람다식은 생성자 참조로 대체 가능하다.

코드 예시 

(a,b) -> {return new 클래스(a,b);};
//생성자 참조 문법

클래스 :: new

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

 

'백엔드 > JAVA_이론공부' 카테고리의 다른 글

JAVA_스레드  (0) 2022.09.28
JAVA_스트림, 파일입출력  (0) 2022.09.28
JAVA_애너테이션  (0) 2022.09.28
JAVA_제네릭  (0) 2022.09.28
JAVA_열거형  (0) 2022.09.28