SlideShare a Scribd company logo
1 of 16
Download to read offline
JAVA Lambda
작성자 : 홍효상
이메일 : hyomee@naver.com
소스 : https://github.com/hyomee/JAVA_EDU
프로그램은 사람이 이해하는 코드를 작성.
느려도 꾸준하면 경기에서 이긴다.
Content
소스 : https://github.com/hyomee/JAVABASIC
16. Lambda
1. 익명(Anonymous) Class
2. Lambda
3. 함수형 인터페이스
4. 타입 추론
1. 익명(Anonymous) Class
16. Lambda
• 프로그램에서일시적으로한번만사용되고버려지는객체를매번객체를만들어야하나?
• 확장성을고려해서객체를생성해야하는데…수정이편할까?
• 사용처:인스턴스변수,인스턴스메서드,인스턴스메소드의매개변수
“ 이름을 알 수 없는 객체로 한번만 사용하고 버려지는 객체”
16-1. 익명(Anonymous) Class
사용하는 이유
• 클래스생성
• 인터페이스의구현
구현 하는 방법
01. 클래스생성
➢ 1.추상클래스생성 예제 : AnonymousAbstract.java
예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous
➢ 2. 추상클래스 구현 Class 생성
예제 : AnonymousAbstarctClass.java - 인스턴스 변수
익명(Anonymous) Class
• 클래스를정의하지않고필요할때이름없이즉시선언하고인스턴스화해서사용
• 객체안에만드는로컬클래스와동일하다
• new수식이올수있는곳어디든지사용가능하나생성자는정의할수없음
• 익명클래스내부에서외부의메소드내변수를참조할때는메소드의지역변수중
final로선언된변수만참조가능
-변수는Stack에있고객체는Heap에있음,즉Method실행이끝나고Stack는사라지지만
Heap에있는Method는사라지지않기때문
1. 익명(Anonymous) Class
16. Lambda
16-1. 익명(Anonymous) Class
예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous
➢ 2.추상클래스 구현 Class 생성
예제 : AnonymousAbstarctClass.java - 인스턴스 Method
예제 : AnonymousAbstarctClass.java - 인스턴스 메서드의 파라메터
➢ 3. 실행
➢ 2. 추상클래스 구현 Class 생성
예제 : AnonymousMain.java
파라메터로 객체 생성 하여 파라메터로 전달
예제 : AnonymousChild .java 참조
1. 익명(Anonymous) Class
16. Lambda
16-1. 익명(Anonymous) Class
02. 인터페이스의구현
➢ 1. 인터페이스구현
예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous
예제 : AnonymousInterface.java
➢ 2. 인터페이스구현체
예제 : AnonymousInterfaceClass.java
➢ 3. 실행
익명 객체 생성
람다 생성
1. Lambda
16. Lambda
• 자바8이전에는Method라는함수형태가존재하지만객체를통해서만접근이가능하고,Method그자체를변수로사용하지는못한다.
• 자바8에서는함수를변수처럼사용할수있기때문에,파라미터로다른메소드의인자로전달할수있고,리턴값으로함수를받을수도있다.
• 이름없는익명함수구현에서주로사용하며함수형인터페이스의인스턴스(구현객체)를표현
:함수형인터페이스(추상메소드가하나인인터페이스)를구현객체를람다식으로표현
“ 자바에서 함수형 프로그램 방식으로 구현 해 주는 문법”
16-2. Lambda
람다 ( Lambda )
JAVA에서 함수형 프로그램
➢ 함수
• 함수정의 ->구현 ->사용
void fun() {
…
}
fun()
➢ JAVA
• 함수는없음
• Class, Interface 의Method
class C {
void method() {
…..
}
}
C c = new C();
c.method();
➢ JAVA Lambda
익명 멤버 변수로 구현 방법 적용
• 하나의추상메서드만있는interface 생성-.>익명 Class (멤버변수)작성->Lambda로변경
Interface Example {
R apply(A arg);
}
01. 인터페이스
Example exp = new Example() {
@Override
public R apply(A arg) {
body
}
};
02. 인스턴스생성
Example exp = (arg) {
body
};
03. 인자목록과함수몸통
을제외하고모두제거
Example exp = (arg) - >{
body
} ;
04. 문법적용
1. Lambda
16. Lambda
“ 자바에서 함수형 프로그램 방식으로 구현 해 주는 문법”
16-2. Lambda
표현식
• (arg1, arg2...) -> { body }
• (params) -> expression
• (params) -> statement
• (params) -> { statements }
• (int a, int b) -> { return a + b; };
> 타입 추론에 의한 타입 제거
: (a, b) -> { return a+b } ;
> 무엇인가를 반환 하거나 한 줄 표현식이 가능 하면 return 삭
제
: (a, b) -> a+b;
• () -> System.out.println("Hello ");
> 파라미터없고 Hello 출력 System.out::println;
• () -> System.out.println("Hello "); // 파라미터 없고 Hello 출력
• (String s) -> { System.out.println(s); } // String s입력매개변수로 받아 출력
• () -> 8514790 //파라미터없고 8514790가 리턴
• () -> { return 3.14 }; //파라미터없고 3.14리턴
1. Lambda
16. Lambda
16-2. Lambda
추상 메서드를 이용한 람다
class C {
void method() {
…..
}
}
C c = new C();
c.method();
interface 익명 이너 클래스 함수 실헹
리턴 : 없음
매개 : 있음
interface IfNoRnNoArg {
void method();
}
IfNoRnNoArg iNrNa = new IfNoRnNoArg() {
void method () {
…
}
};
IfNoRnNoArg iNrNa = ( ) - > { … }; iNrNa.method();
리턴 : 없음
매개 : 있음
interface IfNoRnArg {
void method(int a);
}
IfNoRnArg iNra = new IfNoRnArg() {
void method( int a ) {
…
}
};
IfNoRnArg iNra = (int a) -> {
…
}
iNra.method(1);
리턴 : 없음
매개 : 있음
interface IfRnNoArg {
int method();
}
IfRnNoArg irNa = new IfRnNoArg () {
int method() {
int a = 0
…
return a
}
};
IfRnNoArg irNa = () -> {
int a = 10;
return a;
};
irNa.method();
리턴 : 없음
매개 : 있음
interface IfRnArg {
int method(int a, int b);
}
IfRnArg ira = new IfRnNoArg () {
int method(int a, int b) {
return a + b;
}
};
IfRnArg ira = (a, b) -> {
return a + b;
};
ira.method(5, 10)
배열
interface IfArray {
int [] method(int length)
}
IfRnArg ira = new IfArray () {
int method(int length) {
return new int[length];
}
};
IfRnArg ira = (length) -> {
return new int[length];
};
or
IfRnArg ira = int[] :: new;
int [] a1 = ira.
ira.method(10);
예제 : LambdaFunctional.java
1. Lambda
16. Lambda
16-2. Lambda
추상 메서드를 이용한 람다
예제 : LambdaFunctional.java
1. Lambda
16. Lambda
16-2. Lambda
존재 하는 객체 람다 표현
예제 : ExistsClassLamda.java
01. 객체생성
람다로 객체 생성 방법
람다 선언 방법 : 클래스객체 :: 인스턴스메서드명
1. Lambda
16. Lambda
16-2. Lambda
존재 하는 객체 람다 표현
예제 : ExistsClassLamda.java
02. 기존 객체의메서드실행
클래스의 기존 함수 지정
람다 선언 방법 : 클래스객체 :: 인스턴스메서드명
클래스의 기존 함수 선택
클래스의 기존 함수 선택
람다로 Class 생성
1. Lambda
16. Lambda
16-2. Lambda
존재 하는 객체 람다 표현
예제 : ExistsClassLamda.java
03. Static 메서드실행 람다 선언 방법 : 클래스객체 :: 정적메서드명
04. 첫번째 매개변수로 전달된 매개변수를 사용 함
객체를 메소드 내부로 보냈으므로 메서드 내부에서 생성
할 필요 없음
1. 함수형 인터페이스
16. Lambda
16-3. 함수형 인터페이스
함수형 인터페이스
• 추상Method가하나뿐인인터페이스(Single Abstract Method:SAM)
• 여러개의Default Method가있을수있다.
• @FunctionalInterface 어노테이션은함수형인터페이스이다
• Runnable, ActionListener, Comparable은함수형인터페이스
:자바8이전:익명클래스이용
:자바8이후:람다식이용
java.util.function 에서 제공 하는 함수형 인터페이스
• Predicate: 하나의매개변수를주는boolean형을 반환
• Consumer:하나의매개변수를주는void형accept 메소드
• Function: T유형의인수를취하고R유형의결과를반환하는추상메소드apply
• Supplier: 메소드인자는없고T유형의결과를반환하는추상메소드get
• UnaryOperator:하나의인자와리턴타입을가진다. T->T
• BinaryOperator:두개의인수,동일한타입의결과를반환하는추상메서드apply
01. 가장기본이되는함수형인터페이스
02. 파라메터가두개인함수형인터페이스
03. 파라메터를받고동일한타입을리턴하는함수형인터페이스
04. 기본형타입의함수형인퍼페이스
1. 함수형 인터페이스
16. Lambda
16-3. 함수형 인터페이스
(3 +3) * 2
10 > 5 and 10 < 6
10 > 5 or 10 < 6
1. 함수형 인터페이스
16. Lambda
16-3. 함수형 인터페이스
05. Stream과같이사용하는함수형인터페이스
1. 타입 추론
16. Lambda
16-3. 타입 추론
타입 추론
• 자바컴파일러는람다표현식이사용된컨텍스트(대상형식)를이용해서람다표현식과관련된함수형인터페이스를추론한다.
• 즉,대상형식을이용해서함수디스크립터를알수있으므로컴파일러는람다의시그니처도추론할수있다.
• 결과적으로컴파일러는람다표현식의파라미터형식에접근할수있으므로람다문법에서이를생략할수있다.
• 즉,자바컴파일러는다음처럼람다파라미터형식을추론할수있다.
• 여러파라미터를포함하는람다표현식에서는코드가독성향상이더두드러진다.
interface IfRnArg {
int method(int a, int b);
}
IfRnArg ira = new IfRnNoArg () {
int method(int a, int b)
{
return a + b;
}
};
IfRnArg ira = (int a, int b) -> {
return a + b;
};
IfRnArg ira = (a, b) -> {
return a + b;
};

