SlideShare a Scribd company logo
1 of 44
Download to read offline
JAVA
 8
커머스컨텐츠개발랩
 
 
 
 
 
 
 황기현
1.
 JAVA8의
 주요
 기능
 
2.
 Lambda
 Expression
3.
 Lambda
 Syntax
4.
 Stream
 API
 
✓ 날짜 및 시간 API
이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및
시간을 처리할 수 있다.
✓ Nashorn Javascript 엔진
새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA
응용 프로그램에서 이 엔진을 사용할 수 있다.
✓ 향상된 보안
호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게
식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다.
✓ Lambda 표현식 및 가상 확장 메소드
JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원
기능이다.
JAVA8 의 주요 기능
✓ 날짜 및 시간 API
이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및
시간을 처리할 수 있다.
✓ Nashorn Javascript 엔진
새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA
응용 프로그램에서 이 엔진을 사용할 수 있다.
✓ 향상된 보안
호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게
식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다.
✓ Lambda 표현식 및 가상 확장 메소드
JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원
기능이다.
JAVA8 의 주요 기능
✓ 날짜 및 시간 API
이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및
시간을 처리할 수 있다.
✓ Nashorn Javascript 엔진
새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA
응용 프로그램에서 이 엔진을 사용할 수 있다.
✓ 향상된 보안
호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게
식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다.
✓ Lambda 표현식 및 가상 확장 메소드
JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원
기능이다.
JAVA8 의 주요 기능
✓ 날짜 및 시간 API
이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및
시간을 처리할 수 있다.
✓ Nashorn Javascript 엔진
새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA
응용 프로그램에서 이 엔진을 사용할 수 있다.
✓ 향상된 보안
호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게
식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다.
✓ Lambda 표현식 및 가상 확장 메소드
JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원
기능이다.
JAVA8 의 주요 기능
✓ 날짜 및 시간 API
이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및
시간을 처리할 수 있다.
✓ Nashorn Javascript 엔진
새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA
응용 프로그램에서 이 엔진을 사용할 수 있다.
✓ 향상된 보안
호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게
식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다.
✓ Lambda 표현식 및 가상 확장 메소드
JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원
기능이다.
JAVA8 의 주요 기능
Java8은 Lambda 표현식을 받아들이면서
Functional Programming 특징을 갖추게 되어
OOP + FP 의 멀티 패러다임 언어(Multi paradigm language)가 됐다.
Functional Programming(함수형 프로그래밍)이란?
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래
밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래
밍은 함수의 응용을 강조한다.
수학적 함수와 명령형 프로그래밍에서 사용되는 함수는 차이가 있는데, 명령형의 함수는 프로그램의 상태의 값
을 바꿀 수 있는 부작용이 생길 수 있다. 이 때문에 명령형 함수는 참조 투명성이 없고, 같은 코드라도 실행되는
프로그램의 상태에 따라 다른 결과값을 낼 수 있다. 반대로 함수형 코드에서는 함수의 출력 값은 그 함수에 입력
된 인수에만 의존하므로 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나온다. 부작용을 제
거하면 프로그램의 동작을 이해하고 예측하기가 훨씬 쉽게 된다. 이것이 함수형 프로그래밍으로 개발하려는 핵
심 동기 중 하나이다.
✓ 명령형 언어 : a라는 변수에 1을 담아라. (대입)
✓ 함수형 언어 : a를 1로 정의한다.
a = 1
Lambda Expression
람다식은 메서드와 유사
형식 매개변수의 목록과 이 매개변수로 표현된 본문(식이나 코드 블록)을 제공
A lambda expression is like a method : it provides a list of formal
parameters and a body - an expression or block - expressed in terms
of those parameters.
- jsr335, /spec/B.html
Lambda Syntax
(인자 목록 ) - { 구문 }
( int x, int y ) - { return x + y; }
(int x, int y ) - x + y
( ) - “Hello, World! ”
( x, y ) - x + y
x -  x + 1
public void adder ( int x, int y ) {
return x + y;
}
( int x, int y ) - { return x + y; }
( x, y ) - x + y;
// Java8 이전
Collections.sort(strings, new ComparatorString() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
// Java8
Collections.sort(strings, (s1, s2) - s1.compareTo(s2));
⇒ Functional Interface
• 단 하나의 추상 메소드를 갖는다.
• 람다 표현으로 사용하기 위해 @FunctionalInterface
주석(annotation)을 붙일 수 있다.
(이 방식이 강력 추천 됨!)
? adder = ( int x, int y ) - x + y
Lambda의 타입은?
@FunctionalInterface
public interface IAddableT {
// To add two objects
public T add(T t1, T t2);
}
IAddableString stringAdder = (String s1, String s2) - s1 + s2;
IAddableInteger intAdder = (i1, i2) - i1 + i2;
public void addStrings(String s1, String s2) {
System.out.println(stringAdder.add(s1, s2));
}
public void addIntegers(Integer i1, Integer i2) {
System.out.println(intAdder.add(i1, i2));
}
✓ 인터페이스 정의
✓ 람다 표현식을 이용하여 Functional Interface 구현
IAddable이 generic type 인터페이스이기 때문에 서로 다른 타입으로 구현이 가능하다.
✓ 정의된 것을 사용
Java에서 Lambda 표현식을 사용하는 목적
변수를 직접 전달하여 그 값을 변경함으로써 흐름을 처리하지 않고, 행위 자체
(Behavior Parameter)를 전달함으로써 함수형 프로그램이 지향하는 바를 얻기 위
함.
기존에 이미 익명 클래스(Anonymous Class)를 통해 해결할 수도 있었던 문제지
만, Lambda식을 사용함으로써 코드를 좀 더 깔끔하고 가독성을 높일 수 있다.
즉, “Java에서 Lambda 표현식은 추상 메소드가 하나만 있는 인터페이스를 익명
클래스 대신 구현할 수 있게 해주는 방법”이라고 할 수 있다.
Stream API
Java에서 가장 많이 사용되는 Collection을 파이프라이닝 형태로 다룰 수 있게
해주는 Java8의 새로운 API.
Stream의 특징
✓ No Storage - 데이터 보관을 위해 별도의 공간을 마련하지 않고
✓ Immutable - 기본적으로는 원본을 조작하지 않으며
✓ Laziness - 최종적인 결과를 얻을 때 필요한 동작만을 수행하고
✓ Possibly unbounded - 값을 무한히 가질 수도 있으며
✓ Consumable - 1회성이다.
즉, 스트림은 각 원소들을 단 한번만 방문한다.
등록된 상품 중에 현재 판매 중이고,
가격이 십만원 이하인 상품의 개수는?
public class Product {
private int id;
private boolean usable;
private String category;
private int price;
getter / setter ..
}
현재 판매 중이고 십만원 이하인 상품의 개수는?
현재 판매 중이고 십만원 이하인 상품의 개수는?
public void setProduct() {
Product p1 = new Product(1, true, fashion, 50000);
Product p2 = new Product(2, true, fashion, 38000);
Product p3 = new Product(3, true, it, 250000);
Product p4 = new Product(4, true, it, 85000);
Product p5 = new Product(5, true, it, 99000);
Product p6 = new Product(6, true, it, 75000);
Product p7 = new Product(7, true, furniture, 350000);
Product p8 = new Product(8, false, furniture, 210000);
Product p9 = new Product(9, false, furniture, 58000);
Product p10 = new Product(10, false, it, 120000);
products.add(p1);
products.add(p2);
:
}
현재 판매 중이고 십만원 이하인 상품의 개수는?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 :  +
count + 개 );
}
상품목록에서 개별 상품을 구해서
현재 판매 중이고 십만원 이하인 상품의 개수는?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 :  +
count + 개 );
}
상품목록에서 개별 상품을 구해서
현재 판매 중이고
현재 판매 중이고 십만원 이하인 상품의 개수는?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 :  +
count + 개 );
}
상품목록에서 개별 상품을 구해서
현재 판매 중이고
십만원 이하라면
현재 판매 중이고 십만원 이하인 상품의 개수는?
public void filterBeforeJava8() {
int count = 0;
for(Product pd : products) {
if(pd.isUsable() 
pd.getPrice() = 100000) {
count++;
}
}
System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 :  +
count + 개 );
}
상품목록에서 개별 상품을 구해서
현재 판매 중이고
십만원 이하라면
개수를 1증가
현재 판매 중이고 십만원 이하인 상품의 개수는?
public void filterJava8() {
long count = products.stream()
.filter(p - p.isUsable())
.filter(p - p.getPrice() = 100000)
.count();
System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 :  +
count + 개 );
}
상품 중에서

