20220930(금)
- 목차
- 람다식 기본 문법
- 타겟 타입과 함수적 인터페이스
- 클래스 멤버와 로컬 변수 사용
- 표준 API의 함수적 인터페이스
< 람다식 기본 문법>
- 람다식?
- 자바 8부터 함수적 프로그래밍 위해 람다식 지원 // 자바8 = jdk1.8 같은의미!
- 기존에 존재하던 람다식을 가져다 쓴 것임!! 👍 - 람다식 수용 이유
- 코드가 매우 간결해짐
- 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해 쉽게 집계
스레드의 익명구현객체 (일회성으로 코드작업) | 일반적인 클래스 설계 및 객체생성구문 |
Runnable runnable = new Runnable() { public void run() {....} }; |
class Test implements Runnable { public void run() {...} } Test obj = Test(); |
클래스 없이 일회성으로 만든 익명구현객체. run메소드 코드를 다른 쪽에서 쓸 수 없다. |
명시적 클래스 설계하고 객체 생성 |
⬇⬇ |
|
람다식 구문. = 익명함수(메소드명이 사라졌기 때문) | |
(위 주황색 부분 ➡ 아래 빨간색 부분으로 줄임) Runnable runnable = () -> {...}; 람다식 문법이란,, 함수(메소드) (매개변수...) -> { } |
|
어떤 인터페이스를 구현할지는 대입되는 인터페이스에 달려있음 단, 인터페이스에서 추상메소드는 반드시 1개만 사용가능. |
- 자바는 람다식을 함수적 인터페이스의 익명 구현 객체로 취급(내부적으론 익명 구현 객체가 만들어짐)
람다식 ➡ 매개변수를 가진 코드 블록 ➡ 익명 구현 객체 - 익명구현객체 ➡ 람다식으로 바꾸기
✨함수적 스타일의 람다식 작성법 ➡ 메소드를 바라보고 만든다!
- 타입 추론 : 매개 타입은 런타임시에 대입값 따라 자동인식되어 생략 가능 / Student 타입 생략가능
ex) function.apply(student) ➡ ((Student t) ➡ t.getName(); = t ➡ t.getName();
- 매개변수 괄호() 의자라고 생각!
: (int a) -> {System.out.println(a);}
: 매개 타입은 런타임시에 대입값 따라 자동 인식 ➡ 생략 가능
: 하나의 매개변수만 있다면 괄호() 생략 가능, but 매개변수 없다면 괄호 () 생략 불가
: 하나의 실행문만 있다면 중괄호{} 생략 가능
: 중괄호 안에 return만 있을 경우, 생략 가능
< 타겟 타입과 함수적 인터페이스 >
- 타겟 타입(target type)
- 람다식이 대입되는 인터페이스
- 인터페이스 변수 = 람다식;
(1) 함수적 인터페이스 @FunctionalInterface
: 두 개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능
(2) 매개 변수와 리턴값이 없는 람다식
: Method()가 매개 변수를 가지지 않는 경우
: MyFunctionalInterface fi = () -> {...}
(3) 매개변수가 있는 람다식
: MyFunctionalInterface fi = (x) -> {...} 또는 x -> {...}
(4) 리턴값이 있는 람다식
: MyFunctionalInterface fi = (x, y) -> {...; return 값;}
< 표준 API의 함수적 인터페이스 >
- 강제적 규칙제공 : 전체 메소드가 통일을 갖기 때문에 관리가 쉬워짐
✨ 대표적 함수적 인터페이스 5개 암기! (JDK에서 제공하는)
함수적 인터페이스 |
매개값 | 리턴값 | 설명 | |
Consumer | 소비자 | O | X | accept 쓰고 나서 버린다. 가져오지 않아! (변수) |
Supplier | 공급자 | X | O | get / getAs 실행 후 호출한 곳으로 데이터를 리턴 |
Function | 함수 | O | O | apply 주로 매개값을 리턴값으로 매핑(타입 변환) (매개변수) |
Operator | 연산 | O | O | applyAs 주로 매개값을 연산하고 결과를 리턴 |
Predicate | 조건 | O | boolean | boolean test 매개값을 조사해서 true/false를 리턴 |