Java

[Java] 12. Lambda Expression(람다식)

Joo.v7 2024. 9. 1. 23:52

Chapter 1:  Lambda Expression 개요

  • Functional Interface
  • Anonymous Class
  • Lambda Expression 사용

Chapter 2:  Lambda Expression 사용

  • Lambda Expression 형식
  • 메소드 참조

Chapter 3:  Lambda Expression 활용


Chapter 1:  Lambda Expression 개요

 Anonymous Method 형식으로 동작하는 Lambda Expression은 파라미터를 받아 짧은 코드 블록으로 수행하고 필요에 따라 값을 반환하는 표현 방법을 말한다.

 

Functional Interface  -> 람다식, 메서드 참조로 사용 가능.

  • 하나의 abstract method를 가지고 있는 Interface(SAM(Single Abstract Method) Interface)
  • @FunctionalInterface annotation이 적용될 수 있는 Target Interface.
  • Java에서 함수를 객체처럼 다룰 수 있도록 함.
    • 변수에 할당(Assignment) 할 수 있다.
    • 다른 함수의 인자(Argument)로 전달받는다.
    • 다른 함수의 결과로서 return 가능.
@FunctionalInterface
public interface BinaryOp {
    public int apply(int right, int left);
}

 

Anonymous Class (익명 클래스) -> 일회용

  • Functional Interface에 대한 Anonymous Class를 생성해 사용.
  • Anynymous Method는 단 한번만 사용 가능하고, 하나의 객체만을 생성할 수 있는 일회용 클래스.
@FunctionalInterface
public interface BinaryOp {
    public int apply(int right, int left);
}

BinaryOp binder = new BinaryOp() { 
    public int apply(int right, int left) {
        return right + left;
    }
};

// 아래와 같이 사용 가능
int result = binder.apply(3, 5); // 8

 

Lambda Expression -> 함수를 객체처럼 다룰 수 있다.

  • 파라미터를 받아 짧은 코드 블록을 수행하고, 필요에 따라 값을 return하는 표현 방법.
  • 메소드와 유사하지만 이름을 갖지 않으며, 표현식에 사용할 수 있는 모든 곳에서 구현 가능.
@FunctionalInterface
public interface BinaryOp {
    public int apply(int right, int left);
}

BinaryOp binder = (i, j) -> i + j;
@FunctionalInterface
public interface RunSomething {
    void doIt();

    static void printName(){
        System.out.println("catsbi");
    }

    default void printAge(){
        System.out.println("33");
    }
}

// 아래와 같이 사용 가능.
RunSomething run = () -> System.out.println("Hello, World!");
RunSomething run2 = () -> {
    System.out.print("Hello,");
    System.out.println(" World!");
};

 

 


 

Chapter 2:  Lambda Expression 사용

 

Lambda Expression 형식

  • 파라미터 목록과 표현 식의 블록으로 선언.

 

  • 파라미터 타입은 생략 가능.

 

  • 파라미터가 하나인 경우, 괄호 생략 가능.

 

  • 수행문이 하나이고, 지역 변수 선언 또는 return이 없는 경우 {} 생략 가능.

 

  • 괄호가 생략된 수행문에 return 키워드가 포함되어 있을 경우 return 생략 가능.

 

메소드 참조

  • 기존 메서드를 참조하여 함수형 interface의 구현을 간결하게 제공하는 방법.
  • Lambda Expression을 단순하게 만들어주는 구문.
  • Lambda Expression이 단 하나의 메소드만을 호출하는 경우에 사용.
  • 불필요한 Parameter를 제거하고 :: 기호를 사용하여 표현
public interface BinaryOp {
    public int apply(int i, int j);
}

class Calc {
    public static int add(int i, int j) { // static
        return i + j;
    }

    public int mult(int i, int j) {
        return i * j;
    }
}

class Test {
    public static void main(String[] args) {
        BinaryOp adder = Calc::add; // Calc 클래스의 정적 메서드 add를 참조함.
// Calc 클래스의 새로운 instance 생성 후 이것의 mult 메서드를 참조함(static이 아니라서 객체 생성 해야함)
        BinaryOp multer = new Calc()::mult; 
        System.out.println(adder.apply(1, 2)); // 3
        System.out.println(multer.apply(2, 3)); // 6
    }
}

 

 


 

Chapter 3:  Lambda Expression 활용

 

아래의 BinaryOp는 apply 그 자체가 된다. (FunctionalInterface: Interface 안에 추상 메소드 하나만 있는 것.)

@FunctionalInterface
interface BinaryOp {
    public int apply(int i, int j);
}

 

" BinaryOp b  " -> BinaryOp b를 객체화하는 4가지 방법

1. 클래스 구현: Interface를 구현하는 Class 만들기.

class Adder implements BinaryOp {
    public int apply(int i, int j) {
        return i + j;
    }
}

 

2. Anonymous Class (익명 클래스): @FunctionalInterface는 함수 그 자체라서 가능하다.

class Test {
    public static void main(String[] args) { // 2번
        BinaryOp b = new BinaryOp() {
            public int apply(int i, int j) {
                return i+j;
            }
        };
        b.apply(1,2);
    }
}

 

3. Lambda Expression 사용: 메소드 이름, parameter 타입, return 타입 생략 가능

class Test {
    public static void main(String[] args) { // 3번
        BinaryOp b = (int x, int y) -> {return x+y;};
        b.apply(1,2);
    }
}

 

4. 메소드 참조 사용

class Something { // 완전히 쓸데없는 것임.
    public static int doSomething(int i, int j) { 
    // apply와 시그니처가 같음. 
    // 그럼 binaryOp자리에 Something::doSomething 이렇게 가능함. 
    // 그럼 Something의 doSomethig. 이런 뜻이됨.
        System.out.println(i+j);
        return 10;
    }
}

class Test {
    public static void main(String[] args) {
        BinaryOp b = Something::doSomething;
        b.apply(1,2);
    }
}

 

 

2024.09.01 - [Java/연습 문제] - [Java 연습 문제] 학생 관리 시스템 *

 

[Java 연습 문제] 학생 관리 시스템 *

student pakageStudent.java더보기package student;public class CollegeBoy extends Student { private String doubleMajor; public CollegeBoy(int studentNo, String name, String cellphone) { super(studentNo, name, cellphone); } public CollegeBoy(int studentNo,

lightningtech.tistory.com

 


 

 

출처: https://github.com/gikpreet/class-programming_with_java

 

GitHub - gikpreet/class-programming_with_java

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com

 

 

'Java' 카테고리의 다른 글

[Java] 14. Collections Framework  (0) 2024.09.02
[Java] 13. Anotation(어노테이션)  (0) 2024.09.02
[Java] 11. Generics(제네릭)  (0) 2024.08.31
[Java] Singleton 패턴  (0) 2024.08.31
[Java] 10. Java에서의 상속  (0) 2024.08.30