<Lambda> 3. JAVA8 in Action - Chapter 3
by BFine반응형
JAVA8 in Action - part 1
Chapter 3 - 람다 표현식
3.1.1 람다란?
- 익명클래스처럼 이름없는 함수이면서 메서드를 인수로 전달할 수 있다.
- 람다표현식은 메서드로 전달할 수 있는 익명함수를 단순화 한 것이라 할 수 있다.
- 람다의 특징
- 익명, 간결
- 함수 : 람다는 메서드처럼 특정클래스에 종속 되지 않는다.(예외리스트 가능)
- 전달 : 람다표현식을 인수로 전달하거나 변수로 저장할 수 있다.
- 람다의 구성
- 파라미터, 화살표(->), 바디
3.2.1 함수형 인터페이스
- 위의 Predicate가 함수형 인터페이스라 할 수 있다.
- 함수형 인터페이스는 하나의 추상메서드 를 지정하는 인터페이스이다. (ex. Runnable, Comparator)
- 디폴트 메서드를 많이 가지고 있어도 추상메서드가 하나라면 함수형 인터페이스이다.
3.2.2 함수 디스크립터
- 람다 표현식의 시그니처를 서술하는 메서드를 함수디스크립터 라고 부른다.
- 시그니처는 파라미터, 반환값을 통칭한다.
3.3.1 람다 활용
- 설정 - 처리 - 정리로 처리과정이 이처럼 두과정의 형태를 갖는 형식이 실행 어라운드 패턴 이다.
- 함수형 인터페이스를 선언하고 원하는 메서드에 파라미터로 구현을 하면 간결한 코드를 작성할 수 있다.
3.4.1 함수형 인터페이스 사용
-
java.util.function 패키지에 여러가지 새로운 함수형 인터페이스를 추가했다.
- Predicate : T 객체를 받아 boolean으로 처리한다.
- Consumer : T 객체를 받아 void로 처리한다.
- Function : T 객체를 받아 R로 처리한다.
기본형을 참조형으로 변환하는 것을 박싱, 반대의 경우는 언박싱이라고 한다.
-
박싱값은 기본형을 감싸는 Wrapper이게 되고 힙에 저장된다.
박싱한 값은 메모리를 더 소비하고 기본형을 가져올때도 메모리를 탐색하는 과정이 필요하다.
JAVA8에서는 이런 오토박싱 문제를 해결하기 위한 기본형 인터페이스를 제공한다.
예외는 명시적으로 try-catch를 사용할 수 있다.
3.5.1 형식 검사
- 람다표현식 자체는 어떤 함수형 인터페이스를 구현하느지 정보가 포함되어 있지 않다.
- context를 이용해서 람다의 type을 추론할 수 있다.
- 람다의 표현형식을 target type이라고 부른다.
3.5.2 같은 람다 , 다른 함수형 인터페이스
- 같은 람다 표현식이더라도 호환되는 추상메서드를 가진 다른 함수형 인터페이스로 사용될 수 있다.
3.5.3 Type 추론
- 컴파일러는 함수 디스크립터를 통해서 람다의 시그니처를 추론할 수 있다.
- 파라미터 형식을 배제하거나 하지 않거나는 개발자 스스로에게 달려있다.
3.5.4 지역변수 사용
- 람다 표현식 안에서도 지역변수를 사용 할 수 있다. 이를 람다 캡처링 이라고 한다.
- 지역 변수의 조건은 한 번만 할당 할 수 있어야 한다. (final)
- 인스턴스 변수는 힙에 저장되고 지역변수는 스택에 위치한다
- 람다를 실행하는 스레드에서는 지역변수에 직접 접근하는 것이 아닌 복사본 을 제공받는다.
- 람다는 변수가 아닌 값에 국한되어 동작을 수행한다.
- 클로저 란 함수의 비지역 변수를 자유롭게 참조할 수 있는 함수의 인스턴스를 가르킨다.
- 클로저는 클로저 외부에 정의된 변수값에 접근하고 값을 바꿀 수 있다.
3.6.1 메서드 레퍼런스
- 메서드 레버런스를 이용하면 기존 메서드 정의를 재활용해서 람다처럼 전달할 수 있다. (System.out::print)
- 메서드 레퍼런스는 특정 메서드만을 호출하는 람다의 축약형 이라고 할 수 있다.
- 명시적으로 메서드명을 참조해서 가독성 을 높일 수 있다.
- 객체 자체를 레퍼런스 할수도 있다. (student::getName)
- 생성자 레퍼런스는 new 키워드를 이용한다.(Student::new)
3.8.1 Comparator의 메서드
- Comparator.
comparing
(Student::getAge) 이용해 비교값을 추출할 수 있다. - Comparator.comparing().
reversed
로 역정렬 할 수 있다. - Comparator.
thenComparing
으로 두번째비교 연산자를 만들 수 있다.
3.8.2 Predicate의 메서드
negate
(반전),and
(&&),or
(||) 세가지 메서드를 제공한다.
3.8.3 Function의 메서드
andThen
,compose
두가지 메서드를 제공한다.- andThen는 먼저 실행된 람다식의 결과를 가지고 람다식을 수행한다.(g(f(x)))
- compose는 나중에 정의된 람다식의 결과를 먼저 정의된 람다식의 인수로 사용한다.(f(g(x)))
출처
- Java8 in Action
반응형
'개발서적 > 자바8 인 액션' 카테고리의 다른 글
<Lambda> 6. JAVA8 in Action - Chapter 6 (0) | 2019.04.02 |
---|---|
<Lambda> 5. JAVA8 in Action - Chapter 5 (0) | 2019.04.01 |
<Lambda> 4. JAVA8 in Action - Chapter 4 (0) | 2019.04.01 |
<Lambda> 2. JAVA8 in Action - Chapter 2 (0) | 2019.03.26 |
<Lambda> 1. JAVA8 in Action - Chapter 1 (0) | 2019.03.25 |
블로그의 정보
57개월 BackEnd
BFine