SlideShare a Scribd company logo
람다식
- 함수적 프로그래밍을 위해서 자바 8부터 람다식을 지원하면서 코드
패턴이 많이 바뀌게 됨.
- 익명 함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향
언어에 가깝다.
- 자바 코드가 매우 간결해지고, 컬렉션의 요소를 필터링하거나 매핑해
서 원하는 결과를 쉽게 집계할 수 있다.
Runnable runnable = new Runnable() {
public void run() {
...
}
};
Runnable runnable = () -> { ... };
- Runnable 인터페이스의 익명구현 객체 생성.
람다식
기본 문법
(타입 매개변수, ...) -> { 실행문; ... }
(int a) -> { System.out.println(a); }
(a) -> { System.out.println(a); }
a -> { System.out.println(a); }
람다식에서는 매개 변수의 타입을 일반적으로 언급하지 않으므로 다음처
럼.
(매개 변수 타입은 런타임 시에 대입되는 값에 따라 자동으로 인식)
하나의 매개변수만 있으면 괄호 생략 가능.
람다식
기본 문법
() -> { 실행문 ; ... }
(x, y) -> { return x+y ;}
(x, y) -> x+y
중괄호 안에 return문만 있을 경우 다음과 같이 씀.
람다식
타겟 타입
- 람다식은 메소드를 가지고 있는 객체를 생성.
인터페이스 변수 = 람다식;
- 람다식은 인터페이스 변수에 대입된다.
- 람다식은 인터페이스의 익명 구현 객체를 생성한다.
- 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 다르다.
- 람다식이 대입될 인터페이스를 람다식의 타겟 타입.
람다식
함수적 인터페이스
@FunctionalInterfacepublic
interface MyFunctionalInterface {
public void method();
public void otherMethod(); // 컴파일 오류
}
- 의미 : 하나의 추상 메소드가 선언된 인터페이스만이 람다
식의 타켓 타입이 될 수 있는데 이러한 인터페이스.
- 함수적 인터페이스를 작성할 때 두 개 이상의 추상 메소드
가 선언되지 않도록 컴파일러가 체킹해주는 기능
(@FunctionalInterface 어노테이션)
람다식
매개 변수와 리턴값이 없는 람다식(함수적 인터페이스)
public class MyFunctionalInterfaceExam {
public static void main(String[] args) {
MyFunctionalInterface fi;
//세 람다식이 같은 의미
fi = () -> {
String str = "method call1";
System.out.println(str);
};
fi.method();
//-----------------------------------------------------
fi = () -> {
System.out.println("method call2");
};
fi.method();
//-----------------------------------------------------
fi = () -> System.out.println("method call3");
fi.method();
}
}
람다식
매개 변수가 있는 람다식(함수적 인터페이스)
public class MyFunctionalInterfaceExam2 {
public static void main(String[] args) {
MyFunctionalInterface2 fi;
//두 람다식이 같은 의미
fi = (x) -> {
int result = x * 5;
System.out.println(result);
};
fi.method(2);
//-----------------------------------------------------
fi = x -> System.out.println(x * 5);
fi.method(2);
}
}
람다식
리턴값이 있는 람다식(함수적 인터페이스)
public class MyFunctionalInterfaceExam3 {
public static void main(String[] args) {
MyFunctionalInterface3 fi;
//네 람다식이 다 같은 의미
fi = (x, y) -> {
int result = x + y;
return result;
};
System.out.println(fi.method(2, 5));
//---------------------------------------------------------
fi = (x, y) -> {
return x + y;
};
System.out.println(fi.method(2, 5));
//---------------------------------------------------------
fi = (x, y) -> x + y;
System.out.println(fi.method(2, 5));
//---------------------------------------------------------
fi = (x, y) -> sum(x, y);
System.out.println(fi.method(2, 5));
}
public static int sum(int x, int y) {
return x + y;
}
}
람다식
클래스 멤버와 로컬 변수 사용
- 람다식 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를
사용할 수 있다.
클래스 멤버의 사용
- 람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를
제약 사항 없이 사용가능.
- 하지만 this 키워드를 사용할 때에는 주의.
- 일반적으로 익명 객체 내부에서 this는 익명 객체의 참조이지만,
람다식에서 this는 내부적으로 생성되는 익명 객체의 참조가 아니라
람다식을 실행한 객체의 참조.
람다식
클래스 멤버의 사용
public class UsingThis {
public int outterField = 10;
class Inner {
int innerField = 20;
void method() {
MyFunctionalInterface4 fi = () -> {
System.out.println("Outter Field: " + outterField);
System.out.println("Outter Field: " + UsingThis.this.outterField + "n");
System.out.println("Inner Field: " + innerField);
System.out.println("Inner Field: " + this.innerField + "n");
};
fi.method();
}
}
}
public class UsingThisExam {
public static void main(String[] args) {
UsingThis usingThis = new UsingThis();
UsingThis.Inner inner = usingThis.new Inner();
inner.method();
}
}
중첩 객체 Inner에서 람다식을 실행했기 때문에 람다식 내부에서의 this는 중첩 객체 Inner 입니다.
람다식
로컬 변수 사용
- 람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨
다고 봐야 합니다.
- 람다식에서 바깥 클래스의 필드나 메소드는 제한 없이 사용할 수 있으나, 메소드의
매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 final 특성을 가져야 합니다.
- 따라서 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내
부 또는 외부에서 변경할 수 없습니다.
public class UsingLocalVariable {
void method(int arg) {
int localVar = 40;
// arg = 31; // final 특성 때문에 수정 불가
// localVar = 41; // final 특성 때문에 수정 불가
MyFunctionalInterface5 fi = () -> {
System.out.println("arg: " + arg);
System.out.println("localVar: " + localVar);
};
fi.method();
}
}
람다식
표준 API의 함수적 인터페이스
- 자바 8 부터는 빈번하게 사용되는 함수적 인터페이스(Functional
Interface)는 java.util.function 표준 API 패키지로 제공합니다.
- 목적 : 함수적 인터페이스를 메소드 또는 생성자의 매개 타입으로 사
용하여 람다식을 대입할 수 있도록 하기 위해서 입니다.
- java.util.function 패키지의 함수적 인터페이스는 크게 Consumer,
Supplier, Function, Operator, Predicate로 구분됩니다.
람다식
Consumer 함수적 인터페이스
람다식
Supplier 함수적 인터페이스
람다식
Function 함수적 인터페이스
람다식
Operator 함수적 인터페이스
람다식
Predicate 함수적 인터페이스
람다식
andThen()과 compose() 디폴트 메소드
- Comsumer, Function, Operator 종류의 함수적 인터페이스는 andThen()
과 compose() 디폴트 메소드를 가지고 있습니다.
- andThen() 과 compose() 메소드는 두 개의 함수적 인터페이스를 순차적
으로 연결하고, 첫 번째 처리 결과를 두 번째 매개값으로 제공해서 최종 결
과값을 얻을 때 사용합니다.
- andThen()과 compose()의 차이점은 어떤 함수적 인터페이스부터 먼저
처리하느냐에 따라 다릅니다.
람다식
andThen()과 compose() 디폴트 메소드
- Consumer의 순차적 연결
- Function의 순차적 연결
람다식
and(), or(), negate() 디폴트 메소드와 isEqual() 정적 메소드
- 이 메소드들은 각각 논리 연산자인 &&, ||, !과 대응된다.
minBy(), maxBy() 정적 메소드
- 이 두 메소드는 매개값으로 제공되는 Comparator를 이용해서
최대 T와 최소 T를 얻는 BinaryOperator<T>를 리턴합니다.
람다식
메소드 참조
- 메소드 참조(Method Reference)는 말 그대로 메소드를 참조해서 매개 변수의
정보 및 리턴 타입을 알아내어, 람다식에서 불필요한 매개 변수를 제거하는 것
이 목적입니다.
정적 메소드와 인스턴스 메소드 참조
클래스 :: 메소드;
매개 변수의 메소드 참조
람다식에서 제공되는 a 매개 변수의 메소드를 호출해서 b 매개 변수
를 매개값으로 사용하는 경우
(a, b) -> { a.instanceMethod(b); }
Class :: instanceMethod
람다식
생성자 참조
- 생성자를 참조한다는 것은 객체 생성을 의미
(a, b) -> { return new Class(a, b); }
Class :: new;