More Related Content

What's hot

0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.Young-Beom Rhee
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js functionYoung-Beom Rhee
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)Yongha Yoo
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)MIN SEOK KOO
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOSEunjoo Im
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰Sungchul Park
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 

What's hot (17)

JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
3-1. css
3-1. css3-1. css
3-1. css
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 

Similar to Java lambda

SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expressionSejong Park
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda기현 황
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream성 남궁
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
자바 8
자바 8자바 8
자바 8신 한
 
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020 AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020 AWSKRUG - AWS한국사용자모임
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식TonyCms
 
Clojure/Chapter3
Clojure/Chapter3Clojure/Chapter3
Clojure/Chapter3destinycs
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍준혁 이
 

Similar to Java lambda (20)

SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expression
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
자바 8
자바 8자바 8
자바 8
 
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020 AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
Clojure/Chapter3
Clojure/Chapter3Clojure/Chapter3
Clojure/Chapter3
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 

More from Hyosang Hong

MSA_기초자료.pdf
MSA_기초자료.pdfMSA_기초자료.pdf
MSA_기초자료.pdfHyosang Hong
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Hyosang Hong
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Hyosang Hong
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 

More from Hyosang Hong (18)

MSA_기초자료.pdf
MSA_기초자료.pdfMSA_기초자료.pdf
MSA_기초자료.pdf
 
