SlideShare uma empresa Scribd logo
1 de 44
Lambda Expression
자바카페
김흥래
람다
람다
람다
• 람다 표현식
– 메서드로 전달할 수 있는 익명 함수를 단순화 한 표현식
• 대표적인 특징
– 익명
• 보통의 메서드와 달리 이름이 없으므로 익명이다.
– 함수
• 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수이다.
– 전달
• 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다.
– 간결성
• 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다.
주의!
• 람다가 기술적으로 Java8 이전에 할 수 없
었던 일들을 해낸다던가 하는 드라마틱한
기술은 아니다.
– 기존의 익명클래스로 제공되던 파라메터 코드
가 간결해진다는 점
– 좀더 손쉬운 Multi Core 프로그래밍을 제공한
다는 점
인터페이스 구현 방식
내부클래스 구현 방식
익명클래스 구현 방식
람다식
람다 기본 문법
람다 기본 문법
// 식을 이용하는 경우 ( = 표현식)
(parameters) -> expression
// 문을 이용하는 경우 ( = 구문)
(parameters) -> {
statements;
}
람다 작성시 “식”과 “문”을 구분해서 생각해야 한다.
“식” 일때는 {}가 생략되지만
“문” 일때는 반드시 {}를 감싸야 한다.
람다 기본 문법
// 파라메터가 없고 리턴이 Void
() -> {}
// 파라메터가 없고 리턴이 String
() -> “Javacafe”
// 파라메터가 없고 리턴이 String
() -> {return “Javacafe”;}
// 에러
(Integer i) -> return “Javacafe” + 1;
// 에러
(String s) -> {“Javacafe” + s;}
람다 기본 문법
함수형 인터페이스
• 람다 표현식은 함수형 인터페이스라는 문
맥에서만 사용할 수 있다.
• 함수형 인터페이스
– 하나의 추상 메서드만 가지는 인터페이스
함수형 인터페이스
• Java8 이전부터 존재하던 인터
페이스
• 과거부터 존재하던 인터페이스
이지만 Java8 기준으로는 모두
함수형 인터페이스라고 불러도
된다.
함수형 인터페이스
• Java8부터 인터페이스는 디
폴트 메소드를 포함 할 수
있다.
• 다수의 디폴트 메소드를 포
함하고 있더라도 추상 메소
드가 오직 하나라면 함수형
인터페이스이다.
• 인터페이스 내부에 Static
메소드가 정의되어 있더라
도 추상메소드가 오직 하나
라면 함수형 인터페이스이
다.
• @FunctionalInterface 어노
테이션을 제공하고 있으며
추상메소드가 1개 이상이
면 컴파일시 오류가 발생한
다.
함수형 인터페이스
• 람다식을 이용하면 함수형 인터페이스가 가지는 추상메소드에 로직
만을 깔끔하게 인스턴스로 전달할 수 있다.
• 물론 익명클래스도 같은 일이 가능하지만 New 키워드로 객체를 직
접 생성해야 하고 로직을 감싸는 코드들 까지도 모두 구현해야 한다.
함수형 인터페이스
• 람다는 결과적으로 함수형 인터페이스가 가지는 유일한 메소드가 구현되는 것이다.
(이를 바탕으로 타입 추론이 가능해짐)
• 함수형 인터페이스를 인자로 가지는 게스트 코드 입장에서는 코드가 인스턴스화 되
어 인자로 들어오므로 호스트 코드에서 보내는 인스턴스의 정체가 람다인지 익명클
래스인지는 관심이 없다.
• 람다와 익명클래스는 다르다.
– 익명클래스는 컴파일시 서브클래스로 별도의 파일로 컴파일되고 람다는 기존 클
래스에 포함된다.
– 람다는 바이트코드로 변환시 Java7에서 추가된 InvokeDynamic 명령어을 이용하
여 런타임에 코드가 생성된다.
Java.util.function 패키지
• 함수형 인터페이스를 인자로 받는 메소드에만 람다식을
사용할 수 있다.
– 새로운 함수형을 추가할 경우 언어가 더 복잡해진다.
– 대부분의 자바 프로그래머가 익명클래스 문법에 익숙하다.
• 위와 같은 제약사항으로 인해 람다식의 타입 추론이 가
능해졌다.
– 함수형 인터페이스가 가지고 있는 추상 메소드가 오직 하나 밖에 없으
므로 이를 이용하여 타입 추론
– 람다식의 Prameter 추론 : 추상 메소드의 파라메터 정보
– 람다식의 Return 타입 추론 : 추상 메소드의 리턴 타입 정보
• Java8에서는 java.util.function 패키지로 다양한 함수형 인터페
이스를 제공한다.
Java.util.function 패키지
Predicate<T>
• Java.util.function.Predicate<T>
– 추상메소드 test()를 정의
– T타입을 인수로 받아 Boolean을 리턴
• 입력값 T가 어떤 조건을 충족하는지 여부를 확인하는 메서드
• 어떤것이 사실인지 아닌지를 리턴해주는 람다식이 알고리즘으로 제
공된다.
Consumer<T>
• Java.util.function.Consumer<T>
– 추상메소드 accept()를 정의
– T타입을 인수로 받고 리턴하지 않음
• 입력값 T에 어떤 동작을 수행시키는 메서드
• 특정 동작을 수행하는 람다식이 알고리즘으로 제공된다.
Function<T, R>
• Java.util.function.Function<T, R>
– 추상메소드 apply()를 정의
– T타입을 인수로 받아 R타입을 리턴
• 입력값 T를 출력값 R로 변환시키는 메소드
• 입력값을 출력값으로 매핑하는 람다식이 알고리즘으로 제공된다.
Supplier<T>
• Java.util.function.Supplier<T>
– 추상메소드 get()를 정의
– 인수없이 T 객체를 리턴
• 정해진 T를 공급하는 메서드
• 입력값과 상관없이 정해진 객체를 리턴해주는 람다식이 알고리즘으
로 제공된다.
람다 표현식 조합
• Java.util.function 패키지에서 제공하는 함
수형 인터페이스 중 일부는 static 메소드
형태의 유틸리티 메소드를 가지고 있다.
– Predicate
– Function
– Comparator
• 유틸리티 메소드를 조합해서 복잡한 람다
식을 만들수 있다.
기본형 특화 함수형 인터페이스
• Autoboxing
– 박싱(boxing) : 기본형을 참조형으로 변환
– 언박싱(unboxing) : 참조형을 기본형으로 변환
– 오토박싱(autoboxing) : 박싱과 언박싱이 자동으
로 일어나는 것으로 컴파일러가 편의를 위해 제공
한다.
• 오토박싱에 의한 비용을 줄이기 위해서 Java8
에서는 기본형에 특화된 다양한 함수형 인터
페이스를 제공한다.
람다 클로저
• 클로저란 함수의 비지역변수를 자유롭게
참조할 수 있는 함수의 인스턴스를 가르킨
다.
• 람다와 익명클래스 모두 클로저와 비슷하
게 동작한다.
• 자바의 클로저는 비지역변수가 final로 정
의되어야 한다.
– 익명클래스는 final 강제
– 람다는 추론
람다 클로저
Javascript Closure Lambda Closure
다른 함수의 인자로 전달가능 다른 메소드의 인자로 전달가능
클로저 외부에 정의된 변수값에
접근 가능
클로저 외부에 정의된 변수값에
접근 가능 (복사된 레퍼런스)
클로저 외부에 정의된 변수값 변
경 가능
클로저 외부에 정의된 변수값 변
경 불가 (final)
메서드 레퍼런스
• 메서드 레퍼런스를 이용하면 기존의 메서드 정의를 이용
하여 람다처럼 전달할 수 있다.
• 람다식의 내용이 길어지면 가독성이 떨어지기 때문에 메
서드 레퍼런스를 사용하는 것이 바람직하다.
• 메서드 레퍼런스는 특정 메서드만을 호출하는 람다식의
축약형이라고 생각해도 된다.
• 컴파일러 입장에서는 함수형 인터페이스를 보고 추론을
하는 것보다 메서드 레퍼런스를 직접 보고 인스턴스를
만드는 것이 더 효율적이다.
메서드 레퍼런스
• Apple::getWeight
– 연산자 :: 를 이용해서 Apple 클래스의 getWeight 메서드가 메서드 레퍼런스로
동작한다.
– 실제 메서드를 호출하는 것이 아니므로 ()는 생략
– JVM은 런타임에 메서드 레퍼런스의 내용을 인스턴스로 만들어 전달한다.
람다식 메서드 레퍼런스
(Apple a) -> a.getWeight() Apple::getWeight
() -> Thread.currentThead().dumpStack() Thead.currentThread()::dumpStack
(str, i) -> str.substring(i) String::substring
(String s) -> System.out.println(s) System.out::println
생성자 레퍼런스
• 클래스명과 new 연산자를 이용해서 기존
생성자의 레퍼런스를 만들 수 있다.
• 다양한 파라메터를 가지는 생성자가 존재
하더라도 ClassName::new
• 다수의 생성자가 존재할 경우 타입추론에
의해서 생성자를 찾아간다.
요약

