일반적인 방법.

  1. 인터페이스를 작성한다.
  2. 인터페이스를 상속받는 class를 만들어 인터페이스에 정의된 메서드를 오버라이드 한다.

함수형 인터페이스

또한 professor의 경우 단 한번 만 사용되기에 클래스를 만들지 않고 익명 객체로 선언할 수 있다.

람다식

람다식은 근본적으로 함수형 인터페이스의 인스턴스를 생성하는 방식으로 작동한다. 이때 인스턴스의 경우 컴파일시 정의된 방법대로 생성된다.

매개변수, 반환값이 일치하면 익명 객체를 대체 할 수 있다는 람다식의 특징을 활용하면 보다 짧게 구현할 수 있는데, 다음과 같다.

실제로 언제 사용할까?

다음은 스프링에서 UserDetailService를 커스텀하여 bean으로 등록하는 과정이다.

본래라면 userDetailsService 클래스를 생성하여, loadUserByUsername를 오버라이딩하는 과정을 거쳐야 할 것이다. 이때 리턴타입이 인터페이스인 메서드는 인터페이스의 구현체를 반환해야하고, 이때 구현체는 위에서 받던 것 처럼 람다식으로 대체 할 수 있기 때문에 위와 같은 코드를 통해 간편하게 등록할 수 있다.

익명객체의 경우 재사용성이 떨어지는 것은 맞으나, 실제로 유저 정보를 반환하는 기능은 userDetails에 구현되어 있기 때문에 loadUser가 Authentication를 생성하는 과정을 제외하고 재사용될 가능성이 거의 없다는 점. 또한 config에서 한눈에 모아보기 좋다는 점 때문에 이런 방식으로 구현하는 것이 나에게 좀 더 맞다고 생각한다.