220618_인터넷 강의_람다식과 함수형 프로그래밍

창고·2022년 10월 20일
0

티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/90

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

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

  • 함수형 프로그래밍은 순수함수(pure function)를 구현하고 호출함, 외부 자료에 부수적인 영향(side effect)를 주지 않도록 구현하는 방식
  • 순수 함수 : 매개변수만을 사용하여 만드는 함수. 함수 내부에서 함수 외부에 있는 변수를 사용하지 않아 함수가 수행되더라도 외부에는 영향을 주지 않음
  • 함수를 기반으로 하는 프로그래밍이고 입력받는 자료 이외에 외부 자료를 사용하지 않아 여려 자료가 동시에 수행되는 병렬처리가 가능
  • 함수형 프로그래밍은 함수의 기능이 자료에 독립적임을 보장하며, 이는 동일한 자료에 대해 동일한 결과를 보장하고, 다양한 자료에 대해 같은 기능을 수행할 수 있음

(2) 람다식

  • 자바 8부터 FP를 지원하며 이를 람다식으로 표현

2. 람다식 문법

(1) 문법 기본

  • 익명 함수 생성
  • 매개변수와 매개변수를 이용한 실행문 (매개변수) -> {실행문;}
(int x, int y) -> {return x+y;}
  • 매개변수가 하나인 경우 자료형, 괄호 생략 가능 (두 개 이상은 생략 불가)
str->{System.out.println(str);}
  • 실행문이 한 문장이며 return문이 아니라면 중괄호 생략 가능 (return 문일 경우 중괄호 생략 불가)
str-> System.out.println(str);
  • 실행문이 한 문장의 반환문인 경우 return, 중괄호 모두 생략
(x, y) -> x+y;
str -> str.length;
  • [Add.java]
public interface Add { // 함수를 구현하기 위한 인터페이스
	
	public int add(int x, int y); // 람다식으로 만들 추상 메소드

}
  • [AddTest.java]
public class AddTest {

	public static void main(String[] args) {
		
		Add addL = (x, y) -> {return x+y;}; // 인터페이스 Add의 add 메소드를 람다식으로 
		System.out.println(addL.add(2,3));

	}

}

(2) 함수형 인터페이스 선언

  • 람다식을 선언하기 위한 인터페이스
  • 익명 함수와 매개 변수만으로 구현되기 때문에 인터페이스는 단 하나의 메서드만을 선언해야 함
  • @FunctionalInterface 애노테이션 추가 (함수형 인터페이스라는 의미)
  • [Max.java]
@FunctionalInterface
public interface Max {
	
	int getMax(int num1, int num2);

}
  • [MaxTest.java]
public class MaxTest {

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

	}

}

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

  • [StringConcat.java]
@FunctionalInterface
public interface StringConcat {
	
	public void makeString(String s1, String s2);

}
  • [StringConcatImpl.java]
public class StringConcatImpl implements StringConcat{

	@Override
	public void makeString(String s1, String s2) {
		System.out.println(s1 + s2);
		
	}
}
  • [StringConcatTest.java]
public class StringConcatTest {

	public static void main(String[] args) {
		
		String s1 = "이엣";
		String s2 = "타이가";
		
		// O.O.P로 구현
		/* StringConcatImpl strImp = new StringConcatImpl();
		strImp.makeString(s1, s2); */
		
		// 람다식으로 구현
		StringConcat concat = (s, v) -> System.out.println(s + v); // 람다식 자체가 익명 객체를 생성함
		concat.makeString(s1,  s2);
	}
}
  • 람다식 내부에 익명 객체 생성이 포함되어 있어 (생략되어 있음) 객체가 없이도 구현이 가능한 것처럼 보임

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

public interface PrintString {
	
	void showString(String str);

}

public class TestLambda {

	public static void main(String[] args) {

		PrintString lambdaStr = s->System.out.println(s);  //람다식을 변수에 대입
		lambdaStr.showString("hello lambda_1");
		
		showMyString(lambdaStr);                          //메서드 매개변수로 전달
		
		PrintString reStr = returnString();  
		reStr.showString("hello ");
		
	}
	
	public static void showMyString(PrintString p) {
		p.showString("hello lambda_2");
	}
	
	public static PrintString returnString() {         //반환 값으로 사용
		return s->System.out.println(s + "world");
	}
}
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글