본문 바로가기

개발/Java

람다식(Lambda expression)

반응형

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


java는 객체 지향 프로그래밍
기능을 수행하기 위해서는 객체를 만들고 그 객체 내부에 멤버 변수를 선언하고 기능을 수행하는 메서드를 구현
  • java 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;

 

함수형 인터페이스


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

여러 메서드로 인한 에러 발생

 


객체지향과 람다식 구현 비교

 

1. 객체지향 프로그래밍 예제

1) 인터페이스 선언

public interface StringConcat {

	public void makeString(String s1, String s2); 
	//String을 연결해서 출력해주는 인터페이스
}

2) 인터페이스를 구현한 클래스

public class StringConcatImpl implements StringConcat {

	@Override
	public void makeString(String s1, String s2) {

		System.out.println(s1 + "," + s2);
	}

}

3) 인스턴스를 생성하고 메서드 호출

public class TestStringConcat {

	public static void main(String[] args) {

		String s1 = "Hello";
		String s2 = "World";
		StringConCatImpl concat1 = new StringConCatImpl();
		concat1.makeString(s1, s2);
    }
}

 

2. 람다식 구현

1) 처음 만든 인터페이스에 @FunctionalInterface 애노테이션 적용

2) 람다식

StringConcat concat = (s,v) -> System.out.println(s + "," + v);
concat.makeString(s1, s2);

 

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


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

StringConcat concat2 = new StringConcat() {
			
	@Override
	public void makeString(String s1, String s2) {

		System.out.println(s1 + "...." + s2);
	}
};
	
concat2.makeString(s1, s2);

 

위 코드는 anonymous inner class로 만들어진 형태이다. 
이와 마찬가지로 람다식 내부는 사실 익명 클래스가 쓰이는 것이다.

 

반응형

'개발 > Java' 카테고리의 다른 글

reduce( ) 연산  (0) 2021.05.07
스트림(Stream)  (0) 2021.05.06
내부 클래스(inner class)  (0) 2021.05.04
Map 인터페이스 <HashMap> <TreeMap>  (0) 2021.05.04
Set 인터페이스 <HashSet> , <TreeSet>  (0) 2021.05.02