[인프런 워밍업 클럽 0기] BE 3일차 과제

[인프런 워밍업 클럽 0기] BE 3일차 과제

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

 

자바는 람다식 함수형 프로그램밍이 사용한 이유는 불필요한 코드를 줄이고, 가독성을 높이기 위해서다 .

그리고 함수 만드는 과정없이 한번에 처리 할 수 있기 때문에 생산성이 높아진다.

병령 프로그램밍에 용이하다.

 

람다식과 익명 클래스는 어떤 관계가 있을까?

 

함수형 프로그래밍이란 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법이다.
데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공져 있지 않아 외부에서 제공된 함수에 의존한다.
데이터 처리부는 제공된 함수의 입력값으로 데이터를 넣어 함수에 정의된 처리 내용을 실행하고, 동일한 데이터라도 함수 A를 제공한 결과 값과 함수 B를 제공하여 처리된 결과 값은 다를 수 있다 이것이 함수형 프로그램의 특징인 데이터 처이의 다형성이다.

람다식은 함수를 하나의 식으로 표현하여 익명 함수를 반환한다.

익명 클래스는 선언된 클래스 내에서만 한 번만사용될 경우 별도로 변수에 담을 필요가 없다.

람다식을 쓰면 함수형 인터페이스로 인스턴스를 만들 수 있으며 코드를 줄 일 수 있다.

메서드 매개변수와 리턴 타입, ㅌ변수로 만들어 사용도 가능하다.

 

람다식의 문법은 어떻게 될까?

 

데이터 처리부에 제공되는 함수 역활 하는 매개변수를 가진 중괄호 블록이다.

{매개변수, ...} -> {처리 내용}; 

 

인터페이스가 단 하나의 추상 메소드를 가질 경우 이를 함수형 인터페이스라고 한다.

public interface Runnable {
    void run();
}

람다식

() -> { ...};

 

@FunctionalInterface
public interface Calculable {
    void calculate(int x, int y);
}

람다식

(x, y ) -> { ...}

@FunctionalInterface 어노테이션을 사용한 이유는 인터페이스가 함수형 인터페이스를 보장하기 위해서다.

붙이는 것은 선택사항이지만, 컴파일 과정에서 추상 메소드가 하나인 검사하기 때문에 정확한 함수형 인터페이스를 작성하게 도와주는 역활을 해준다.

 

매개변수가 없는 람다식

실행문이 하나일 경우 중괄호를 생략 가능하고 두개 이상일 경우는 생략할 수 없다.

() -> 실행문; 
() -> {
    실행문;
    실행문;
}

 

매개변수가 있는 람다식

매개변수를 선언할 때 타입은 생략할 수 있고, 구체적인 타입 대신에 var를 사용할 수 있다.

(타입, 매변수, ... ) -> {
     실행문;
     실행문;
}
(타입, 매변수, ... ) -> 실행문;
(var 매개변수, ...) -> {
    실행문;
    실행문;
}
(var 매개변수, ...) -> 실행문;
(매개변수, ...) -> {
    실행문;
    실행문;
}
(매개변수, ...) ->실행문;
매개변수 -> {
    실행문;
    실행문
};
매개변수 -> 실행문;

 

리턴값이 있는 람다식

return 문 하나만 있는 경우에는 중괄호와 함께 return 키워드를 생략가능하다.

(매개변수, ...) -> {
    실행문;
    return 값
)
(매개변수, ...) -> 값

 

메소드 참조

메소드를 참조하여 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거한다.

 

(left, right) -> Math.max(left, right);

Math.max() 메소드의 매개값은 전달하는 역활만 하기 때문에 다음과 같이 생략이 가능하다.

Math :: max;

정적 메소드를 참조할 경우에는 클래스 이름 뒤에 :: 기호를 붙이고 메소드 이름을 기술한다.

클래스 :: 메서드
참조변수 :: 메소드

 

매개변수의 메소드 참조

(a, b) -> {a.instaceMethod(b);}

메소드 참조는 a 클래스 이름 뒤에 :: 기호를 붙이고 매소드 이름을 기술한다.

작성 방법은 메소드 참조와 동일하지만, a의 인스턴스 메소드가 사용된다는 점이 다르다.

클래스 :: instaceMethod

 

Reference

이것은 자바다(책)

댓글을 작성해보세요.