More Related Content

PPTX
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
PPTX
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
PDF
java 8 람다식 소개와 의미 고찰
PDF
자바8 람다식 소개
PDF
JDK 변천사
PDF
자바8 람다 나머지 공개
PPTX
동작 파라미터와 람다 In java 8
PDF
나에 첫번째 자바8 람다식 지앤선
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
java 8 람다식 소개와 의미 고찰
자바8 람다식 소개
JDK 변천사
자바8 람다 나머지 공개
동작 파라미터와 람다 In java 8
나에 첫번째 자바8 람다식 지앤선

What's hot (19)

PPTX
자바 8 학습
PPTX
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
PDF
Lambda 란 무엇인가
PPTX
Java8 람다
PPTX
자바스크립트 함수
PDF
Java8 & Lambda
PPTX
자바스크립트 기초문법~함수기초
DOCX
Javascript 완벽 가이드 정리
PDF
Javascript 교육자료 pdf
PDF
일단 시작하는 코틀린
PDF
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
PDF
Java 8 api :: lambda 이용하기
PDF
자바8 스트림 API 소개
PPTX
프론트엔드스터디 E05 js closure oop
PDF
Start IoT with JavaScript - 1.기초
PDF
Java lambda
PDF
스위프트 성능 이해하기
PDF
Swift3 generic
PDF
Swift3 typecasting nested_type
자바 8 학습
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
Lambda 란 무엇인가
Java8 람다
자바스크립트 함수
Java8 & Lambda
자바스크립트 기초문법~함수기초
Javascript 완벽 가이드 정리
Javascript 교육자료 pdf
일단 시작하는 코틀린
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
Java 8 api :: lambda 이용하기
자바8 스트림 API 소개
프론트엔드스터디 E05 js closure oop
Start IoT with JavaScript - 1.기초
Java lambda
스위프트 성능 이해하기
Swift3 generic
Swift3 typecasting nested_type
Ad

