본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JAVA/람다,스트림

자바 람다식 기초 - 1

by 방구석 대학생 2021. 2. 27.

"자바 8 부터 나온 람다, 스트림 과 같은 함수형 프로그래밍의 기초적인 개념들을 정리하기 위한 글 입니다."

"더 자세한 내용은 '모던 자바 인 액션' 교재를 학습하며 포스팅 할 예정입니다."

 

 

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

보통 자바는 클래스가 없으면 메소드를 사용할 수 없는 데 반해, 함수의 구현과 호출만으로 프로그램을 만들 수 있는 프로그래밍 방식이 있다.

이를 함수형 프로그래밍 방식 이라고 한다.(FP : Functional Programming)

 

여기서 자바에서 제공하는 함수형 프로그래밍의 방식을 람다식 이라고 한다.

 

람다식은 간단히 설명하면 함수 이름이 없는 익명 함수를 만드는 것이다.

예시 : (매개변수) -> (실행문);

메소드 에서 사용하는 매개변수가 있고, 이 메소드가 매개변수를 사용하여 실행할 구현 내용, 즉 메소드의 구현부를 {} 내부에 작성한다.

 

예시 : 두 수를 입력받아 그 합을 반환하는 add() 함수가 있을 때 이를 람다식으로 변환

변환 전

int add(int x, int y){
	return x + y;
}

변환 후

(int x, int y) -> {return x + y;}

메소드 이름 add 와 반환형 int 를 없애고 -> 기호를 사용하여 구현한다.

함수의 이름이 있는 경우와 비교하면 꽤 간결하게 느껴진다.

 

 

람다식의 특징

1. 매개변수 자료형 생략 가능

2. 매개변수가 하나인 경우 괄호 생략 가능(하나 이상인 경우 생략 불가능)

str -> {System.out.println(str);} // 문자열 하나를 매개변수로 받아 출력
(x,y) -> {System.out.println(x + y);} // 매개변수가 하나 이상일 경우 괄호를 사용해야 한다.

3. 중괄호 안의 구현 부분이 한 문장인 경우 중괄호 생략 가능(한 문장이더라도 return 문은 생략할 수 없다.)

4. 중괄호 안의 구현 부분이 return 문 하나라면 중괄호와 return 을 모두 생략하고 식만 사용한다.

 

 

람다식 활용 예제

두 개의 매개변수 중 큰 수를 반환해보자.

1. 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메소드를 선언한다.(추상 메소드)

2. 람다식을 인터페이스 형 변수에 대입 후 해당 변수에서 선언해둔 추상 메소드를 호출한다.

- MyNumber.java

@FunctionalInterface
public interface MyNumber {
	int getMax(int num1, int num2); // 추상 메소드 선언
}

- TestMyNumber.java

import LambdaInterface.MyNumber;

public class TestMyNumber {
	public static void main(String[] args) {
		// 람다식을 인터페이스형 max 변수에 대입
		MyNumber max = (x,y) -> (x >= y) ? x : y;
		// 인터페이스형 변수로 메소드 호출  
		System.out.println(max.getMax(10, 20));
	}
}

 

 

* 함수형 프로그래밍은 순수 함수(pure function) 를 구현하고 호출함으로서 외부 자료에 부수적인 영향(side-effect) 을 주지 않도록 구현하는 방식이다.

: 순수 함수란 매개변수만을 사용하여 만드는 함수이다.

즉, 함수 내부에서 함수 외부에 있는 변수를 사용하지 않기 때문에 함수가 수행 되더라도 외부에 영향을 주지 않는다.

 

* 객체 지향 언어가 객체를 기반으로 구현하는 방식이라면, 함수형 프로그램은 함수를 기반으로 하고, 자료를 입력받아 구현하는 방식이다.

-> 함수가 입력받은 자료 이외에 외부 자료에 영향을 미치지 않기 때문에 여러 자료를 동시에 처리하는 병렬처리에 적합하며, 안정되고 확장성 있는 프로그램을 개발 할 수 있는 장점이 있다.

또한 순수 함수로 구현된 함수형 프로그램은 함수 기능이 자료에 독립적일 수 있도록 보장한다.

(동일한 입력에 대해서는 동일한 출력을 보장하고, 다양한 자료에 같은 기능을 수행할 수 있다.)

 

 

람다식은 어디에 선언하고 구현해야 할까?

- 함수형 언어에서는 함수만 따로 호출할 수 있지만, 자바에서는 참조변수 없이 메소드를 호출 할 수 없다.

- 그렇기 때문에 람다식을 구현하기 위해 함수형 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메소드를 선언한다.

- 람다식은 하나의 메소드를 구현하여 인터페이스형 변수에 대입하므로, 인터페이스에 두 개 이상의 메소드가 있어선 안된다.

(람다식은 이름이 없는 익명 함수로 구현하기 때문에 인터페이스에 메소드가 여러개 있다면 어떤 메소드를 구현한 것인지 모호해진다.)

 

'JAVA > 람다,스트림' 카테고리의 다른 글

자바 람다식 기초 - 2  (0) 2021.02.27