[인프런 워밍업 스터디1기] 3일차 진도표

[인프런 워밍업 스터디1기] 3일차 진도표

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

람다식에 대해 꼭 알아야 할 JAVA8과 람다의 영어원문이다

https://www.oracle.com/technical-resources/articles/java/architect-lambdas-part1.html

Java 8에는 이러한 코드 블록을 더 쉽게 작성할 수 있도록 설계된 몇 가지 새로운 언어 기능이 도입되었습니다. 핵심 기능은 람다 표현식 (구어적으로 클로저 (이유는 나중에 논의할 예정임) 이라고도 함 ) 또는 익명 메서드 입니다 .

[해당오라클 원문 발췌]

Lambda expressions. Funda-men-tally, a lambda expression is just a shorter way of writing an implementation of a method for later execution. Thus, while we used to define a Runnable as shown in Listing 2, which uses the anonymous inner class syntax and clearly suffers from a “vertical problem”

 

람다식의 도입으로 인해, 자바는 객체지향언어인 동시에 함수형 언어가 되는 계기가 되었다!

 

람다식 의미와 문법

특징
1. 메서드와 달리 이름이 없다.
2. 메서드와 달리 특정 클래스에 종속되지 않지만, 매개변수, 반환 타입, 본체를 가지며, 심지어 예외도 처리할 수 있다.
3. 메서드의 인수로 전달될 수도 있고 변수에 대입될 수 있다.
4. 익명 구현 객체와 달리 메서드의 핵심 부분만 포함한다.

람다식의 규칙

  • 선언부의 타입은 추론할 수 있으므로 타입을 생략해도 된다.

  • 매개변수가 하나 있다면 괄호를 생략해도 된다.

  • 실행문이 하나 있다면 중괄호와 세미콜론을 생략할 수 있다. 단, 실행문이 하나의 return문이면 return 키워드도 생략해야 한다.

Arrays.sort(strs, new Comparator <String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2) * -1;
    }
});
System.out.prinln(Arrays.toString(strs));

 람다식을 사용하여 간결한 코드로 작성한 예제

Arrays.sort(strs, (o1, o2) -> {return o1.compareTo(o2) * -1 });
System.out.println(Arrays.toString(strs));

너무 간단해진 람다식 사용으로 인한 코드의 간결성!

즉, 함수를 값으로 전달하는데, 어딘가에 구현하지 않고 그냥 간단하게 구현해서 넘기고 싶으면 람다식을 이용

람다식은 “함수 값”으로 평가되며, 한 번만 사용된다.

 

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

위에 오라클 공식문서에도 나오지만 익명클래스의 긴코드를 람다식으로 간결하게 사용가능하며 여기서 함수형 인터페이스 개념도 알아두어야 한다!

즉, 함수형 인터페이스의 특성으로 인해 익명클래스, 익명메소드의 뻔한 부분을 생략시킬 수 있게되고, 최종적으로 생략한 형태를 람다표현식이라고 부르게 되는 것이다.

 

  • 함수형 인터페이스

자바에서 모든 메서드는 클래스 내에 포함되어야 하는데, 람다식은 어떤 클래스냐고 진위를 묻는다면

지금까지 람다식이 메서드와 동등한 것처럼 설명해왔지만, 사실 람다식은 익명 클래스의 객체와 동등하다.

 

참조변수가 있어야 객체의 메서드를 호출 할 수 있으니까 일단 이 익명 객체의 주소를 f라는 참조변수에 저장해 보자.

타입 f = (int a, int b) -> a > b ? a : b; //참조 변수의 타입은 뭐로 해야할까?

참조형이기 때문에 클래스 또는 인터페이스가 가능하다. 람다식과 동등한 메서드가 정의되어 있어야함

그래야만 참조변수로 익명 객체(람다식)의 메서드를 호출

 

예를 들어 아래와 같이 max()라는 메서드가 정의된 MyFunction 인터페이스가 정의되어 있다고 가정하자.

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); //익명 객체의 메서드를 호출

가장 중요!

결국 코드를 깔끔하게 작성하기 위해 함수형 인터페이스가 필요했고, 함수형 인터페이스의 특성으로 인해 익명클래스와 익명메소드의 뻔한 코드를 삭제하고 람다표현식으로 깔끔하게 표현

댓글을 작성해보세요.