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

Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
Swift3 typecasting nested_type
Swift3 typecasting nested_typeSwift3 typecasting nested_type
Swift3 typecasting nested_typeEunjoo Im
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)Yongha Yoo
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js functionYoung-Beom Rhee
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 genericEunjoo Im
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOSEunjoo Im
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.Young-Beom Rhee
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)MIN SEOK KOO
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기rupert kim
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeYoung-Beom Rhee
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초Circulus
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)MIN SEOK KOO
 

What's hot (20)

Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
Swift3 typecasting nested_type
Swift3 typecasting nested_typeSwift3 typecasting nested_type
Swift3 typecasting nested_type
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
 

Similar to Java_10 람다

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
 
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한국사용자모임
 
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
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍준혁 이
 
레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기Jiyong Jung
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 

Similar to Java_10 람다 (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
 
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
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 

More from Hong Hyo Sang

Java_09 이너클래스
Java_09 이너클래스Java_09 이너클래스
Java_09 이너클래스Hong Hyo Sang
 
Java_07 제너릭 메서드
Java_07 제너릭 메서드Java_07 제너릭 메서드
Java_07 제너릭 메서드Hong Hyo Sang
 
Java_02 변수자료형
Java_02 변수자료형Java_02 변수자료형
Java_02 변수자료형Hong Hyo Sang
 
Java 이해하기 쉬운 코드
Java 이해하기 쉬운 코드 Java 이해하기 쉬운 코드
Java 이해하기 쉬운 코드 Hong Hyo Sang
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 

More from Hong Hyo Sang (11)

Java_09 이너클래스
Java_09 이너클래스Java_09 이너클래스
Java_09 이너클래스
 
Java_08 collection
Java_08 collectionJava_08 collection
Java_08 collection
 
Java_07 제너릭 메서드
Java_07 제너릭 메서드Java_07 제너릭 메서드
Java_07 제너릭 메서드
 
Java_03 연산자
Java_03 연산자Java_03 연산자
Java_03 연산자
 
Java_06 상속
Java_06 상속Java_06 상속
Java_06 상속
 
Java_05 class
Java_05 classJava_05 class
Java_05 class
 
Java_04 제어
Java_04 제어Java_04 제어
Java_04 제어
 
Java_02 변수자료형
Java_02 변수자료형Java_02 변수자료형
Java_02 변수자료형
 
Java_01 기초
Java_01 기초Java_01 기초
Java_01 기초
 
Java 이해하기 쉬운 코드
Java 이해하기 쉬운 코드 Java 이해하기 쉬운 코드
Java 이해하기 쉬운 코드
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 

Java_10 람다

  • 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; };