[JAVA] 함수형 인터페이스와 람다식

WOOK JONG KIM·2022년 10월 14일
0

패캠_java&Spring

목록 보기
20/103
post-thumbnail

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

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

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

함수의 구현호출만으로 프로그래밍이 수행되는 방식

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

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

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

함수를 기반으로 하는 프로그래밍이고 입력받는 자료 이외에 외부 자료를 사용하지 않아 여려 자료가 동시에 수행되는 병렬처리가 가능

함수형 프로그래밍은 함수의 기능이 자료에 독립적임을 보장
-> 동일한 자료에 대해 동일한 결과를 보장하고, 다양한 자료에 대해 같은 기능을 수행 가능

람다식 문법

익명 함수 만들기

매개 변수와 매개변수를 이용한 실행문 (매개변수) -> {실행문;}

간략하게 하고 싶으면 문법 찾아보기!

두 수를 입력 받아 더하는 add() 함수 예

int add(int x, int y){

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

public interface Add {

	public int add(int x, int y);
}
package ch02;

public class Addtest {

	public static void main(String[] args) {
		
		Add addL = (x,y) -> x+y;
		System.out.println(addL.add(2, 3));

	}

}

함수형 인터페이스 선언

람다식을 선언하기 위한 인터페이스

익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메서드만을 선언해야함

@FunctionalInterface 애노테이션(annotation)

@FunctionalInterface
public interface MyNumber {
	
	int getMax(int num1, int num2); 
}
public class MyNumberTest {

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

	}

}

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

두개의 문자열 연결하는 인터페이스

public interface StringConcat {
	
	public void makeString(String s1, String s2);

}

객체 지향 프로그래밍으로 구현하기

public class StringConCatImpl implements StringConcat{

	@Override
	public void makeString(String s1, String s2) {
		System.out.println( s1 + "," + s2 );
	}
}

public class TestStringConcat {

	public static void main(String[] args) {

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

람다식으로 구현하기

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

클래스 없이 이루어지는 것이 아니라 내부적으로 익명클래스를 사용함!

profile
Journey for Backend Developer

0개의 댓글