읽은 책 정리/자바의정석 3판

[Java] Chapter14 람다와 스트림

포포015 2021. 3. 30. 17:46

1. 람다식

자바가 등장한이후로 큰변화가 두번있었는데, 첫번째는 JDK 1.5부터 추가된 지네릭스와,

                                                           두번째는 JDK 1.8부터 추가된 람다식의 등장이다

자바는 람다식의 도입으로 객체지향적언어 + 함수형 언어가 되었다.

 

1.1 람다식이란?

간단히 말해서 메서들르 하나의 식'(expression)'으로 표현한것이다.

함수를 간략하면서, 명확한 식으로 표현할수 있게 해준다.

메서드를 람다식으로 표현하면, 메서드의 이름과 반환값이 없어지므로 람다식을 '익명함수'라고도 한다

 

*메서드와 함수의 차이

-둘다 개념은 동일하나, 메서드는 특정 클래스에 반드시 속해야한다는 제약이 있고 함수는 아님

 

1.2 람다식 작성하기

'익명함수'답게 메서드에서 이름과,반환타입을 제거하고 매개변수선언부와 몸통{ } 사이에 ' -> '를 추가

1) 반환값이 있는 메서드의 경우, return문 대신 '식(expression)'으로 대체가능.

    (식의 결과가 자동반환. 대표적으로 3항연산자가 있다. 세미콜론 X)

1
2
3
4
5
6
int max(int a, int b){
    return a > b ? a : b;
 
------------------람다식
(a,b) -> a > b ? a : b
cs

2) 매개변수의 타입은 추론이 가능한경우 생략가능( 대부분생략가능하다.)

1
2
3
4
5
6
void printVar(String name, int i){
    System.out.println(name + "=" + i);
}
 
----------람다식
(name,i) -> {System.out.println(name +"="+i);}
cs

3) 선언된 매개변수가 하나뿐인경우 괄호 생략가능

1
2
3
4
5
6
7
int square(int x){
    return x * x;
}
 
 
--------람다식
x -> x * x
cs

4) 마찬가지로 괄호 { } 안에 문장이 하나일때 괄호 생략가능 ( 세미콜론 X)

1
2
3
4
5
6
int roll(){
    return (int) (Math.random() * 6 );
}
 
-------람다식
() -> (int)(Math.random() * 6)
cs

5) 그러나, 괄호안에 문장이 return문일경우 생략불가.

1
2
3
4
5
6
7
8
9
10
11
12
int sumArr(int[] arr){
    int sum = 0;
    for(int i : arr) sum += i;
    return sum;
}
 
-------람다식
(int[] arr) -> {
    int sum = 0;
    for(int i : arr) sum += i;
    return sum;
}
cs

 

1.3 함수형인터페이스( Function InterFace)

- 참조변수가 있어야 객체의 메서드를 호출할수 있다.( 여기서 궁금한점은 참조변수의 타입을 뭘로할까?)

 참조형이니, 클래스 또는 인터페이스가 가능하다 (* 람다식과 동등한 메서드가 정의되어있어야함)

 참조타입은, 인터페이스를 통해 람다식을 다루기도함 (이걸 함수형 인터페이스라고한다.)

 함수형 인터페이스 안에는 오직 하나의 추상메서드만 정의되어 있어야한다.( 그래야 람다와 메서드 1:1매칭)

 @FunctionInterFace를 붙이면, 컴파일러가 함수형 인터페이스를 잘 정의했는지 확인해준다.

 

 

 

람다와 스트림은 필요할떄 공부해서 다시 정리를 해놓겠다.