[기초] 람다식 작성하기

jiaLEE·2022년 6월 26일
0

람다식이란?

기존의 메소드를 더 쉽게 표현한 것으로 반환타입과 이름을 지우고 '->' 를 넣는 형태로 이루어져 있다. 메소드의 이름이 없고 자바에서 메소드는 혼자 존재할 수 없기때문에 '익명객체'라고도 칭한다.

메소드와 함수는 동일하나, 클래스에 종속되어있으면 메소드, 종속되어있지 않으면 함수라고 칭한다. (자바에서는 항상 클래스에 종속되어있기에 메소드만 존재한다.)

// 기존의 함수
int max(int a, int b) {
	return a > b ? a : b;
}
// 람다식
(int a, int b) -> {
	return a > b ? a : b;
}

반환값이 있는 경우, return 과 ; 생략 가능하다.

// 람다식
(int a, int b) -> {
	return a > b ? a : b;
}
// 더 축약한 람다식
(int a, int b)  -> 	a > b ? a : b

매개변수가 추론 가능하면 생략도 가능하다.(거의 다 생략함)

// 더 더 축약한 람다식
(a, b) -> a > b ? a : b

주의사항

  • 매개변수가 하나인 경우, 괄호가 생략가능함.(타입이 없을시에만)
(a) -> a + a
(int a) -> a + a
a -> a + a	// 가능
int a -> a + a	//불가능, 타입이 있어서 ()로 묶어줘야 한다.
  • { } 안에 문장이 하나면 {} 생략가능하며 끝에 ; 붙이지 않는다.
(int i) -> {
	System.out.println(i);
}
(int i) -> System.out.println(i)

상단에서 익명함수가 아니라 객체라고 설명했는데
즉, 아래의 람다식 자체가 객체라는 뜻이다.

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

이 객체를 사용하기 위해 Object로 선언후 사용하게 되면 에러가 뜨고
이것을 해결하기 위해 함수형 인터페이스가 나왔다.

new Object(){ // 객체의 선언과 생성을 동시에(익명 클래스)
	(a, b) -> a> b ? a : b
    }
}

함수형 인터페이스란?

"단 하나"의 추상메소드만 선언된 인터페이스로
선언시 @FunctionalInterface 를 붙이면 에러를 잡아준다.

@FunctionalInterface //interface에러 잡아준다.
interface MyFunction {
    // 인터페이스의 모든 메서드는 public 이면서 abstract 이기 때문에 생략 가능
	public abstract int max(int a, int b);
}

위와 같이 함수형 인터페이스를 선언하면 아래와 같이 람다식을 사용할 수 있다.
이때 아래 2개의 코드는 동일 코드이다.

MyFunction f = new MyFunction() {
					public int max(int a, int b){
                    	return a > b? a:b;
                   		 }
                   };

int value = f.max(3,5);
@FunctionalInterface 
// 람다식(익명 객체)을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
MyFunction f= (a, b) -> a>b ? a:b; 
int value = f.max(3,5)

출처: [자바의 정석 - 기초편] ch14-1~4 람다식이란? 람다식 작성하기, 남궁성
[자바의 정석 - 기초편] ch14-5,6 함수형인터페이스, 남궁성

0개의 댓글