함수형 인터페이스


  • 람다식을 다루기 위한 인터페이스를 ‘함수형 인터페이스(functional interface)’라고 한다.
  • 단, 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약이 있다.
  • 그래야 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다.

'@ Functionallnterface' 붙이면. 컴파일러가 함수형 인터페이스를 올바르게 정의하였는지 확인해준다.

 

 

 

  • 메서드의 매개변수가 MyFunction타입이면, 이 메서드를 호출할 때 람다식을 참조하는 참조변수를 매개변수로 지정해야한다는 뜻이다.
  • 또는 참조변수 없이 직접 람다식을 매개변수로 지정하는 것도 가능하다.
  • 참조변수 f의 타입은 참조형이므로 클래스 또는 인터페이스가 가능하다. 또한 람다식과 동등한 메서드가 정의되어 있는 것이어야 한다. 그래야만 참조변수로 익명 객체(람다식)의 메서드를 호출할 수 있기 때문이다.

 

  • MyFunction인터페이스에 정의된 메서드 max()는
  • 람다식 ‘(int a, int b) -〉a 〉b ? a : b’과 메서드의 선언부가 일치한다.

 

 

 

  • 함수형 인터페이스를 정의하기 전, '@Functionallnterface'를 붙이도록 한다.
  • 안 붙여도 에러는 뜨지않으나 컴파일러가 함수형 인터페이스를 올바르게 정의하였는지 확인해준다.

 

 

  • 어노테이션을 붙인 상태에서 인터페이스에 두개이상의 추상메소드를 작성하면 에러줄이 뜬다.
  • 인터페이스는 여러개의 추상메소드를 가질 수 있으나
  • 어노테이션이 하나의 함수형 인터페이스 내에 하나의 추상메소드만 존재하는지 확인해주기 때문이다. 

 

 

  • public abstract를 생략해도 무방한 이유는 
  • 인터페이스 내 모든 메소드는 public  abstract 를 암묵적으로 가지고 있기 때문이다.  

 

 

  • 하지만 이 함수형 인터페이스 MyFunction을 구현하는 main 메소드에서는
  • max 앞에 public int를 붙여주어야 하는데 
  • 오버라이딩 규칙 중 접근제어자는 부모범위보다 더 좁게 못바꾼다는 점 때문이다. 
  • max 앞에 public int를 생략하면 default의 의미를 가지게 되어 범위가 좁아진다.

 

 

  • 람다식(익명객체)를 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다. 

 

 

  • 람다식의 매개변수와 반환타입이 함수형 인터페이스와 동일해야 한다. 

 

 

함수형 인터페이스 예제


 

 

 

 

 

 

 

 

+ Recent posts