Contents
The Java8(함수형 인터페이스와 람다)
   Jul 5, 2022     4 min read

함수형 인터페이스와 람다

자바 8에서 추가된 것

Interface 안에서 static method를 정의할 수 있다. (자바 8)

public interface Test{

	void doIt(); // 추상 메소드 1

	//public을 생략할 수 있음
	static void printName() {
		System.out.println("Dante");
	}

}

Interface 안에 정의할 수 있는 method의 형태 다양해졌다 (자바 8)

public interface Test{

	void doIt(); // 추상 메소드 1


	default void printID() {
		System.out.println("39348");
	}

}

함수형 인터페이스 (Functional Interface)

  • 추상 메소드를 딱 하나만 가지고 있는 인터페이스
public interface Test{

	abstract void doIt(); // 추상 메소드 1

	//abstract void doIt2(); // 추상 메소드 2 넣으면 안됨!
}
  • SAM(Single Abstract Method) 인터페이스

  • @FuncationInterface 애노테이션을 가지고 있는 인터페이스

@FuncationalInterface
public interface Test{

	void doIt();

}

FunctionalInterface (Java Platform SE 8 )

람다 표현식(Lambda Expressions)

  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
  • 코드를 줄일 수 있다.
  • 메소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.

자바에서 함수형 프로그래밍

  • 함수를 First class object로 사용할 수 있다.
  • 순수 함수 (Pure function)
    • 사이드 이팩트가 없다. (함수 밖에 있는 값을 변경하지 않는다)
    • 상태가 없다.(함 밖에 있는 값을 사용하지 않는다.
public class Main{
	public static void main(String[] args){
		Test test = (number) -> return number + 10;


		System.out.println(test.doIt(1)); // 함수 밖에 있는 값을 변경하지 않는다
		System.out.println(test.doIt(1)); // 함수 밖에 있는 값을 변경하지 않는다
		System.out.println(test.doIt(1)); // 함수 밖에 있는 값을 변경하지 않는다

		System.out.println(test.doIt(2)); // 다른 값 나온다? 그럼 함수형 프로그래밍이라고 보기 어렵다.
		System.out.println(test.doIt(2));

	}
}

  • 고차 함수(Higher-ORder Funcation)
    • 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
  • 불변성

자바 8 이전에 함수형 인터페이스를 구현할 때 사용했던 익명클래스

예)

@FuncationalInterface
public interface Test{

	void doIt();

}

public class MainClass{

	public static void main(String[] args){
		Test test = new Test() {
			@Override
			public void doIt(){
				System.out.println("Hello");
			}
		};
	}
}
  • 자바 8 이후 사용하는 람다로 고쳤을 경우(함수형 인터페이스를 구현할 경우 람다로 가능 )

예)

@FuncationalInterface
public interface Test{

	void doIt();

}

public class MainClass{

	public static void main(String[] args){
		Test test = new Test() -> System.out.println("Hello");
	}
}
  • 출력이 두 줄일 경우
public class MainClass{
	public static void main(String[] args){
		Test test = new Test() -> {
				System.out.println("Hello");
				System.out.println("Lambda");
	}
}
  • 함수를 호출할 경우
public class MainClass{
	public static void main(String[] args){
		Test test = new Test() -> {
				System.out.println("Hello");
				test.doIt();
	}
}

참고 : 백기선강의 - The Java8