개발언어/JAVA

JAVA 람다와 스트림 - 람다식(Lambda Expression)

Surge100 2023. 12. 15. 14:30

람다식(Lambda Expression)

자바는 원래 객체 지향(OOP)언어이지만 JDK1.8 부터는 함수형 언어의 기능을 추가했다. 따라서 자바8부터는 OOP언어이 동시에  함수형언어 라고 할 수 있다. 하지만 완전히 함수형 언어도 겸비한다고 하기에는 무리가 있고 함수형 언어의 기능을 포함했다고 보는 편이 더 정확하다.

 

익명 클래스(anonymous class)

이름이 없는 일회용 클래스. 정의 생성을 동시에 한다.

 

 

익명 클래스의 객체 인스턴스 생성 

new Object(){
	// 클래스 정의부
}

 

class Example{
	
    //익명 클래스
    Object iv = new Object(){ void method(){} };
    //익명 클래스
    static Object cv = new Object(){ void method(){} };
    
    void myMethod(){
    	//익명 클래스
    	Object lv = new Object(){ void method(){} };
    }
    
}

위 코드는 익명 클래스 이기 때문에 compile하고 나면 이름 이 숫자로 붙는다. 그리고 내부 클래스이기 때문에 외부 클래스 이름인 Example이 따라온다.

 

 

람다식 작성하기 - 규칙

 

▶ 함수(메서드)를 간단한 `식(exxpression)`으로 표현하는 방법

// 매서드 표현
int max(int a, int b){
    return a > b ? a : b;
}

//람다식 표현
(a, b) -> a > b ? a : b

 

 

▶함수와 메서드의 차이

  • 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향 개념 용어 
  • 함수는 클래스에 독립적, 메서드는 클래스에 종속적 

 

람다식 작성하기 - 주의사항

1. 매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)

 

 

2. 블록 안의 문장이 하나뿐 일 때, 괄호{} 생략 가능(끝에 `;` 안 붙임)

 

 

람다식은 익명 함수? 익명 객체!

람다식은 익명 함수가 아니라 익명 객체이다. 왜냐하면 자바에서는 메서드만 독립적으로 존재할 수 없다. 

 

// 람다식
(a, b) -> a > b ? a : b

//익명객체 
new Object(){
	int max(int a, int b){
    	return a > b ? a : b;
    }
}

 

위 코드의 첫번 째 줄 같은 람다식이 있을때, 밑에 온 코드와 동일 하다  new Object()로 시작하는 아래의 코드는 익명 클래스에 의해 만들어진 익명 객체 인스터스이다.  즉 객체의 선언생성을 동시에 하는 것이다.

 

아래의 코드를 위의 람다식과 같이 간단하게 쓸수 있도록 하는 것으로 람다식 자체가 익명 객체라고 할 수 있다.  따라서 익명 객체인 람다식을 사용하기 위해서는 이것을 다루기 위함 참조변수가 필요하다. 그렇다면 그 참조 변수의 타입을 무엇을로 해야할까?

 

⭐익명 객체의 메서드

Object obj = new Object(){
	int max(int a, int b){
    	return a > b ? a : b;
    }
};

 

익명 객체의 조상 클래스로 Object를 사용했으므로 참조타입은 Object를 사용하면 된다. 

 

Object 타입의 익명 객체 인스터스 

익명 객체는 max라는 메서드를 가지고 있지만 Object 타입은 는 max()를 가지고 있지 않으므로 해당 메소드를 사용할 수 없다. 그래서 `obj`라는 객체 인스턴스는 max()를 가지고 있지만 Object 타입이 가지고 있지 않기 때문에 호출 할 수 없다.

그래서 필요한 것이 함수형 인터페이스이다

 

정리

원래 익명 객체가 있을 때 그 익명 객체의 메서드 부분을 표현한 것이 람다 식이다.  사실은 메서드만 있으면 되는데 JAVA 언어의 규칙 상 메서드만 존재할 수 없기 때문에 익명 객체 안에 넣어서 표현을 해야 한다. 따라서 람다식은  익명 객체 인스턴스이기도 하다.

 

 

[출처 - 자바의 정석 - 기초편 , 저 남궁성]

https://www.youtube.com/watch?v=0Sp9eFRV8gE