uju's Tech

[JAVA8:Fuctional interface] Map의 value로 method를 지정하고 싶다! 본문

Programming/Java 이모저모

[JAVA8:Fuctional interface] Map의 value로 method를 지정하고 싶다!

ujusy 2020. 6. 13. 03:38

<본 포스팅은 공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>

 

개발 중에 들어오는 서비스에 따라서 method를 다르게 불러주어야 하는 상황이 발생하였다.

 

조건 1이면 method1을 실행시켜주는 flow로 작업을 하고 싶었다.

 

두 가지 방법을 소개해보도록 하겠다!


 

첫 번째: reflection을 사용하는 방법이다.

 

Map<String, Method> methodMap = new HashMap<String, Method>(); methodMap.put("조건1", 클래스명.class.getMethod("method1")); methodMap.get(key).invoke(null);

위와 같이 put(키 이름, method명) 을 넣어주면 된다. 

 

하지만 reflection의 경우 compile error로 잡하지 않아 중요한 서비스에서 치명적일 수 있다.

 

reflection의 경우 중요한 서비스에서는 지양하는 것이 좋다고 생각한다.

 

두 번째: fuctional interace를 사용하자.

 

대표적인 3가지 함수형 인터페이스를 보면

consumer의 경우 parameter가 있으나 return이 void

supplier의 경우 parameter가 없으나 return이 존재

furnction의 경우 paramter존재하고 return이 존재.

 

현재 내가 구현하고 싶은 것은 조건에 따라서 method를 return해 주는 것이다.

 

function 인터페이스를 사용하여 구현해보도록 하겠다.

Map<String, Function<Map, Step>> methodMap;

this.methodMap = new HashMap<>();

methodMap.put(조건1, this::method1);

methodMap.put(조건2, this::method2);

 

위의 코드는 key 로  조건의 이름을 넣어주었고, value로 function을 넣어주었다.

 

this::method1을 통해 해당 메서드 레퍼런스를 직접 전달해주었다.

 

function<Map, Step> 을 해준이유는 function에 jobparameter가 들어오고 그에 따라 step을 리턴해 주기 때문에 지정해 준것이고 

 

구현하는 것에 따라 자유롭게 바꾸어주면된다. 첫번째는 자료형 두번째는 리턴해주는 형태를 지정해 준다.

 

그렇다면 map에 넣어주었으니 어떻게 조건1일 때 method1을 불러올 수 있을지 알아보자.!

 

return this.methodMap.get(조건).apply(null);

 

apply의 경우 function의 추상 메서드 이다. 자세한 것은 구글링을 통해 쉽게 알아볼 수 있다. 

 

 

Comments