함수형 인터페이스 Supplier<T> 인터페이스 활용

Dev. 로티·2022년 1월 22일
0

자바

목록 보기
4/9
post-thumbnail

Java8에서는 @FuncionalInterface 어노테이션을 가진 다양한 함수형 인터페이스를 제공한다.

  • Functor[T,R]
  • Consumer[T]
  • Predicate[T]
  • Supplier[T]

이중 Suppllier[T] 함수형 인터페이스에 대해 알아보도록 하자

Supplier[T] 인터페이스는 T get() 이라는 메소드 하나만 추상화 되어있다.

ex) Supplier 인터페이스를 사용한 예시

// given
Supplier<User> supplier = () -> User.of(“사용자 아이디”,”사용자 이름”);

// when
User user = supplier.get();

// then
assertEquals(user.getId(), “사용자 아이디”);
assertEquals(user.getName(), “사용자 이름”);

위 코드를 얼핏 보면

// when
User user = User.of(“사용자 아이디”,”사용자 이름”);

// then
assertEquals(user.getId(), “사용자 아이디”);
assertEquals(user.getName(), “사용자 이름”);

위 코드와 크게 차이가 없어보인다.
하지만 Supplier 함수형 인터페이스를 사용함으로써 얻을 수 있는 큰 장점이 있다.


첫번째 장점
[T의 하위 타입 인스턴스를 반환할 수 있다.]

public class AdminUser extends User {
	…
	…
}
  
.... test  

// given
Supplier<User> supplier = () -> AdminUser.of(“관리자 아이디”,”관리자 이름”);

// when
User user = supplier.get();

// then
assertTrue(user instanceOf AdminUser);
assertEquals(user.getId(), “관리자 아이디”);
assertEquals(user.getName(), “관리자 이름”);
두번째 장점 (예시가 적절하진 않지만… 이런식으로 코드 구성이 가능하다는 점에서…)
[Lazy initialize(지연 초기화)가 가능하다는 점이다.]

아래 Supplier를 사용하지 않았을 경우 User 인스턴스를 미리 초기화
시킨 후 메소드를 수행시켜야하지만,

Supplier를 통해 validation 후 User 인스턴스를 지연 초기화 시킬 수 있다.

public class UserService {
	public void save(boolean canSave, Supplier<User> supplier){
		if(canSave){
			User user = supplier.get();
			…
			return;	
		}
		throw ….
	}
}

0개의 댓글