/ JAVAJUNGSUK

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는 함수가 없는 구조 다 메서드 그래서 함수형 인터페이스가 필요