Java 연산자
Java 연산자Java 연산자
Java 연산자
 
Java generic
Java genericJava generic
Java generic
 
Java 제어
Java 제어Java 제어
Java 제어
 
Java collection
Java collectionJava collection
Java collection
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
Map struct
Map structMap struct
Map struct
 
Kafka 자료 v0.1
Kafka 자료 v0.1Kafka 자료 v0.1
Kafka 자료 v0.1
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙
 
Enum
EnumEnum
Enum
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
Map struct
Map structMap struct
Map struct
 
Kafka 자료 v0.1
Kafka 자료 v0.1Kafka 자료 v0.1
Kafka 자료 v0.1
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
Enum
EnumEnum
Enum
 

Java lambda

  • 1. JAVA Lambda 작성자 : 홍효상 이메일 : hyomee@naver.com 소스 : https://github.com/hyomee/JAVA_EDU 프로그램은 사람이 이해하는 코드를 작성. 느려도 꾸준하면 경기에서 이긴다.
  • 2. Content 소스 : https://github.com/hyomee/JAVABASIC 16. Lambda 1. 익명(Anonymous) Class 2. Lambda 3. 함수형 인터페이스 4. 타입 추론
  • 3. 1. 익명(Anonymous) Class 16. Lambda • 프로그램에서일시적으로한번만사용되고버려지는객체를매번객체를만들어야하나? • 확장성을고려해서객체를생성해야하는데…수정이편할까? • 사용처:인스턴스변수,인스턴스메서드,인스턴스메소드의매개변수 “ 이름을 알 수 없는 객체로 한번만 사용하고 버려지는 객체” 16-1. 익명(Anonymous) Class 사용하는 이유 • 클래스생성 • 인터페이스의구현 구현 하는 방법 01. 클래스생성 ➢ 1.추상클래스생성 예제 : AnonymousAbstract.java 예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous ➢ 2. 추상클래스 구현 Class 생성 예제 : AnonymousAbstarctClass.java - 인스턴스 변수 익명(Anonymous) Class • 클래스를정의하지않고필요할때이름없이즉시선언하고인스턴스화해서사용 • 객체안에만드는로컬클래스와동일하다 • new수식이올수있는곳어디든지사용가능하나생성자는정의할수없음 • 익명클래스내부에서외부의메소드내변수를참조할때는메소드의지역변수중 final로선언된변수만참조가능 -변수는Stack에있고객체는Heap에있음,즉Method실행이끝나고Stack는사라지지만 Heap에있는Method는사라지지않기때문
  • 4. 1. 익명(Anonymous) Class 16. Lambda 16-1. 익명(Anonymous) Class 예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous ➢ 2.추상클래스 구현 Class 생성 예제 : AnonymousAbstarctClass.java - 인스턴스 Method 예제 : AnonymousAbstarctClass.java - 인스턴스 메서드의 파라메터 ➢ 3. 실행 ➢ 2. 추상클래스 구현 Class 생성 예제 : AnonymousMain.java 파라메터로 객체 생성 하여 파라메터로 전달 예제 : AnonymousChild .java 참조
  • 5. 1. 익명(Anonymous) Class 16. Lambda 16-1. 익명(Anonymous) Class 02. 인터페이스의구현 ➢ 1. 인터페이스구현 예제 : https://github.com/hyomee/JAVA_EDU/tree/main/L/src/com/hyomee/anonymous 예제 : AnonymousInterface.java ➢ 2. 인터페이스구현체 예제 : AnonymousInterfaceClass.java ➢ 3. 실행 익명 객체 생성 람다 생성
  • 6. 1. Lambda 16. Lambda • 자바8이전에는Method라는함수형태가존재하지만객체를통해서만접근이가능하고,Method그자체를변수로사용하지는못한다. • 자바8에서는함수를변수처럼사용할수있기때문에,파라미터로다른메소드의인자로전달할수있고,리턴값으로함수를받을수도있다. • 이름없는익명함수구현에서주로사용하며함수형인터페이스의인스턴스(구현객체)를표현 :함수형인터페이스(추상메소드가하나인인터페이스)를구현객체를람다식으로표현 “ 자바에서 함수형 프로그램 방식으로 구현 해 주는 문법” 16-2. Lambda 람다 ( Lambda ) JAVA에서 함수형 프로그램 ➢ 함수 • 함수정의 ->구현 ->사용 void fun() { … } fun() ➢ JAVA • 함수는없음 • Class, Interface 의Method class C { void method() { ….. } } C c = new C(); c.method(); ➢ JAVA Lambda 익명 멤버 변수로 구현 방법 적용 • 하나의추상메서드만있는interface 생성-.>익명 Class (멤버변수)작성->Lambda로변경 Interface Example { R apply(A arg); } 01. 인터페이스 Example exp = new Example() { @Override public R apply(A arg) { body } }; 02. 인스턴스생성 Example exp = (arg) { body }; 03. 인자목록과함수몸통 을제외하고모두제거 Example exp = (arg) - >{ body } ; 04. 문법적용
  • 7. 1. Lambda 16. Lambda “ 자바에서 함수형 프로그램 방식으로 구현 해 주는 문법” 16-2. Lambda 표현식 • (arg1, arg2...) -> { body } • (params) -> expression • (params) -> statement • (params) -> { statements } • (int a, int b) -> { return a + b; }; > 타입 추론에 의한 타입 제거 : (a, b) -> { return a+b } ; > 무엇인가를 반환 하거나 한 줄 표현식이 가능 하면 return 삭 제 : (a, b) -> a+b; • () -> System.out.println("Hello "); > 파라미터없고 Hello 출력 System.out::println; • () -> System.out.println("Hello "); // 파라미터 없고 Hello 출력 • (String s) -> { System.out.println(s); } // String s입력매개변수로 받아 출력 • () -> 8514790 //파라미터없고 8514790가 리턴 • () -> { return 3.14 }; //파라미터없고 3.14리턴
  • 8. 1. Lambda 16. Lambda 16-2. Lambda 추상 메서드를 이용한 람다 class C { void method() { ….. } } C c = new C(); c.method(); interface 익명 이너 클래스 함수 실헹 리턴 : 없음 매개 : 있음 interface IfNoRnNoArg { void method(); } IfNoRnNoArg iNrNa = new IfNoRnNoArg() { void method () { … } }; IfNoRnNoArg iNrNa = ( ) - > { … }; iNrNa.method(); 리턴 : 없음 매개 : 있음 interface IfNoRnArg { void method(int a); } IfNoRnArg iNra = new IfNoRnArg() { void method( int a ) { … } }; IfNoRnArg iNra = (int a) -> { … } iNra.method(1); 리턴 : 없음 매개 : 있음 interface IfRnNoArg { int method(); } IfRnNoArg irNa = new IfRnNoArg () { int method() { int a = 0 … return a } }; IfRnNoArg irNa = () -> { int a = 10; return a; }; irNa.method(); 리턴 : 없음 매개 : 있음 interface IfRnArg { int method(int a, int b); } IfRnArg ira = new IfRnNoArg () { int method(int a, int b) { return a + b; } }; IfRnArg ira = (a, b) -> { return a + b; }; ira.method(5, 10) 배열 interface IfArray { int [] method(int length) } IfRnArg ira = new IfArray () { int method(int length) { return new int[length]; } }; IfRnArg ira = (length) -> { return new int[length]; }; or IfRnArg ira = int[] :: new; int [] a1 = ira. ira.method(10); 예제 : LambdaFunctional.java
  • 9. 1. Lambda 16. Lambda 16-2. Lambda 추상 메서드를 이용한 람다 예제 : LambdaFunctional.java
  • 10. 1. Lambda 16. Lambda 16-2. Lambda 존재 하는 객체 람다 표현 예제 : ExistsClassLamda.java 01. 객체생성 람다로 객체 생성 방법 람다 선언 방법 : 클래스객체 :: 인스턴스메서드명
  • 11. 1. Lambda 16. Lambda 16-2. Lambda 존재 하는 객체 람다 표현 예제 : ExistsClassLamda.java 02. 기존 객체의메서드실행 클래스의 기존 함수 지정 람다 선언 방법 : 클래스객체 :: 인스턴스메서드명 클래스의 기존 함수 선택 클래스의 기존 함수 선택 람다로 Class 생성
  • 12. 1. Lambda 16. Lambda 16-2. Lambda 존재 하는 객체 람다 표현 예제 : ExistsClassLamda.java 03. Static 메서드실행 람다 선언 방법 : 클래스객체 :: 정적메서드명 04. 첫번째 매개변수로 전달된 매개변수를 사용 함 객체를 메소드 내부로 보냈으므로 메서드 내부에서 생성 할 필요 없음
  • 13. 1. 함수형 인터페이스 16. Lambda 16-3. 함수형 인터페이스 함수형 인터페이스 • 추상Method가하나뿐인인터페이스(Single Abstract Method:SAM) • 여러개의Default Method가있을수있다. • @FunctionalInterface 어노테이션은함수형인터페이스이다 • Runnable, ActionListener, Comparable은함수형인터페이스 :자바8이전:익명클래스이용 :자바8이후:람다식이용 java.util.function 에서 제공 하는 함수형 인터페이스 • Predicate: 하나의매개변수를주는boolean형을 반환 • Consumer:하나의매개변수를주는void형accept 메소드 • Function: T유형의인수를취하고R유형의결과를반환하는추상메소드apply • Supplier: 메소드인자는없고T유형의결과를반환하는추상메소드get • UnaryOperator:하나의인자와리턴타입을가진다. T->T • BinaryOperator:두개의인수,동일한타입의결과를반환하는추상메서드apply 01. 가장기본이되는함수형인터페이스 02. 파라메터가두개인함수형인터페이스 03. 파라메터를받고동일한타입을리턴하는함수형인터페이스 04. 기본형타입의함수형인퍼페이스
  • 14. 1. 함수형 인터페이스 16. Lambda 16-3. 함수형 인터페이스 (3 +3) * 2 10 > 5 and 10 < 6 10 > 5 or 10 < 6
  • 15. 1. 함수형 인터페이스 16. Lambda 16-3. 함수형 인터페이스 05. Stream과같이사용하는함수형인터페이스
  • 16. 1. 타입 추론 16. Lambda 16-3. 타입 추론 타입 추론 • 자바컴파일러는람다표현식이사용된컨텍스트(대상형식)를이용해서람다표현식과관련된함수형인터페이스를추론한다. • 즉,대상형식을이용해서함수디스크립터를알수있으므로컴파일러는람다의시그니처도추론할수있다. • 결과적으로컴파일러는람다표현식의파라미터형식에접근할수있으므로람다문법에서이를생략할수있다. • 즉,자바컴파일러는다음처럼람다파라미터형식을추론할수있다. • 여러파라미터를포함하는람다표현식에서는코드가독성향상이더두드러진다. interface IfRnArg { int method(int a, int b); } IfRnArg ira = new IfRnNoArg () { int method(int a, int b) { return a + b; } }; IfRnArg ira = (int a, int b) -> { return a + b; }; IfRnArg ira = (a, b) -> { return a + b; };