JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter6

람다식(Lambda expression)

giggs 2022. 1. 17. 11:07

 

함수형 프로그래밍과 람다식

 

  • 자바는 객체 지향 프로그래밍 : 기능을 수행하긴 위해서는 객체(class)를 만들고 그 객체 내부에 멤버 변수를 선언하고 기능을 수행하는 메서드를 구현
  • 자바 8부터 함수형 프로그래밍 방식을 지원하고 이를 람다식이라 함
  • 함수형 프로그래밍 : 함수의 구현과 호출만으로 프로그래밍이 수행되는 방식
  • 함수형 프로그래밍(Functional Programming: FP) 함수를 기반으로 하는 프로그래밍이고 입력받는 자료(매개변수) 이외에 외부 자료를 사용하지 않아 여려 자료가 동시에 수행되는 병렬 처리가 가능합니다. 함수형 프로그래밍은 함수의 기능이 자료에 독립적임을 보장합니다. 이는 동일한 자료에 대해 동일한 결과를 보장하고, 다양한 자료에 대해 같은 기능을 수행할 수 있습니다.
  • 함수형 프로그래밍은 순수 함수(pure function)를 구현하고 호출함으로써 외부 자료에 부수적인 영향(side effect)을 주지 않도록 구현하는 방식입니다. 순수 함수란 매개 변수만을 사용하여 만드는 함수입니다. 즉, 함수 내부에서 함수 외부에 있는 변수를 사용하지 않아 함수가 수행되더라도 외부에는 영향을 주지 않습니다.->안정성

코드가 간결해지는 장점과 동시에 가독성이 떨어진다는 단점도 존재.

 

 

 

 

람다식 문법

  • 익명 함수 만들기 - 함수에 이름이 없다.
  • 매개 변수와 매개 변수를 이용한 실행문 (매개변수) -> {실행문;}  - java는 class가 있고 인스턴스 변수가 있고, 그것을 활용한 메서드를 구성하는 반면 FP는
  • 두 수를 입력받아 더하는 add() 함수 예
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문(반환 문)은 중괄호를 생략할 수 없음
str-> return str.length();  //오류
  • 실행문이 한 문장의 반환 문인 경우엔 return과 중괄호를 모두 생략
(x, y) -> x+y;
str -> str.length;

 

매개 변수가 하나인 경우 자료형과 괄호 생략 가능

매개변수가 두 개 이상인 경우 괄호를 생략할 수 없음

실행문이 한 문장인 경우 중괄호 생략 가능

실행문이 한 문장이라도 return문(반환 문)은 중괄호를 생략할 수 없음

실행문이 한 문장의 반환 문인 경우엔 return과 중괄호를 모두 생략

 


 

 

 

 


 

 

함수형 인터페이스와 람다식 구현하여 사용하기

 

함수형 인터페이스 선언하기

  • 람다식을 선언하기 위한 인터페이스
  • 익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메서드만을 선언해야 함
  • @FunctionalInterface 애노테이션(annotation)
  • 함수형 인터페이스라는 의미, 내부에 여러 개의 메서드를 선언하면 에러남

 

람다식 활용

 


 

객체지향 프로그래밍 vs 람다식 구현

 

객체 지향 프로그래밍과 람다식 비교

  • 문자열 두 개를 연결하여 출력하는 예제를 두 가지 방식으로 구현해 보자

 

객체 지향 프로그래밍

① 인터페이스 선언

②  인터페이스 구현한 클래스 생성

③  호출해서 출력 테스트

 

① 

 


람다식

① 함수형 인터페이스 선언

② 람다식으로 만들어 주고 호출해서 출력 테스트 - 

// 익명 내부 클래스와 익명 객체 생성되는 부분 생략되었지만 존재함 //

 

 


익명 객체를 생성하는 람다식

  • 자바에서는 객체 없이 메서드가 호출될 수 없음
  • 람다식을 구현하면 익명 내부 클래스가 만들어지고, 이를 통해 익명 객체가 생성됨

 

 

 


 

함수를 변수처럼 사용하는 람다식

 

 

변수 -  변수의 사용 3가지 - 모두 람다식도 사용 가능

특정 자료형으로 변수를 선언 한 후 값을 대입함   int a = 10;

매개 변수로 전달하여 사용함 		int add(int x, int y)

메서드의 반환 값으로 반환 하기		return num;

  • 인터페이스형 변수에 람다식 대입하기
@FunctionalInterface
interface PrintString{
	
	void showString(String str);
}
PrintString lambdaStr = s->System.out.println(s);  //람다식을 변수에 대입
lambdaStr.showString("hello lambda_1");

특정 자료형으로 변수를 선언한 후 값을 대입함 - 


  • 매개변수로 전달하는 람다식
showMyString(lambdaStr); 

public static void showMyString(PrintString p) {
	p.showString("hello lambda_2");
}

매개 변수로 전달하여 사용함


 

  • 반환 값으로 쓰이는 람다식
public static PrintString returnString() {         //반환 값으로 사용
		return s->System.out.println(s + "world");
}


PrintString reStr = returnString();  
reStr.showString("hello ");

 

메서드의 반환 값으로 반환 하기

 


 

 

review

람다식 
익명 함수 , 매개 변수만을 사용한 함수, 생략 가능 경우, 익명 객체, 변수처럼 사용

그동안 사용했던 함수들과 다른 함수로 객체지향 프로그래밍과의 비교도 해보았다.
인터페이스를 구현하는 클래스를 만들어주는 과정이 생략되어서 - 익명 내부 클래스와 익명 개체로
람다식으로  쉽게 한 줄에 나타낼 수 있었다.

다만 가독성이 떨어지는 부분도 확실히 느꼈고, 한 가지 메서드만 사용할 수 있어서
사용할 메서드가 많아질 때는  클래스를 구현해 놓고 호출해서 사용하는 법이 더 좋을 거 같다는 생각이 들었다.