람다표현식
메서드로 전달할 수 있는 익명함수를 단순화 한 것. 이름은 없지만 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외리스트를 가질 수 있다.
보통 메서드와 달리 이름이 없기때문에 구현해야할 코드의 걱정거리가 줄어든다. 특정 클래스에 종속되지 않기 때문에 함수라고 부른다. 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있으며 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다.
람다 문법
람다는 파라미터, 화살표, 바디 세 부분으로 이루어진다.
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
- 파라미터 : Comparator의 compare메서드 파라미터(사과 두 개)
- 화살표 : 람다의 파라미터 리스트와 바디를 구분
- 람다 바디 : 두 사과 무게를 비교한다. 람다의 반환값에 해당하는 표현식
람다 표현식에는 return이 함축되어있다.
(parameters) -> expression
(parameters) -> {statements;}
위와 같이 람다의 기본 문법을 사용할 수 있다.
람다 사용예제
함수형 인터페이스
오직 하나의 추상 메서드만 지정하는 인터페이스를 말한다.
(ex: Comparator, Runnable 등 )
디폴트 메서드를 포함할 수 있는데 많은 디폴트 메서드가 있더라도 추상메서드가 하나면 함수형 인터페이스이다.
람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있다.
전체 표현식을 함수형 인터페이스의 인스턴스로 취급할 수 있다.
람다에서는 final로 명시된 변수를 사용할 수 있다.
지역 변수는 사용이 불가능한데 그 이유는 인스턴스 변수는 힙에 저장되고 지역변수는 스택에 위치한다.
만약 람다에서 지역 변수에 접근할 수 있다면 람다가 스레드에서 실행될때 변수를 할당한 스레드가
사라져서 변수 할당이 해제되었는데도 람다를 실행하는 스레드에서는 해당 변수에 접근하려고 할 수 있다.
자바에서 변수에 접근을 허용하는 것이 아니라 자유 지역변수의 복사본을 제공하기 때문에 복사본의 값이 바뀌지 않아야 하므로 final이 붙어야 한다. (꼭 final이 아니어도 effectively final - 한 버남ㄴ 할당할 수 있는 지역 변수 )
다시 설명하자면
람다 표현식의 파라미터로 넘겨진 변수가 외부에서 정의된 변수를 자유변수라고 하는데,
람다 바디에서 자유변수를 참조하는 행위를 람다캡쳐링이라고 한다.
지역변수는 스택에 올라가고 인스턴스변수는 힙에 올라가는데,
람다를 호출한 쓰레드가 종료되고 람다를 사용중인 스레드가 살아있을 경우
없어진 변수를 참조하기 때문에 에러가 날 것 같은데 아니다.
람다에서 자유변수 값을 복사해서 쓰기 때문이다.
하지만 그렇게 사용할 경우 여러 스레드에서 같은 람다를 호출할 때
값의 동기화를 보장할 수 없다.
인스턴스 변수는 힙메모리에 올라가기 때문에 스레드간 공유해서 사용이 가능하다.
메서드 참조
메서드 참조는 특정 메서드만을 호출하는 람다의 축약형이다.
참고문헌
http://www.yes24.com/Product/Goods/77125987
'책리뷰 > 모던자바인액션' 카테고리의 다른 글
모던자바인액션 12강 Date, Calendar 날짜와 시간 API (0) | 2022.01.25 |
---|---|
모던자바인액션 11강 Optional (0) | 2022.01.24 |
컬렉션 API 개선 (0) | 2022.01.10 |
JAVA 병렬 스트림 사용시 고려할 점 (0) | 2022.01.08 |
자바 스트림 처리 (0) | 2022.01.03 |