람다 (Lambda)

KIHYUK MOON·2023년 2월 8일
0
post-thumbnail
post-custom-banner

함수형 프로그래밍의 정의

순수함수

  • 동일한 입력에는 항상 같은 값을 반환해야함
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 함
  • 함수 내부에서 인자값을 변경하거나 프로그램의 상태를 변경하는 Side Effect가 없어야 함

비상태, 불변성

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.

선언형 함수

  • if, for, switch문 사용 금지

1급 객체와 고차 함수

  • 객체를 매개변수로 전달 할 수 있다.

람다 (Lambda)

화살표 (->) 기호를 사용하여 람다 표현식을 작성할 수 있다.
ex)
(매개변수목록) -> {실행문;}

  • 매개변수의 타입을 추론할 수 있는 경우에 타입을 생략할 수 있다
  • 매개변수가 하나일 때 괄호를 생략할 수 있다
  • 함수의 몸체가 하나의 명령문만으로 이루어진 경우에 중괄호{}를 생략할 수 있다

ex)

int add(int x, int y) {
	return x + y;
}
// 람다식으로 표현 하기
(int x, int y) -> {return x + y;}
str -> {System.out.println(str);}
// 매개변수가 여러개인 경우는 괄호를 생략할 수 없습니다.
x,y -> {System.out.println(x + y)}; // 잘못된 형식
  • 중괄호 안의 구현 부분이 한 문장인 경우 중괄호 생략 가능
str -> System.out.println(str);
  • 중괄호 안의 구현부분이 return문 하나라면 중괄호와 return 모두 생략하고 식만 작성
(x, y) -> x + y // 두 값을 더하여 반환함
str -> str.length() // 문자열 길이를 반환 함

함수형 인터페이스

람다식은 메소드 이름이 없고 메소드를 실행하는데 필요한 매개변수와 매개변수를 활용한 실행 코드를 구현하는 것이다. 함수형 언어는 함수만 따로 호출할 수 있지만 자바는 참조변수 없이 메소드를 호출할 수 없기 때문에 람다식을 구현하기 위해 함수형 인터페이스를 만들고 인터페이스에 람다식으로 구현할 인터페이스를 선언해야한다.

참조변수의타입 참조변수의이름 = 람다표현식

위의 문법처럼 람다표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 한다.

함수형 인터페이스는 추상 클래스와 달리 단 하나의 추상 메소드만을 가져야 한다.
(@FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있음)

ex)

interface Calculator {
    int sum(int a, int b);
}

public class Sample {
    public static void main(String[] args) {
        Calculator mc = (int a, int b) -> a + b; // 인터페이스 상속을 받아서 클래스 대신 람다
        int result = mc.sum(3, 4);
        System.out.println(result);
    }
}

매개변수가 있는 람다식

@FunctionalInterface
interface MyFuncInterface {
    public void method(int x);
}
public class LambdaMainEx {
    public static void main(String[] args) {
        MyFuncInterface fi = (x) -> {
          int result = x * 5;
          System.out.println(result);
        };
        fi.method(2);
    }
}

리턴값이 있는 람다식

@FunctionalInterface
interface MyFuncInterface { // 함수형 인터페이스의 선언
    public int min(int x, int y); // 매소드가 반드시 한개만 존재
}

public class LambdaEx2 {
    public static void main(String[] args) {
        MyFuncInterface fi = (x, y)-> x < y ? x : y; // 구현부
        System.out.println(fi.min(3, 4)); // 호출부
    }
}

정적 메소드와 인스턴스 메소드 참조

  • 클래스::메소드
  • 참조변수::메소드
public static void main(String[] args) {
	IntBinaryOperator operator;
	
	//정적 메소드 참조 ---------------------------------
	operator = (x, y) -> Calculator.staticMethod(x, y);
	System.out.println("결과1: " + operator.applyAsInt(1, 2));

	operator = Calculator :: staticMethod;
	System.out.println("결과2: " +  operator.applyAsInt(3, 4));
	
	//인스턴스 메소드 참조 ---------------------------
	Calculator obj = new Calculator();
	operator = (x, y) -> obj.instanceMethod(x, y);
	System.out.println("결과3: " + operator.applyAsInt(5, 6));

	operator = obj :: instanceMethod;
	System.out.println("결과4: " + operator.applyAsInt(7, 8));
}

public class Calculator {
	public static int staticMethod(int x, int y) {
		return x + y;
	}
	public int instanceMethod(int x, int y) {
		return x + y;
	}
}
profile
개발자 전직중..
post-custom-banner

0개의 댓글