Burninghering's Blog
article thumbnail

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

자바는 객체 지향 프로그래밍이며 기능을 수행하기 위해서, 객체를 만들고, 그 객체 내부에 멤버 변수를 선언하고 기능을 수행하는 메서드를 구현한다.

 

그런데

자바 8부터 함수형 프로그래밍 방식을 지원하고 이를 람다식이라 이른다.

 

함수형 프로그래밍(Functional Programming: FP)

함수를 기반으로 하는 프로그래밍이며 함수의 구현과 호출만으로 프로그래밍이 수행되는 방식

입력받는 자료(매개변수)이외에 외부 자료(외부 변수)를 사용하지 않아 여러 자료가 동시에 수행되는 병렬처리가 가능합니다.

함수형 프로그래밍은 함수의 기능이 자료에 독립적임을 보장합니다.

이는 동일한 자료에 대해 동일한 결과를 보장하고, 다양한 자료에 대해 같은 기능을 수행할 수 있습니다.

 

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

순수 함수란 매개변수만을 사용하여 만드는 함수 입니다. 즉 함수 내부에서, 함수 외부에 있는 변수를 사용하지 않아 함수가 수행되더라도 외부에는 영향을 주지 않습니다.

 

자바에서 제공하는 함수형 프로그래밍, <람다식 문법>

  • 익명 함수 만들기(함수의 이름이 없다.)
  • 매개 변수와 매개변수를 이용한 실행문 : (매개변수) -> {실행문;}
  • 가독성이 조금 떨어짐..!

 

  • 두 수를 입력 받아 더하는 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;

 

예제 코드

Add.java(I)

package ch02;

public interface Add { //람다식을 쓰기 전, 인터페이스를 만들고

	public int add(int x, int y); //함수를 구현해놓는다.
}

AddTest.java

package ch02;

public class AddTest {

	public static void main(String[] args) {
		Add addL = ( x, y )-> {return x+y;}; //Add가 구현되었다!
		Add addM= ( x,y )-> x+y;
		
		System.out.println(addL.add(2, 3));
		System.out.println(addM.add(2, 3));
	}
}

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

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

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

Add.java
AddTest.java

람다식 구현과 호출

package ch03;

@FunctionalInterface
public interface MyNumber {
	int getMax(int num1,int num2);
}
package ch03;

public class MyNumberTest {

	public static void main(String[] args) {
		MyNumber myNumber = (x,y)->x>y? x: y;
		
		System.out.println(myNumber.getMax(10, 20));
	}
}

'JAVA' 카테고리의 다른 글

6-4.스트림(Stream)  (0) 2022.02.27
6-3.객체지향 프로그래밍 vs 람다식 차이  (0) 2022.02.26
6-1.여러 내부 클래스의 정의와 유형  (0) 2022.02.24
5-10.컬렉션 프레임워크  (0) 2022.02.22
5-9.제네릭 메서드  (0) 2022.02.21
profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.