invoke에 대해 알아보자

김재현·2025년 3월 12일

이번 프로젝트를 진행하면서 usecase에서 invoke를 사용하여 ViewModel에서 코드를 작성하였는데 operator(연산자)와 invoke를 처음 써봐서 한번 알아보기로 하였다.

invoke란?

  • invoke는 클래스의 인스턴스가 마치 함수인 것처럼 호출될 수 있게 하는 특수 함수입니다. 주입 가능한 생성자를 사용하여 클래스를 함수로 변환하여 주는데 이를 통해 표준 함수 호출 구문을 사용하여 ViewModel에서 usecase를 계속 호출할 수 있도록 합니다.
class LoginUseCase @Inject constructor(private val authRepository: AuthRepository) {
    suspend operator fun invoke(email: String, password: String) : Flow<String> {
        return authRepository.login(email, password)
    }
}
  • 저는 다음과 같이 로그인을 하는 usecase에서 repository를 생성자로 가지고 repository에서 login 함수를 호출하는 것으로 코드를 작성하였습니다. 다음 usecase를 ViewModel에서 다음과 같이 사용할 수 있습니다.
clase LoginViewModel(
	private val loginUseCase: LoginUseCase
): ViewModel() {

	fun login(email: String, password: String) {
    	viewModelScope.launch() {
        	val getLoginInfo = loginUseCase(email, password)
			...
        }
    }
}
  • 이렇게 LoginUseCase의 invoke 메서드를 이름을 생략하여 호출할 수 있었습니다.
    원래는 "객체명.함수명()"의 형태로 호출하여야 하지만 "객체명()" 형태로도 그 객체의 함수를 호출할 수 있다는 것이 편하고 코드의 가독성을 올려주는 것 같았습니다.

결론

  • operator fun과 invoke 키워드는 모두 연산자 오버로딩을 사용하기 위한 키워드입니다.
    (연산자 오버로딩이란 다양한 연산자들(+, -, *, / 등등)을 재정의해서 사용할 수 있게 해주는 방법이라고 생각하시면 됩니다. )

  • 코드의 간결함과 가독성을 높여주고 호출의 유연성이 생깁니다.
    (loginUseCase() vs loginUseCase.invoke)

.
.
.

참고

https://onlyfor-me-blog.tistory.com/837

https://velog.io/@spdlqjfire/Kotlin-invoke

0개의 댓글