More Related Content

What's hot

What's hot (20)

자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기
 
씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API
 
자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overview
 
자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expression
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Just java
Just javaJust java
Just java
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
3. stream api
3. stream api3. stream api
3. stream api
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 

Viewers also liked

Viewers also liked (9)

React, Redux and es6/7
React, Redux and es6/7React, Redux and es6/7
React, Redux and es6/7
 
Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
 
간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기
 
역시 Redux
역시 Redux역시 Redux
역시 Redux
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
sungmin slide
sungmin slidesungmin slide
sungmin slide
 

Similar to Java8 & Lambda

SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
Sangmin Lee
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
NAVER D2
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
Sang Don Kim
 

Similar to Java8 & Lambda (20)

SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Java_10 람다
Java_10 람다Java_10 람다
Java_10 람다
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영
 
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
 
자바 8
자바 8자바 8
자바 8
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
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
 
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
 
Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기
 
[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP
 
JavaInAction 자바 8
JavaInAction 자바 8JavaInAction 자바 8
JavaInAction 자바 8
 
서버리스 앱 배포 자동화 (김필중, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
서버리스 앱 배포 자동화 (김필중, AWS 솔루션즈 아키텍트) :: AWS DevDay2018서버리스 앱 배포 자동화 (김필중, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
서버리스 앱 배포 자동화 (김필중, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
 
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020 AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
 

Recently uploaded

Recently uploaded (8)

(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 

Java8 & Lambda

  • 3.  
  • 4.  
  • 5.  
  • 6.  
  • 7.  
  • 8.  
  • 10. 1.
  • 14.   2.
  • 20.  API
  • 21.  
  • 22. ✓ 날짜 및 시간 API 이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및 시간을 처리할 수 있다. ✓ Nashorn Javascript 엔진 새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA 응용 프로그램에서 이 엔진을 사용할 수 있다. ✓ 향상된 보안 호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게 식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다. ✓ Lambda 표현식 및 가상 확장 메소드 JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원 기능이다. JAVA8 의 주요 기능
  • 23. ✓ 날짜 및 시간 API 이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및 시간을 처리할 수 있다. ✓ Nashorn Javascript 엔진 새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA 응용 프로그램에서 이 엔진을 사용할 수 있다. ✓ 향상된 보안 호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게 식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다. ✓ Lambda 표현식 및 가상 확장 메소드 JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원 기능이다. JAVA8 의 주요 기능
  • 24. ✓ 날짜 및 시간 API 이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및 시간을 처리할 수 있다. ✓ Nashorn Javascript 엔진 새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA 응용 프로그램에서 이 엔진을 사용할 수 있다. ✓ 향상된 보안 호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게 식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다. ✓ Lambda 표현식 및 가상 확장 메소드 JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원 기능이다. JAVA8 의 주요 기능
  • 25. ✓ 날짜 및 시간 API 이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및 시간을 처리할 수 있다. ✓ Nashorn Javascript 엔진 새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA 응용 프로그램에서 이 엔진을 사용할 수 있다. ✓ 향상된 보안 호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게 식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다. ✓ Lambda 표현식 및 가상 확장 메소드 JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원 기능이다. JAVA8 의 주요 기능
  • 26. ✓ 날짜 및 시간 API 이 새 API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및 시간을 처리할 수 있다. ✓ Nashorn Javascript 엔진 새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 JAVA 응용 프로그램에서 이 엔진을 사용할 수 있다. ✓ 향상된 보안 호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게 식별하고 호출자를 안정적으로 검색하는 방식으로 바꾼다. ✓ Lambda 표현식 및 가상 확장 메소드 JAVA8에서 눈에 띄는 기능은 Java 프로그래밍 언어 및 플랫폼에 구현된 람다 표현식 및 지원 기능이다. JAVA8 의 주요 기능
  • 27. Java8은 Lambda 표현식을 받아들이면서 Functional Programming 특징을 갖추게 되어 OOP + FP 의 멀티 패러다임 언어(Multi paradigm language)가 됐다. Functional Programming(함수형 프로그래밍)이란? 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래 밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래 밍은 함수의 응용을 강조한다. 수학적 함수와 명령형 프로그래밍에서 사용되는 함수는 차이가 있는데, 명령형의 함수는 프로그램의 상태의 값 을 바꿀 수 있는 부작용이 생길 수 있다. 이 때문에 명령형 함수는 참조 투명성이 없고, 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값을 낼 수 있다. 반대로 함수형 코드에서는 함수의 출력 값은 그 함수에 입력 된 인수에만 의존하므로 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나온다. 부작용을 제 거하면 프로그램의 동작을 이해하고 예측하기가 훨씬 쉽게 된다. 이것이 함수형 프로그래밍으로 개발하려는 핵 심 동기 중 하나이다.
  • 28. ✓ 명령형 언어 : a라는 변수에 1을 담아라. (대입) ✓ 함수형 언어 : a를 1로 정의한다. a = 1
  • 29. Lambda Expression 람다식은 메서드와 유사 형식 매개변수의 목록과 이 매개변수로 표현된 본문(식이나 코드 블록)을 제공 A lambda expression is like a method : it provides a list of formal parameters and a body - an expression or block - expressed in terms of those parameters. - jsr335, /spec/B.html
  • 30. Lambda Syntax (인자 목록 ) - { 구문 } ( int x, int y ) - { return x + y; } (int x, int y ) - x + y ( ) - “Hello, World! ” ( x, y ) - x + y x - x + 1
  • 31. public void adder ( int x, int y ) { return x + y; } ( int x, int y ) - { return x + y; } ( x, y ) - x + y;
  • 32. // Java8 이전 Collections.sort(strings, new ComparatorString() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); // Java8 Collections.sort(strings, (s1, s2) - s1.compareTo(s2));
  • 33. ⇒ Functional Interface • 단 하나의 추상 메소드를 갖는다. • 람다 표현으로 사용하기 위해 @FunctionalInterface 주석(annotation)을 붙일 수 있다. (이 방식이 강력 추천 됨!) ? adder = ( int x, int y ) - x + y Lambda의 타입은?
  • 34. @FunctionalInterface public interface IAddableT { // To add two objects public T add(T t1, T t2); } IAddableString stringAdder = (String s1, String s2) - s1 + s2; IAddableInteger intAdder = (i1, i2) - i1 + i2; public void addStrings(String s1, String s2) { System.out.println(stringAdder.add(s1, s2)); } public void addIntegers(Integer i1, Integer i2) { System.out.println(intAdder.add(i1, i2)); } ✓ 인터페이스 정의 ✓ 람다 표현식을 이용하여 Functional Interface 구현 IAddable이 generic type 인터페이스이기 때문에 서로 다른 타입으로 구현이 가능하다. ✓ 정의된 것을 사용
  • 35. Java에서 Lambda 표현식을 사용하는 목적 변수를 직접 전달하여 그 값을 변경함으로써 흐름을 처리하지 않고, 행위 자체 (Behavior Parameter)를 전달함으로써 함수형 프로그램이 지향하는 바를 얻기 위 함. 기존에 이미 익명 클래스(Anonymous Class)를 통해 해결할 수도 있었던 문제지 만, Lambda식을 사용함으로써 코드를 좀 더 깔끔하고 가독성을 높일 수 있다. 즉, “Java에서 Lambda 표현식은 추상 메소드가 하나만 있는 인터페이스를 익명 클래스 대신 구현할 수 있게 해주는 방법”이라고 할 수 있다.
  • 36. Stream API Java에서 가장 많이 사용되는 Collection을 파이프라이닝 형태로 다룰 수 있게 해주는 Java8의 새로운 API. Stream의 특징 ✓ No Storage - 데이터 보관을 위해 별도의 공간을 마련하지 않고 ✓ Immutable - 기본적으로는 원본을 조작하지 않으며 ✓ Laziness - 최종적인 결과를 얻을 때 필요한 동작만을 수행하고 ✓ Possibly unbounded - 값을 무한히 가질 수도 있으며 ✓ Consumable - 1회성이다. 즉, 스트림은 각 원소들을 단 한번만 방문한다.
  • 37. 등록된 상품 중에 현재 판매 중이고, 가격이 십만원 이하인 상품의 개수는?
  • 38. public class Product { private int id; private boolean usable; private String category; private int price; getter / setter .. } 현재 판매 중이고 십만원 이하인 상품의 개수는?
  • 39. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void setProduct() { Product p1 = new Product(1, true, fashion, 50000); Product p2 = new Product(2, true, fashion, 38000); Product p3 = new Product(3, true, it, 250000); Product p4 = new Product(4, true, it, 85000); Product p5 = new Product(5, true, it, 99000); Product p6 = new Product(6, true, it, 75000); Product p7 = new Product(7, true, furniture, 350000); Product p8 = new Product(8, false, furniture, 210000); Product p9 = new Product(9, false, furniture, 58000); Product p10 = new Product(10, false, it, 120000); products.add(p1); products.add(p2); : }
  • 40. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품목록에서 개별 상품을 구해서
  • 41. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품목록에서 개별 상품을 구해서 현재 판매 중이고
  • 42. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품목록에서 개별 상품을 구해서 현재 판매 중이고 십만원 이하라면
  • 43. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterBeforeJava8() { int count = 0; for(Product pd : products) { if(pd.isUsable() pd.getPrice() = 100000) { count++; } } System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품목록에서 개별 상품을 구해서 현재 판매 중이고 십만원 이하라면 개수를 1증가
  • 44. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterJava8() { long count = products.stream() .filter(p - p.isUsable()) .filter(p - p.getPrice() = 100000) .count(); System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품 중에서
  • 45. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterJava8() { long count = products.stream() .filter(p - p.isUsable()) .filter(p - p.getPrice() = 100000) .count(); System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품 중에서 판매 중이고
  • 46. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterJava8() { long count = products.stream() .filter(p - p.isUsable()) .filter(p - p.getPrice() = 100000) .count(); System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품 중에서 판매 중이고 십만원 이상인 상품의
  • 47. 현재 판매 중이고 십만원 이하인 상품의 개수는? public void filterJava8() { long count = products.stream() .filter(p - p.isUsable()) .filter(p - p.getPrice() = 100000) .count(); System.out.println(현재 판매 중이고 가격이 십만원 이하인 상품의 개수 : + count + 개 ); } 상품 중에서 판매 중이고 십만원 이상인 상품의 개수를 구함
  • 48. Stream API : 3단계 구성 products.stream().filter(p - p.isUsable()).count(); 스트림 생성 중개 연산 스트림 변환 종단 연산 스트림 사용
  • 49. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void filter(ListInteger numbers) { numbers.stream() .filter(value - value % 3 == 0) .forEach(System.out::println); } 3의 배수를 출력
  • 50. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void filter(ListInteger numbers) { numbers.stream() .filter(value - value % 3 == 0) .forEach(System.out::println); } 3의 배수를 출력 중개 연산 : Stream T filter ( T - boolean ) - 각 요소를 확인해서 조건을 통과한 요소만으로 새 스트림 생성 - 참 / 거짓을 반환하는 조건식을 인수로 전달
  • 51. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void filter(ListInteger numbers) { numbers.stream() .filter(value - value % 3 == 0) .forEach(System.out::println); } 3의 배수를 출력 최종 연산 : void forEach ( T - void ) - 각 요소를 인수로 전달된 함수에 전달해 처리 - 최종연산이기 때문에 이후 스트림을 사용할 수 없음
  • 52. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void filter(ListInteger numbers) { numbers.stream() .filter(value - value % 3 == 0) .forEach(System.out::println); } 3의 배수를 출력 메소드 참조 : 람다 표현식의 다른 형태 class :: method 로 사용
  • 53. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void map(ListInteger numbers) { int sum = numbers.stream() .mapToInt(value - value * 2) .sum(); System.out.println(Sum : + sum); } 리스트의 모든 값을 2배 한 후 합계 구하기
  • 54. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void map(ListInteger numbers) { int sum = numbers.stream() .mapToInt(value - value * 2) .sum(); System.out.println(Sum : + sum); } 리스트의 모든 값을 2배 한 후 합계 구하기 중개 연산 : Stream R map ( T - R ) - T 타입의 요소를 1:1로 R 타입의 요소로 변환 후 스트림 생성 - 변환을 처리하는 함수를 인수로 전달
  • 55. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void map(ListInteger numbers) { int sum = numbers.stream() .mapToInt(value - value * 2) .sum(); System.out.println(Sum : + sum); } 리스트의 모든 값을 2배 한 후 합계 구하기 최종 연산 : sum(), average(), min(), max() - 합계 : [ int, long, double ] sum() - 평균 : OptionalDouble average() - 최소값 : Optional[ Int, Long, Double ] min() - 최대값 : Optional[ Int, Long, Double ] max()
  • 56. ListInteger numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); public static void statistics(ListInteger numbers) { IntSummaryStatistics stats = numbers.stream() .mapToInt(value - value * 2) .summaryStatistics(); System.out.println(Sum : + stats.getSum()); System.out.println(Average : + stats.getAverage()); System.out.println(Max Value : + stats.getMax()); System.out.println(Min Value : + stats.getMin()); } 리스트의 모든 값을 2배 한 후 합계, 평균, 최대 / 최소값 구하기 최종 연산 : summaryStatistics() - [ Int, Long, Double ] SummaryStatistics summaryStatstics() - 합계, 평균, 최소값, 최대값, 개수에 대한 요약 통계
  • 57. // 옵션 타입별 사용중 옵션 반환 : JAVA8 이전
 private ListOption getUsableOptionsByType(OptionType type) {
 return select(this.options, having(on(Option.class).isUsable(), equalTo(true)).and( having(on(Option.class).getOptionType(), equalTo(type)))); } // 옵션 타입별 사용중 옵션 반환 : JAVA8
 private ListOption getUsableOptionsByType(OptionType type) {
 return options.stream() .filter(o - o.isUsable()) .filter(o - type == o.getOptionType()) .collect(Collectors.toList()); } LambdaJ
  • 58. LambdaJ /** * 최소 옵션가 조회 * LambdaJ - Lambda * @return 최소옵션가 */ public long getLowestOptionPrice() { // Java8 이전 : LambdaJ 사용 ListOptionCombination activeOptionCombinations = select(getOptionCombinations(), having(on(OptionCombination.class).isUsable(), equalTo(true))); return min(activeOptionCombinations, on(OptionCombination.class).getPrice()); }
  • 59. Lambda /** * 최소 옵션가 조회 * LambdaJ - Lambda * @return 최소옵션가 */ public long getLowestOptionPrice() { // Java8 return getOptionCombinations().stream() .filter(s - s.isUsable()) .mapToLong(OptionCombination::getPrice) .min() .getAsLong(); }
  • 60. Lambda 표현식의 장점 ➢ OOP 언어인 Java에서 함수형 코드를 작성할 수 있게 해준다. ➢ 람다 표현식을 이용함으로써 간결하고 명확한 코드로 그 의도를 표현할 수 있다. ➢ Collection filtering, Iteration, Extraction 등에서 놀라운 코드 생산성을 보인다.
  • 62. Lambda와 Closure의 차이 - Closure : 자신이 정의된 영역의 변수를 에워싸고(close over) 있는 것. 또는, 자신이 정의된 영역의 변수에 접근할 수 있는 것. Closure를 사용하기 위해서 Lambda가 사용된다. - Lambda : 익명함수 * Lambda는 람다 표현식 또는 람다 함수, 그리고 이름없는 함수(anonymous function)라고 불리우며 그 성질은 “함수 객체와 동일하다”고 할 수 있다.