Similar to 이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR) (20)

PDF
Java jungsuk3 ch14_lambda_stream
PPTX
자바 8
PPTX
2. lambda expression
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
PDF
자바8강의 1강. lambda expression
PDF
자바8정리.pdf
PDF
람다, 스트림 Api
PDF
Java_10 람다
PDF
Java stream v0.1
PDF
Java stream v0.1
PDF
씹고 뜯고 맛보고 즐기는 스트림 API
PPTX
Just java
PPTX
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 씹고 뜯고 맛보고 즐기는 스트림 API(박용권)
PDF
Java(3/4)
PPTX
JavaInAction 자바 8
PPTX
1. introduction to java8
PPTX
함수형 프로그래밍
PDF
Pure Function and Honest Design
PPT
Ai C#세미나
Java jungsuk3 ch14_lambda_stream
자바 8
2. lambda expression
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
자바8강의 1강. lambda expression
자바8정리.pdf
람다, 스트림 Api
Java_10 람다
Java stream v0.1
Java stream v0.1
씹고 뜯고 맛보고 즐기는 스트림 API
Just java
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 씹고 뜯고 맛보고 즐기는 스트림 API(박용권)
Java(3/4)
JavaInAction 자바 8
1. introduction to java8
함수형 프로그래밍
Pure Function and Honest Design
Ai C#세미나
Ad

