오늘이라도

[Java] 함수형 프로그래밍과 람다식 본문

개발 공부/Java

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

upcake_ 2021. 8. 18. 20:58
반응형

https://www.inflearn.com/course/the-java-java8#

백기선 개발자님의 더 자바, Java 8 강의를 들으면서 정리한 내용입니다.


//어노테이션을 붙여서 위반할때 에러가 뜬다.
//함수형 인터페이스를 만들고자 할때 붙여주면 좋다.
@FunctionalInterface
public interface RunSomething {
	// 인터페이스에 '추상 메서드'가 하나만 있으면 함수형 인터페이스
	// 인터페이스의 구현체를 만들때 메서드를 구현해줘야한다.
	// 원래는 abstract void가 붙으나 인터페이스에서는 생략가능하다.
	// public도 생략 가능하다
	void doIt();
	
	// 하나 더 메서드가생기면 함수형 인터페이스가 아님
//	void doItAgain();
	
	// 1.8에서 인터페이스에 static 메서드 정의 가능
	static void printName() {
		System.out.println("Lee");
	}
	
	// 디폴트 메서드도 정의 가능
	// 이렇게 다른 형태의 메서드가 있더라도 추상 메서드가 하나라면 함수형 인터페이스다
	default void printAge() {
		System.out.println("100");
	}
}

 

public interface RunSomething2 {
	int doit(int number);
}

 

public class Foo {
	public static void main(String[] args) {
		//익명 내부 클래스 anonymous inner class
		RunSomething runSomething1 = new RunSomething() {
			@Override
			public void doIt() {
				System.out.println("Hello");
			}
		};
		runSomething1.doIt();
		
		//람다식으로 표현
		//이클립스의 경우 RunSomething()의 RunSomething에 블럭을 한 뒤 Ctrl + 1로 바꿀 수 있다
		//람다식으로 표현하면 내부적으론 동일하나 코드를 많이 줄일 수 있다.
		//함수형 인터페이스를 1라인으로 구현한 특수한 object로 볼 수 있다.
		runSomething1 = () -> System.out.println("Hello");
		runSomething1.doIt();

		//한줄일 경우에만 블럭 없이 표현가능하다
		runSomething1 = () -> {
			System.out.println("Hello");
			System.out.println("Lambda");
		};
		runSomething1.doIt();
		
		System.out.println("-------------------------------------------------------------------------------------------------");
		//수학적인 함수에서 중요한 것은 입력받은 값이 동일한 경우, 결과가 같아야 한다.
		RunSomething2 runSomething2 = (number) -> number + 10;
		
		//1을 넣었으면 계속해서 11이 나와야 한다.
		//그렇지 않다면 함수형 프로그래밍이라 하기 어렵다.
		System.out.println(runSomething2.doit(1));
		System.out.println(runSomething2.doit(1));
		System.out.println(runSomething2.doit(1));
		
		//그렇지 않을 경우 1 : 함수 밖의 값을 참조해서 사용하는 경우
		//함수 밖
		runSomething2 = new RunSomething2() {
			//함수 밖
			//baseNumber 같이 함수 밖의 값이 있다면 pure한 함수라고 보지 않는다.
			//상태값을 가진다고 말한다.
			int baseNumber = 10;
			
			@Override
			public int doit(int number) {
				//그렇지 않을 경우 2 : 함수 밖의 값을 변경하는 경우
				baseNumber++;
				return number + baseNumber;
			}
		};
		
		//함수형 프로그램밍이 가능하다고 해서 무조건 할 필요는 없다.
		//문법이 허용하는 내에서 필요하면 함수형 프로그래밍을 하거나 편의를 위해 사용하면 된다.
	}
}
반응형