Mais conteúdo relacionado

Mais procurados

[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술AnselmKim
 
Oop design principle
Oop design principleOop design principle
Oop design principleRyan Park
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2Minseok Jang
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계AnselmKim
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기rupert kim
 
Concurrent programming 2
Concurrent programming 2Concurrent programming 2
Concurrent programming 2Byeongsu Kang
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programmingByeongsu Kang
 
C++ 2학기 수행평가
C++ 2학기 수행평가C++ 2학기 수행평가
C++ 2학기 수행평가Jaehee Lee
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLIDRyan Park
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기NAVER D2
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)Seongyun Byeon
 
Spring di chapter2
Spring di chapter2Spring di chapter2
Spring di chapter2흥래 김
 
[명우니닷컴]자바 스레드에 대해
[명우니닷컴]자바 스레드에 대해[명우니닷컴]자바 스레드에 대해
[명우니닷컴]자바 스레드에 대해Myeongun Ryu
 
OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.Ryan Park
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8문익 장
 
C++ Advanced 강의 소개
C++ Advanced 강의 소개C++ Advanced 강의 소개
C++ Advanced 강의 소개HyunJoon Park
 

Mais procurados (19)

[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술
 
Oop design principle
Oop design principleOop design principle
Oop design principle
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기
 
Concurrent programming 2
Concurrent programming 2Concurrent programming 2
Concurrent programming 2
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
Java 기초
Java 기초Java 기초
Java 기초
 
C++ 2학기 수행평가
C++ 2학기 수행평가C++ 2학기 수행평가
C++ 2학기 수행평가
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
 
Spring di chapter2
Spring di chapter2Spring di chapter2
Spring di chapter2
 
[명우니닷컴]자바 스레드에 대해
[명우니닷컴]자바 스레드에 대해[명우니닷컴]자바 스레드에 대해
[명우니닷컴]자바 스레드에 대해
 
OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.
 
TBB 소개
TBB 소개TBB 소개
TBB 소개
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
 
C++ Advanced 강의 소개
C++ Advanced 강의 소개C++ Advanced 강의 소개
C++ Advanced 강의 소개
 

Semelhante a 2. lambda expression

자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expressionSejong Park
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]leusin2
 