이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)

  • 1. 람다식 - 함수적 프로그래밍을 위해서 자바 8부터 람다식을 지원하면서 코드 패턴이 많이 바뀌게 됨. - 익명 함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다. - 자바 코드가 매우 간결해지고, 컬렉션의 요소를 필터링하거나 매핑해 서 원하는 결과를 쉽게 집계할 수 있다. Runnable runnable = new Runnable() { public void run() { ... } }; Runnable runnable = () -> { ... }; - Runnable 인터페이스의 익명구현 객체 생성.
  • 2. 람다식 기본 문법 (타입 매개변수, ...) -> { 실행문; ... } (int a) -> { System.out.println(a); } (a) -> { System.out.println(a); } a -> { System.out.println(a); } 람다식에서는 매개 변수의 타입을 일반적으로 언급하지 않으므로 다음처 럼. (매개 변수 타입은 런타임 시에 대입되는 값에 따라 자동으로 인식) 하나의 매개변수만 있으면 괄호 생략 가능.
  • 3. 람다식 기본 문법 () -> { 실행문 ; ... } (x, y) -> { return x+y ;} (x, y) -> x+y 중괄호 안에 return문만 있을 경우 다음과 같이 씀.
  • 4. 람다식 타겟 타입 - 람다식은 메소드를 가지고 있는 객체를 생성. 인터페이스 변수 = 람다식; - 람다식은 인터페이스 변수에 대입된다. - 람다식은 인터페이스의 익명 구현 객체를 생성한다. - 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 다르다. - 람다식이 대입될 인터페이스를 람다식의 타겟 타입.
  • 5. 람다식 함수적 인터페이스 @FunctionalInterfacepublic interface MyFunctionalInterface { public void method(); public void otherMethod(); // 컴파일 오류 } - 의미 : 하나의 추상 메소드가 선언된 인터페이스만이 람다 식의 타켓 타입이 될 수 있는데 이러한 인터페이스. - 함수적 인터페이스를 작성할 때 두 개 이상의 추상 메소드 가 선언되지 않도록 컴파일러가 체킹해주는 기능 (@FunctionalInterface 어노테이션)
  • 6. 람다식 매개 변수와 리턴값이 없는 람다식(함수적 인터페이스) public class MyFunctionalInterfaceExam { public static void main(String[] args) { MyFunctionalInterface fi; //세 람다식이 같은 의미 fi = () -> { String str = "method call1"; System.out.println(str); }; fi.method(); //----------------------------------------------------- fi = () -> { System.out.println("method call2"); }; fi.method(); //----------------------------------------------------- fi = () -> System.out.println("method call3"); fi.method(); } }
  • 7. 람다식 매개 변수가 있는 람다식(함수적 인터페이스) public class MyFunctionalInterfaceExam2 { public static void main(String[] args) { MyFunctionalInterface2 fi; //두 람다식이 같은 의미 fi = (x) -> { int result = x * 5; System.out.println(result); }; fi.method(2); //----------------------------------------------------- fi = x -> System.out.println(x * 5); fi.method(2); } }
  • 8. 람다식 리턴값이 있는 람다식(함수적 인터페이스) public class MyFunctionalInterfaceExam3 { public static void main(String[] args) { MyFunctionalInterface3 fi; //네 람다식이 다 같은 의미 fi = (x, y) -> { int result = x + y; return result; }; System.out.println(fi.method(2, 5)); //--------------------------------------------------------- fi = (x, y) -> { return x + y; }; System.out.println(fi.method(2, 5)); //--------------------------------------------------------- fi = (x, y) -> x + y; System.out.println(fi.method(2, 5)); //--------------------------------------------------------- fi = (x, y) -> sum(x, y); System.out.println(fi.method(2, 5)); } public static int sum(int x, int y) { return x + y; } }
  • 9. 람다식 클래스 멤버와 로컬 변수 사용 - 람다식 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를 사용할 수 있다. 클래스 멤버의 사용 - 람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를 제약 사항 없이 사용가능. - 하지만 this 키워드를 사용할 때에는 주의. - 일반적으로 익명 객체 내부에서 this는 익명 객체의 참조이지만, 람다식에서 this는 내부적으로 생성되는 익명 객체의 참조가 아니라 람다식을 실행한 객체의 참조.
  • 10. 람다식 클래스 멤버의 사용 public class UsingThis { public int outterField = 10; class Inner { int innerField = 20; void method() { MyFunctionalInterface4 fi = () -> { System.out.println("Outter Field: " + outterField); System.out.println("Outter Field: " + UsingThis.this.outterField + "n"); System.out.println("Inner Field: " + innerField); System.out.println("Inner Field: " + this.innerField + "n"); }; fi.method(); } } } public class UsingThisExam { public static void main(String[] args) { UsingThis usingThis = new UsingThis(); UsingThis.Inner inner = usingThis.new Inner(); inner.method(); } } 중첩 객체 Inner에서 람다식을 실행했기 때문에 람다식 내부에서의 this는 중첩 객체 Inner 입니다.
  • 11. 람다식 로컬 변수 사용 - 람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨 다고 봐야 합니다. - 람다식에서 바깥 클래스의 필드나 메소드는 제한 없이 사용할 수 있으나, 메소드의 매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 final 특성을 가져야 합니다. - 따라서 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내 부 또는 외부에서 변경할 수 없습니다. public class UsingLocalVariable { void method(int arg) { int localVar = 40; // arg = 31; // final 특성 때문에 수정 불가 // localVar = 41; // final 특성 때문에 수정 불가 MyFunctionalInterface5 fi = () -> { System.out.println("arg: " + arg); System.out.println("localVar: " + localVar); }; fi.method(); } }
  • 12. 람다식 표준 API의 함수적 인터페이스 - 자바 8 부터는 빈번하게 사용되는 함수적 인터페이스(Functional Interface)는 java.util.function 표준 API 패키지로 제공합니다. - 목적 : 함수적 인터페이스를 메소드 또는 생성자의 매개 타입으로 사 용하여 람다식을 대입할 수 있도록 하기 위해서 입니다. - java.util.function 패키지의 함수적 인터페이스는 크게 Consumer, Supplier, Function, Operator, Predicate로 구분됩니다.
  • 18. 람다식 andThen()과 compose() 디폴트 메소드 - Comsumer, Function, Operator 종류의 함수적 인터페이스는 andThen() 과 compose() 디폴트 메소드를 가지고 있습니다. - andThen() 과 compose() 메소드는 두 개의 함수적 인터페이스를 순차적 으로 연결하고, 첫 번째 처리 결과를 두 번째 매개값으로 제공해서 최종 결 과값을 얻을 때 사용합니다. - andThen()과 compose()의 차이점은 어떤 함수적 인터페이스부터 먼저 처리하느냐에 따라 다릅니다.
  • 19. 람다식 andThen()과 compose() 디폴트 메소드 - Consumer의 순차적 연결 - Function의 순차적 연결
  • 20. 람다식 and(), or(), negate() 디폴트 메소드와 isEqual() 정적 메소드 - 이 메소드들은 각각 논리 연산자인 &&, ||, !과 대응된다. minBy(), maxBy() 정적 메소드 - 이 두 메소드는 매개값으로 제공되는 Comparator를 이용해서 최대 T와 최소 T를 얻는 BinaryOperator<T>를 리턴합니다.
  • 21. 람다식 메소드 참조 - 메소드 참조(Method Reference)는 말 그대로 메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에서 불필요한 매개 변수를 제거하는 것 이 목적입니다. 정적 메소드와 인스턴스 메소드 참조 클래스 :: 메소드; 매개 변수의 메소드 참조 람다식에서 제공되는 a 매개 변수의 메소드를 호출해서 b 매개 변수 를 매개값으로 사용하는 경우 (a, b) -> { a.instanceMethod(b); } Class :: instanceMethod
  • 22. 람다식 생성자 참조 - 생성자를 참조한다는 것은 객체 생성을 의미 (a, b) -> { return new Class(a, b); } Class :: new;