람다식

구교석·2024년 4월 1일
post-thumbnail

람다식이란?

람다식이란 쉽게 말해 메서드를 하나의 식으로 표현한 것입니다.
하나의 식으로 표현하여 훨씬 간략하게 표현이 가능하게 되며, 메서드의 이름과 반환값이 없어지므로 익명함수라고도 합니다.
람다식은 오직 람다식 자체만으로도 메서드이 역할을 대신할 수 있으며, 메서드의 매개변수로 전달되어지는 것도 가능하고, 메서드이 결과로 반환될 수도 있습니다.
즉, 람다식으로 메서드를 변수처럼 다루는 것이 가능한 것 입니다.

람다식 작성 방법

예를 들어서 두 값 중 큰 값을 반환하는 메서드 max를 람다식으로 변환한다면, 아래와 같습니다.

  1. 반환 값이 있는 메서드의 경우, return문을 생략하고 식으로 대신합니다.
  2. 그리고 이 식의 끝에 세미콜론 ' ; '을 붙이지 않습니다.
  3. 람다식에 선언된 매개변수의 타입 또한 생략이 가능합니다.

주의점
지금처럼 선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략 할수 있지만
a -> System.out.pritnln(a); (o)
매개변수의 타입을 생략하지 않은 경우는 괄호()를 생략할 수 없다.
int a -> System.out.pritnln(a); (x)
만약 매개 변수가 없다면 람다식에서 매개 변수가 자리가 없어지므로 다음과 같이 빈 괄호()를 반드시 사용해야 한다. ( ) -> { 실행문; }
괄호 {} 안의 문장이 하나일 때만 괄호{}를 생략할 수 있고 문장의 끝에 ; (세미콜론)을 붙이지 않아야 한다.

이 익명 객체를 다룰 수 있는 인터페이스가 필요한데 Object 타입으로 하기에는 람다 기능을 Object 클래스에 넣어야하는 부담이 생긴다. 그래서 람다식을 저장할 수 있는 참조변수는 '함수형 인터페이스(Functional Interface)' 타입이어야 한다.

🤔 함수형 인터페이스(Functional Interface) 란 무엇인가?
이것은 하나의 추상 메서드만을 갖는 인터페이스(Interface)이다.

그래야지 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다!!

이 추상 메서드의 매개변수의 개수와 타입, 리턴타입과 동일한 람다식을 할당해서 사용할 수 있다.

(함수형 인터페이스의 Static 메서드와 Default 메서드의 개수에는 제약이 없다)

람다식 구현

자바로 구현

// MyFunction 인터페이스가 있을때,
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;
                    }
			};
// 익명 객체를 람다식으로 대체
// MyFunction f = (int a, int b) ->a > b ? a : b;
// 익명 객체의 메서드를 호출
int big = f.max(5, 3);	

@FunctionalInterface 어노테이션을 붙이게 되면 컴파일 타임에 실수를 방지할 수 있습니다.

@FunctionalInterface
interface MyFunction{
	void run();	// public abstract void run();
}

class LambdaEx1 {
	static void execute(MyFunction f) {	// 매개변수의 타입이 MyFunction인 메서드
    	f.run();
    }
		
    static MyFunction getMyFunction() {	// 반환 타입이 MyFunction인 메서드
    	MyFunction f = () -> System.out.println("f3.run()");
    	return f;
    }
    
    public static void main(String[] args){
    	// 람다식으로 MyFunction의 run()을 구현
        MyFunction f1 = ()-> System.out.println("f1.run()");
    
    	MyFunction f2 = new MyFunction() {	// 익명클래스로 run()을 구현
        	public void run() {	// public을 반드시 붙여야 함
            	System.out.println("f2.run()");
            }
    	};
        
        MyFunction f3 = getMyFunction();
        
        f1.run();
        f2.run();
        f3.run();
        
        execute(f1);
        execute( ()-> System.out.println("run()") );
    }
}

코틀린으로 구현

// kotlin
class Person(
	val name: String,
	val age: Int
)

val billGates = Person("Bill Gates", 12)
val markZuckerberg = Person("Mark Zuckerberg", 15)
val elonMusk = Person("Elon Musk", 4)

val maxAge = listOf(billGates, markZuckerberg, elonMusk).maxOf { person -> person.age }

println(maxAge) -- 15

참고 사이트


[Java] 람다식이란?
[Java/자바] 람다식(Lambda)이란? 그리고 사용법
Kotlin 람다 파헤치기

profile
끊임없이 노력하는 개발자

0개의 댓글