[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성
[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성
[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성Tae-Seong Park
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 
Clojure/Chapter3
Clojure/Chapter3Clojure/Chapter3
Clojure/Chapter3destinycs
 
Scala 기초 (2)
Scala 기초 (2)Scala 기초 (2)
Scala 기초 (2)명성 정
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략NAVER Engineering
 
함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고Sunggon Song
 
이것이 자바다 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
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 

Semelhante a 2. lambda expression (20)

자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expression
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
 
[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성
[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성
[AWSKRUG] Lambda로컬테스트부터 배포까지의 여정-박태성
 
Linq
LinqLinq
Linq
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
Atom package part1
Atom package part1Atom package part1
Atom package part1
 
Clojure/Chapter3
Clojure/Chapter3Clojure/Chapter3
Clojure/Chapter3
 
Java_10 람다
Java_10 람다Java_10 람다
Java_10 람다
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Scala 기초 (2)
Scala 기초 (2)Scala 기초 (2)
Scala 기초 (2)
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략
 
9 swift 클로저1
9 swift 클로저19 swift 클로저1
9 swift 클로저1
 
함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
Serverless 101
Serverless 101Serverless 101
Serverless 101
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 

Mais de 흥래 김

생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기흥래 김
 
검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유흥래 김
 
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기흥래 김
 
한글 자동완성 구현하기
한글 자동완성 구현하기한글 자동완성 구현하기
한글 자동완성 구현하기흥래 김
 
한글 자모 분석 원리
한글 자모 분석 원리한글 자모 분석 원리
한글 자모 분석 원리흥래 김
 
한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기흥래 김
 
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기흥래 김
 
5강 코드효율성
5강 코드효율성5강 코드효율성
5강 코드효율성흥래 김
 
Spring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msaSpring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msa흥래 김
 
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE  [제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE 흥래 김
 
[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy흥래 김
 
Apache http component
Apache http componentApache http component
Apache http component흥래 김
 
플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포흥래 김
 
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화흥래 김
 
Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략흥래 김
 
[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava흥래 김
 

Mais de 흥래 김 (17)

생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기
 
검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유
 
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
 
한글 자동완성 구현하기
한글 자동완성 구현하기한글 자동완성 구현하기
한글 자동완성 구현하기
 
한글 자모 분석 원리
한글 자모 분석 원리한글 자모 분석 원리
한글 자모 분석 원리
 
한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기
 
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
 
5강 코드효율성
5강 코드효율성5강 코드효율성
5강 코드효율성
 
3. stream api
3. stream api3. stream api
3. stream api
 
Spring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msaSpring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msa
 
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE  [제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
 
[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy
 
Apache http component
Apache http componentApache http component
Apache http component
 
플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포
 
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
 
Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략
 
[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava
 

Último

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

Último (8)

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

2. lambda expression

  • 4. 람다 • 람다 표현식 – 메서드로 전달할 수 있는 익명 함수를 단순화 한 표현식 • 대표적인 특징 – 익명 • 보통의 메서드와 달리 이름이 없으므로 익명이다. – 함수 • 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수이다. – 전달 • 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. – 간결성 • 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다.
  • 5. 주의! • 람다가 기술적으로 Java8 이전에 할 수 없 었던 일들을 해낸다던가 하는 드라마틱한 기술은 아니다. – 기존의 익명클래스로 제공되던 파라메터 코드 가 간결해진다는 점 – 좀더 손쉬운 Multi Core 프로그래밍을 제공한 다는 점
  • 6. 인터페이스 구현 방식 내부클래스 구현 방식 익명클래스 구현 방식 람다식
  • 8. 람다 기본 문법 // 식을 이용하는 경우 ( = 표현식) (parameters) -> expression // 문을 이용하는 경우 ( = 구문) (parameters) -> { statements; } 람다 작성시 “식”과 “문”을 구분해서 생각해야 한다. “식” 일때는 {}가 생략되지만 “문” 일때는 반드시 {}를 감싸야 한다.
  • 9. 람다 기본 문법 // 파라메터가 없고 리턴이 Void () -> {} // 파라메터가 없고 리턴이 String () -> “Javacafe” // 파라메터가 없고 리턴이 String () -> {return “Javacafe”;} // 에러 (Integer i) -> return “Javacafe” + 1; // 에러 (String s) -> {“Javacafe” + s;}
  • 11. 함수형 인터페이스 • 람다 표현식은 함수형 인터페이스라는 문 맥에서만 사용할 수 있다. • 함수형 인터페이스 – 하나의 추상 메서드만 가지는 인터페이스
  • 12. 함수형 인터페이스 • Java8 이전부터 존재하던 인터 페이스 • 과거부터 존재하던 인터페이스 이지만 Java8 기준으로는 모두 함수형 인터페이스라고 불러도 된다.
  • 13. 함수형 인터페이스 • Java8부터 인터페이스는 디 폴트 메소드를 포함 할 수 있다. • 다수의 디폴트 메소드를 포 함하고 있더라도 추상 메소 드가 오직 하나라면 함수형 인터페이스이다. • 인터페이스 내부에 Static 메소드가 정의되어 있더라 도 추상메소드가 오직 하나 라면 함수형 인터페이스이 다. • @FunctionalInterface 어노 테이션을 제공하고 있으며 추상메소드가 1개 이상이 면 컴파일시 오류가 발생한 다.
  • 14. 함수형 인터페이스 • 람다식을 이용하면 함수형 인터페이스가 가지는 추상메소드에 로직 만을 깔끔하게 인스턴스로 전달할 수 있다. • 물론 익명클래스도 같은 일이 가능하지만 New 키워드로 객체를 직 접 생성해야 하고 로직을 감싸는 코드들 까지도 모두 구현해야 한다.
  • 15. 함수형 인터페이스 • 람다는 결과적으로 함수형 인터페이스가 가지는 유일한 메소드가 구현되는 것이다. (이를 바탕으로 타입 추론이 가능해짐) • 함수형 인터페이스를 인자로 가지는 게스트 코드 입장에서는 코드가 인스턴스화 되 어 인자로 들어오므로 호스트 코드에서 보내는 인스턴스의 정체가 람다인지 익명클 래스인지는 관심이 없다. • 람다와 익명클래스는 다르다. – 익명클래스는 컴파일시 서브클래스로 별도의 파일로 컴파일되고 람다는 기존 클 래스에 포함된다. – 람다는 바이트코드로 변환시 Java7에서 추가된 InvokeDynamic 명령어을 이용하 여 런타임에 코드가 생성된다.
  • 16. Java.util.function 패키지 • 함수형 인터페이스를 인자로 받는 메소드에만 람다식을 사용할 수 있다. – 새로운 함수형을 추가할 경우 언어가 더 복잡해진다. – 대부분의 자바 프로그래머가 익명클래스 문법에 익숙하다. • 위와 같은 제약사항으로 인해 람다식의 타입 추론이 가 능해졌다. – 함수형 인터페이스가 가지고 있는 추상 메소드가 오직 하나 밖에 없으 므로 이를 이용하여 타입 추론 – 람다식의 Prameter 추론 : 추상 메소드의 파라메터 정보 – 람다식의 Return 타입 추론 : 추상 메소드의 리턴 타입 정보 • Java8에서는 java.util.function 패키지로 다양한 함수형 인터페 이스를 제공한다.
  • 18. Predicate<T> • Java.util.function.Predicate<T> – 추상메소드 test()를 정의 – T타입을 인수로 받아 Boolean을 리턴 • 입력값 T가 어떤 조건을 충족하는지 여부를 확인하는 메서드 • 어떤것이 사실인지 아닌지를 리턴해주는 람다식이 알고리즘으로 제 공된다.
  • 19.
  • 20.
  • 21. Consumer<T> • Java.util.function.Consumer<T> – 추상메소드 accept()를 정의 – T타입을 인수로 받고 리턴하지 않음 • 입력값 T에 어떤 동작을 수행시키는 메서드 • 특정 동작을 수행하는 람다식이 알고리즘으로 제공된다.
  • 22.
  • 23.
  • 24. Function<T, R> • Java.util.function.Function<T, R> – 추상메소드 apply()를 정의 – T타입을 인수로 받아 R타입을 리턴 • 입력값 T를 출력값 R로 변환시키는 메소드 • 입력값을 출력값으로 매핑하는 람다식이 알고리즘으로 제공된다.
  • 25.
  • 26.
  • 27. Supplier<T> • Java.util.function.Supplier<T> – 추상메소드 get()를 정의 – 인수없이 T 객체를 리턴 • 정해진 T를 공급하는 메서드 • 입력값과 상관없이 정해진 객체를 리턴해주는 람다식이 알고리즘으 로 제공된다.
  • 28.
  • 29.
  • 30. 람다 표현식 조합 • Java.util.function 패키지에서 제공하는 함 수형 인터페이스 중 일부는 static 메소드 형태의 유틸리티 메소드를 가지고 있다. – Predicate – Function – Comparator • 유틸리티 메소드를 조합해서 복잡한 람다 식을 만들수 있다.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36. 기본형 특화 함수형 인터페이스 • Autoboxing – 박싱(boxing) : 기본형을 참조형으로 변환 – 언박싱(unboxing) : 참조형을 기본형으로 변환 – 오토박싱(autoboxing) : 박싱과 언박싱이 자동으 로 일어나는 것으로 컴파일러가 편의를 위해 제공 한다. • 오토박싱에 의한 비용을 줄이기 위해서 Java8 에서는 기본형에 특화된 다양한 함수형 인터 페이스를 제공한다.
  • 37.
  • 38. 람다 클로저 • 클로저란 함수의 비지역변수를 자유롭게 참조할 수 있는 함수의 인스턴스를 가르킨 다. • 람다와 익명클래스 모두 클로저와 비슷하 게 동작한다. • 자바의 클로저는 비지역변수가 final로 정 의되어야 한다. – 익명클래스는 final 강제 – 람다는 추론
  • 39. 람다 클로저 Javascript Closure Lambda Closure 다른 함수의 인자로 전달가능 다른 메소드의 인자로 전달가능 클로저 외부에 정의된 변수값에 접근 가능 클로저 외부에 정의된 변수값에 접근 가능 (복사된 레퍼런스) 클로저 외부에 정의된 변수값 변 경 가능 클로저 외부에 정의된 변수값 변 경 불가 (final)
  • 40. 메서드 레퍼런스 • 메서드 레퍼런스를 이용하면 기존의 메서드 정의를 이용 하여 람다처럼 전달할 수 있다. • 람다식의 내용이 길어지면 가독성이 떨어지기 때문에 메 서드 레퍼런스를 사용하는 것이 바람직하다. • 메서드 레퍼런스는 특정 메서드만을 호출하는 람다식의 축약형이라고 생각해도 된다. • 컴파일러 입장에서는 함수형 인터페이스를 보고 추론을 하는 것보다 메서드 레퍼런스를 직접 보고 인스턴스를 만드는 것이 더 효율적이다.
  • 41. 메서드 레퍼런스 • Apple::getWeight – 연산자 :: 를 이용해서 Apple 클래스의 getWeight 메서드가 메서드 레퍼런스로 동작한다. – 실제 메서드를 호출하는 것이 아니므로 ()는 생략 – JVM은 런타임에 메서드 레퍼런스의 내용을 인스턴스로 만들어 전달한다. 람다식 메서드 레퍼런스 (Apple a) -> a.getWeight() Apple::getWeight () -> Thread.currentThead().dumpStack() Thead.currentThread()::dumpStack (str, i) -> str.substring(i) String::substring (String s) -> System.out.println(s) System.out::println
  • 42. 생성자 레퍼런스 • 클래스명과 new 연산자를 이용해서 기존 생성자의 레퍼런스를 만들 수 있다. • 다양한 파라메터를 가지는 생성자가 존재 하더라도 ClassName::new • 다수의 생성자가 존재할 경우 타입추론에 의해서 생성자를 찾아간다.
  • 43.