반응형

[질문]

  • 자바의 람다식은 왜 등장했을까?
  • 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?


1. 자바의 람다식은 왜 등장했을까?

함수형 언어

람다식의 도입으로 인해 자바는 객체지향언어인 동시에 함수형 언어가 된다.

객체 지향언어에서는 주로 메서드를 사용하게되는데 메서드는 특정 객체에 종속되어야하지만

람다식을 통해서 메서드가 하나의 독립적인 기능을 할수있게되어 함수라는 용어를 사용한다.

 

익명함수

메서드의 이름과 반환값이 없어지므로 람다식을 익명 함수라고도 한다.

int[] arr = new int[5];
Arrays.setAll(arr , (i) -> (int)(Math.random() * 5) + 1);

// (i) -> (int)(Math.random() * 5) + 1; // 메서드로 변경
int method(){
	return (int) (Math.random() * 5) + 1
}

기존의 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야하고

객체도 생성해야만 메서드를 호출할수가있었다.

람다식은 오직 람다식 자체만으로 이 메서드의 역할을 대신할수가 있다

 

2. 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?

람다식은 익명 클래스의 객체와 동등하다.

 

(int a, int b) -> a > b ? a : b;

// 두개는 동일하다.

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

 

더 구체적인 예시는 

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;
    }
}
int big = f.max(5, 3); // 익명 객체의 메서드를 호출

//람다식으로 대체

MyFunction f = (int a, int b) -> a> b? a : b; // 익명객체를 람다식으로 ㅂ대체
int big = f.max(5, 3); // 익명 객체의 메서드를 호출

 

익명객체를 람다식으로 대체가 가능한 이유는 람다식도 실제로는 익명 객체이고

MyFunction인터페이스를 구현한 익명 객체의 메서드 max( )

람다식의 매개변수의 타입과 개수 반환값이 일치하기 때문이다.

 

 

반응형

+ Recent posts