GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

Lambda 식 ( ) -> { };

Backcoder 2022. 7. 7. 22:51

< Lambda 식 >

사용조건
1. 인터페이스 일때만 가능하고
2. 인터페이스에 메소드가 하나만 있을때 가능하다.

람다식은 포켓몬 진화 완전체 같은거다.

( 기본 인터페이스 사용 ) - 이상해씨
interface A{
void m1( ); }
class B implements A {
void m1( ){ 오버라이딩 }
+다른 메소드, 생성자,변수 추가 가능 }
main
A a1 = new A () ;
a1.m1( );

-다른 메소드등을 추가해서 사용해야할 땐, 기본 방법을 써야한다.

( 익명 객체 사용 인터페이스 ) - 이상해풀
main
A a1 = new A( ){
public void m1( ) { 오버라이딩 } };

a1.m1( );

- 익명객체는 다른 메소드 생성자 변수 추가 불가능 하다.
즉, 익명 객체는 다른거 추가할일 없이, 메소드 하나만 쓸 때 사용이 적절하다.
=> 1개 메소드만 포함한 인터페이스
: < functional interface > 라 한다.
=> 이때의 상황을 특화시켜서 더 간단하게 만든게 람다식이다.



< Lambda 식 > - ( 이상해꽃 )
- 인터페이스의 메소드를 바로 구현하기

interface A { void m1(int i) ; }
=> 이런 인터페이스가 있다. 이거 메소드 하나다. functional interface 다.
=> 익명객체로 해도되지만, 더 간단하게 람다식으로 해도되겠다.

main

A a = (int i) -> { 오버라이딩 };

A - 인터페이스 타입 선언 - A 에들어있는 데이터 내용이다
a - 익명객체 이름
(int i) - 매개변수 그대로 가져옴
-> - 이 매개변수가 들어오면
{ 오버라이딩 } - 이렇게 실행 하겠다.

interface B{ void m2(String s); }
=람다=>
B b = (String s) -> { sout( s ); };
b.m2( "스트링") ;

Interface C { int m3(int x, int y) }
=람다=>
C c = (int x, int y) -> { return x + y ; };
c.m3( 2, 3 ) ;

=> 이렇게 functional interface 는 람다식을 통해 한줄로 정의가 가능해졌다.

어짜피 간단하게 할 거 최대한 간단하게 만들기 위해 생략할 거리들을 많이 만들어뒀다.

- 모든 매개변수에 type 생략 가능 ( 어짜피 메소드 하나라 자동으로 인식한다. )

I3 i32 = (x, y) -> {System.out.println(x*y);};

- 매개변수 하나일때 ( ) 괄호 생략 가능

I2 i24 = x -> {System.out.println(x);};

- 실행문장 한 문장일 때는 { } 생략 가능

I2 i24 = x -> System.out.println(x);

- 리턴타입 문장 하나만 있을 때는 return 키워드랑 { } 세트로 생략 가능

I4 i4 = (a, b) -> { return a+b;};

I4 i5 = (a,b) -> a+b;


< @FunctionalInterface 어노테이션 >
처음엔 interface 에 메소드 하나만 있어서 람다식 잘됬는데
누가 interface 건들이면서 메소드 추가해버림
=> 람다식에 문제생김! 안돌아감!! => 막아놓아야 겠다

@FunctionalInterface
어노테이션 해주면
: 여기엔 한개의 메소드만 선언할 수 있어요!
다른 메소드 추가 못하도록 막아준다.





( 사실 한 문장으로 줄였으면 그것만으로도 충분히 줄였다고 생각한다.
너무 줄이고 생략해도, 다른 사람이 읽을 때는 오히려 가독성이 역으로 떨어질 수 도 있다고 생각한다.
람다식이면 람다식이라고 ( ) ->{ } 기본적인 표현은 해주는것이 오히려 가독성을 높여줄 수 있지 않을까? )