[자바] 람다(Lambda)

손경이·2023년 11월 7일
0

자바

목록 보기
10/17

2023.11.07 [테킷 백엔드 장희성 강사님 강의]

람다(Lambda)

좋은점

  • 람다가 코드를 짧게하고 가독성에도 좋게 한다.

람다표현식이 되는 과정

  • 아래의 과정을 하나씩 살펴보면 재밌을거다.
  • 람다표현식
    • Lambda::heal : Lambda클래스 안에 heal()메서드를 쓴다.
    • (hp) -> System.out.println("Hong4_7 : heals " + hp + " hp"); : 매개변수 hp를 받아서 System.~출력문 실행
package com.ll.date20231107;

public class Lambda {
    // 두번째 방법 : 클래스는 클래스 안에도 만들 수 있다.
    // 그때는 static을 붙여야 한다.
    public static class Hong4_2 implements Doctor4 {
        @Override
        public void heal(int hp) {
            System.out.println("Hong4_2 : heals " + hp + " hp");
        }
    }

    public static void main(String[] args) {
        // 첫번째 방법 : 정석
        Doctor4 doctor1 = new Hong4_1();

        doctor1.heal(100);

        // 두번째 방법 : 클래스는 클래스 안에도 만들 수 있다.
        Doctor4 doctor2 = new Hong4_2();

        doctor2.heal(100);

        // 세번째 방법 : 클래스를 main()메서드 안에 넣을 수 있다.
        // 이 클래스는 오직 자신이 만들어진 main()메서드 안에서만 쓸 수 있다.
        class Hong4_3 implements Doctor4 {
            @Override
            public void heal(int hp) {
                System.out.println("Hong4_3 : heals " + hp + " hp");
            }
        }
        Doctor4 doctor3 = new Hong4_3();

        doctor3.heal(100);

        // 네번째 방법 : 'class Hong4_4 implements'를 제거할 거다.
        // 익명 클래스
        Doctor4 doctor4 = new Doctor4() {
            @Override
            public void heal(int hp) {
                System.out.println("Hong4_4 : heals " + hp + " hp");
            }
        };

        doctor4.heal(100);

        // 다섯 번째 방법 : Doctor4 클래스의 메서드가 하나일 때 가능
        // 어차피 구현해야하는 메서드는 1개라서 heal을 생략
        Doctor4 doctor5 = (int hp) -> {
            System.out.println("Hong4_5 : heals " + hp + " hp");
        };

        doctor5.heal(100);

        // 여섯 번째 방법 : 구현할 메서드가 1개밖에 없을 때 hp가 int인 것을 알고 있다.
        // int 생략
        Doctor4 doctor6 = (hp) -> {
            System.out.println("Hong4_6 : heals " + hp + " hp");
        };

        doctor6.heal(100);

        // 일곱 번째 방법 : 실행해야 할 명령이 1개만 있어서 {}중괄호 생략
        // 만약에 return이 있다면 return도 생략가능
        // 무엇이든 한 줄이 있다면 생략 가능
        Doctor4 doctor7 = (hp) -> System.out.println("Hong4_7 : heals " + hp + " hp");

        doctor7.heal(100);

        // 여덟 번째 방법 : static void heal(int hp) {} 메서드 만들기
        Doctor4 doctor8 = (hp) -> heal(hp);

        doctor8.heal(100);

        // 여덟 번째 방법 v2 : 여덟 번째 방법에서 hp 인자랑 heal(hp)의 hp 인자랑
        // 갯수가 똑같고 그냥 넘겨주는 거일 때
        // Lambda::heal : Lambda 클래스 안에 있는 heal()메서드이다라는 뜻
        Doctor4 doctor8v2 = Lambda::heal;

        doctor8v2.heal(100);

        // 아홉 번째 방법 : 응용
        Doctor4 doctor9 = hp -> System.out.println(hp);

        doctor9.heal(100);

        // 아홉 번째 방법 v2 : 응용
        Doctor4 doctor9v2 = System.out::println;

        doctor9v2.heal(100);
    }

    // 여덟 번째 방법 : static void heal(int hp) {} 메서드 만들기
    static void heal(int hp) {
        System.out.println("Hong4_8 : heals " + hp + " hp");
    }
}

interface Doctor4 {
    void heal(int hp);
}

// 첫번째 방법 : 정석, 일반적인 방식
class Hong4_1 implements Doctor4 { // Hong4 is Doctor4
    @Override
    public void heal(int hp) {
        System.out.println("Hong4_1 : heals " + hp + " hp");
    }
}

0개의 댓글