TIL. 함수형 인터페이스와 람다

hyuko·2023년 4월 7일
0

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

  • 추상 메소드를 딱 하나만 들고 있는 인터페이스
  • SAM (Single Abstract Method) 인터페이스
  • @FunctionalInterface 어노테이션을 가지고 있는 인터페이스

@FunctionalInterface
public interface Run {
	void doIt();
    
    static void printName() {
    	System.out.println("batman");
    }
    
    default void printAge(){
    	System.out.println("20");
    }
}

👏🏻 주로 오해 하는 점이 있다.
위에서 말한 추상 메소드를 딱 하나만 들고 있는 인터페이스 라는 것이다.
위의 코드에서는 메소드가 총 세개가 있다. 하지만 나머지 두개인
static 메소드와 default 메소드는 추상 메소드가 아니기 때문에
위의 interface는 추상메소드가 하나 이다!

🐥 @FunctionalInterface 라는 어노테이션을 붙여주게되면
함수형 인터페이스를 정의할 일이 있을 때는 인터페이스에 이 어노테이션을
붙혀주게 되면 더 명시적으로 구분이 되고 규칙을 위반하게 되면 컴파일시에 에러가 난다.


기존의 방법

: 익명 내부 클래스를 만들어서 사용을 했다.

public class Test {
	public static void main(String[] args) {
    	Run run = new Run() {
        	@Override
            public void doIt() {
            	....
            };
        }
    }
}

Java 8 이후 람다가 나온 다음

: 람다 표현식을 이용해서 간략하게 구현이 가능해졌다.


public class Test{
	public static void main(String[] args) {
    
    	Run run  = () -> System.out.println("Hello World!");
        
        // 예를 들어 여러가지의 행동을 해야 할 경우는
        Run run = () -> {
        	System.out.println("Hello");
            System.out.println("World");
        };
        
        // 위와 같이 중괄호로 범위를 지정해주면 가능하다.
    }
}

람다 표현식

  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 사용이 될 수 있다.
  • 코드를 간단하게 줄일 수 있다.
  • 메소드 매개변수, 리턴타입, 변수로 만들어서 사용도 가능하다.

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

  • 함수를 (일급 객체)First class object로 사용할 수 있다.

일급 객체 : 간단하게 말하자면 함수를 일반 객체 처럼 운용이 가능하다라는 것이다.
변수에 할당하거나 매개변수로 준다거나 함수의 매개변수에 인자로 들어갈 수 있다는 것이다.
이렇기 때문에 람다가 return 의 값이 될 수도 있고 변수에 담아서 사용도 가능하다.

  • 고차 함수(Higher-Order Function)
    - 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수 있다. (일급 객체이기 때문에 가능)

  • 순수 함수 : 입력받은 값이 동일한 값일 때 결과가 항시 같아야 한다.
    - 사이드 이펙트가 없다.(함수 밖에 있는 값을 변경하지는 않는다)

    • 상태가 없다(함수 밖에 있는 값을 사용하지 않는다)

정리

자바에서는 함수형 프로그래밍을 할 수 있도록 제공되어진 함수형 인터페이스와 람다 표현식이 있고
굳이 함수형 프로그래밍을 안하더라도 사용을 할 수 있지만 이 두가지를 사용하게 되면
순수 함수, 불변성에 대한 고려해야할 것이 있습니다.

Reference

profile
백엔드 개발자 준비중

0개의 댓글