JAVA

JAVA 람다

테라시아 2024. 11. 17. 14:38

Lambda(람다)
(1) 1930년대, 알론조 처치라는 수학자가 제시한
    함수의 수학적 표기법
    => Lambda Calculus(람다 대수)에 기초
    Java 8(2014)부터 지원
    객체 지향 프로그래밍에 
    함수형 프로그래밍의 특징이 추가

(2) 함수형 프로그래밍
    일반적으로 메서드끼리 **데이터**를 주고 받는다.
    함수형 프로그래밍은 데이터는 이미 존재, 
    함수를 넘겨주는 방식

    Java의 함수(메서드)는 기본적으로 
    어떤 클래스의 소속이어야 함
    => 나보고 정의하라는 것도 짜증나는데
       클래스도 만들어야 되냐??
    => 심지어 일회성이냐?
    => 미안해 그럼 익명 객체로 하게 해줄께

(3) 익명 객체(Anonymous Object)
    첫 번째, 데이터 개수는 고정이니 선언은 할 수 있네
            => 인터페이스
    두 번째, 객체를 생성할 때(클래스를 안 만들고)
            메서드를 구현
            => 사용자가 메서드를 만들어야 하는데,
               메서드 정의가 너무 긴거 아님?
            => 줄여야겠다 => 람다식
(4) 정리
    무슨 타입인지를 사용자에게 맡김
    => Generic
    무슨 함수를 사용할지를 사용자에게 맡김
    => 함수형 프로그래밍
    함수를 (    )에 다 넣으려니 길고 복잡
    => 람다식

(5) 기본 형식
    Method(매개변수들.....){
        실행문;
    }

    (매개변수들.....) -> { 실행문; }

 

☆ Code

 

★ Calcuable

public interface Calculable {
	public void calculate(int x, int y);
}

 

★ CalcuableClass

public class CalculableClass implements Calculable {
	public void calculate(int x, int y) {
		System.out.println("[일반객체] " + (x+y));
	}
}

 

★ CalcuableReturn

public interface CalculableReturn {
	public double calculate(int r);
}

 

★ LambdaMain

import java.util.ArrayList;

public class LambdaMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 1. Standard
		CalculableClass cc = new CalculableClass();
		cc.calculate(100, 1000);
		
		// 2. Anonymous Instance(익명객체)
		Calculable c1 = new Calculable() {
			public void calculate(int x, int y) {
				System.out.println("[익명객체-일반] " + (x*y));
			}
		};
		c1.calculate(100, 1000);
		
		// 3. Lambda I : 람다식으로 정의하면 자동으로 메서드와 매핑
		Calculable c2 = (x, y) -> { System.out.println("[람다정식] " + (x*y)); };
		c2.calculate(100, 1000);
		
		// 4. Lambda II : return 값이 있는 경우
		CalculableReturn c3 = (x) -> { return 3.14 * x * 2; };
		System.out.println("[람다리턴] " + c3.calculate(100));
		
		// 5. 인풋이 1개 뿐이면 괄호 생략
		CalculableReturn c4 = x -> { return 3.14 * x * 2; };
		System.out.println("[람다리턴] " + c4.calculate(100));
		
		// 6. 리턴이 한 줄이면 중괄호도 생략
		CalculableReturn c5 = x -> 3.14 * x * 2;
		System.out.println("[람다리턴] " + c5.calculate(100));
		
		// 7. 인터페이스
		// UnaryOperator : 1개 입력, 1개 출력
		// BinaryOperator : 2개 입력, 1개 출력
		// Consumer, forEach
		
		// 8. 람다식의 대표적인 예제 -> forEach
		ArrayList<String> ar = new ArrayList();
		ar.add("Steak");
		ar.add("Striper");
		ar.add("Rock Group");
		
		for(String name : ar) {
			System.out.println(name);
		}
		
		ar.forEach(name -> System.out.println(name));
		ar.forEach(System.out::println);	
	}

}

'JAVA' 카테고리의 다른 글

Spring 게시판 검색기능  (1) 2024.12.29
JAVA 크롤링  (0) 2024.11.17
JAVA 제네릭  (0) 2024.11.17
JAVA 컬렉션 프레임워크  (1) 2024.11.16
JAVA 예외  (2) 2024.11.16