Ch14-1~4. Lambda
0. 목차
Chapter14. 람다와 스트림
Ch14 - 1. 람다식(Lambda Expression)
Ch14 - 2. 람다식 작성하기
Ch14 - 3. 람다식의 예
Ch14 - 4. 람다식은 익명 함수? 익명 객체!
Ch14 - 1. 람다식(Lambda Expression)
▶ 함수형 언어
▷ java = 객체지향 + 함수형 언어
▷ python, js… = 객체지향 + 함수형 언어
▶ 람다식(Lambda Expression)이란?
▷ 함수(메서드)를 간단한 ‘식(expression)’으로 표현하는 방법
// 함수(메서드)
int max(int a, int b) {
return a > b ? a : b;
}
// 간단한 식(expression)
(a, b) -> a > b ? a : b
}
▷ 익명 함수(이름 없는 함수, anonymous fuction)
int max
(int a, int b) ->
{
return a > b ? a : b;
}
함수(메서드) → 람다식 : 반환 타입, 이름 삭제
▶ 함수와 메서드의 차이
▷ 근본적으로 동일
▷ 함수는 일반적 용어 / 메서드는 객체지향 개념 용어
▷ 함수는 클래스에 독립적 / 메서드는 클래스에 종속적
- java에서는 클래스 외부에 존재 불가 → 그래서 java에서는 함수 없음, 모두 메서드
Ch14 - 2. 람다식 작성하기
▶ 람다식 작성 방법
▷ 메서드의 이름, 반환타입 제거 후 '->'
를 블록{} 앞에 추가
// 함수(메서드)
int max(int a, int b) {
return a > b ? a : b;
}
// 람다식
(int a, int b) -> {
return a > b ? a : b;
}
▷ 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능
▷ 끝에 ';'
안 붙임
// 함수(메서드)
(int a, int b) -> {
return a > b ? a : b;
}
// 람다식 : 더 간단한 식(expression)
(int a, int b) -> a > b ? a : b
}
▷ 매개변수의 타입이 추론 가능하면 생략가능(대부분 생략 가능)
// 람다식 : 더 간단한 식(expression)
(int a, int b) -> a > b ? a : b
}
// 람다식 : 더더 간단한 식(expression)
(a, b) -> a > b ? a : b
}
▶ 람다식 작성 시 주의 사항
▷ 매개변수가 하나인 경우, 괄호() 생략 가능(타입이 없을 때만)
(a) -> a * a
(int a) -> a * a
// ↓↓↓↓ 매개변수 하나, 괄호() 생략 ↓↓↓↓
a -> a * a // OK
int a -> a * a // ERROR, 타입이 없을 때만 생략 가능
▷ 블록{} 안의 문장이 하나 뿐일 때, 괄호{} 생략 가능(끝에 ‘;’ 안 붙임)
(int i) -> {
System.out.println(i)
}
// ↓↓↓↓ 블록{} 안 문장 하나, 괄호{} 생략 ↓↓↓↓
(int i) -> System.out.println(i)
Ch14 - 3. 람다식의 예
▶ 메서드1
int max(int a, int b) {
return a > b ? a : b;
}
▷ 람다식
(a, b) -> a > b ? a : b
▶ 메서드2
int printVar(String name, int i) {
System.out.println(name + "=" + i)
}
▷ 람다식
(name, i) -> System.out.println(name + "=" + i)
▶ 메서드3
int square(int x) {
return x * x;
}
▷ 람다식
x -> x * x
▶ 메서드4
int roll() {
return (int)(Math.random() * 6);
}
▷ 람다식
() -> (int)(Math.random() * 6)
Ch14 - 4. 람다식은 익명 함수? 익명 객체!
▶ 익명 객체
▷ 익명 클래스에 의해 만들어진 것
▷ 객체의 선언과 생성을 동시에
▶ 람다식은 익명 함수가 아닌 익명 객체!
▷ 결국 람다식은 객체
// 람다식
(a, b) -> a > b ? a : b
// 원래 람다식의 모습
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
▷ 람다식(익명 객체)을 다루기 위한 참조 변수가 필요
▷ 그럼 참조 변수 타입은?
// 익명 함수 참조 변수의 타입은 Object
Object obj = new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
// 객체를 다루기 위해 람다식의 타입을 Object로?
Object obj = (a, b) -> a > b ? a : b; // 어떤 타입?
// Object 리모콘으로 max() 버튼이 없음, 실제로 있어도 리모콘에 기능 버튼 없으면 못씀
int value = obj.max(3, 5); // ERROR, obj(참조 변수) 안에 max()가 있음, 근데 Object(리모콘) 안에 max()가 없음
▶ 실습
▷ 람다식, 익명객체
Object obj = (a, b) -> a > b ? a : b; // ERROR, 익명 객체를 생서했는데 익명 클래스가 없어서
▷ 익명 클래스 생성
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
};
▷ 익명 클래스를 객체로 사용하려면 타입이 필요
▷ Object 타입 선언
Object obj = new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
};
▷ obj 사용
int value = obj.max(3, 5) // ERROR, obj에는 max() 존재, Object(리모콘)에는 max() 없음
사실 java는 함수가 없는 구조 다 메서드 그래서 함수형 인터페이스가 필요