Caller와 Callee
- 함수가 다른 함수를 호출하는 상황
- Caller : 호출하는 함수
- Callee : 호출 당하는 함수
함수형 인터페이스
- 함수형 프로그래밍을 지원하기 위해 java 8부터 도입
- 1개의 추상 메서드를 갖고 있는 인터페이스
- 함수를 일급 객체로 사용할 수 있다.
- 함수를 변수에 할당하거나 인자로 전달하고 반환값으로 사용 가능
- Function, Consumer, Supplier, Runnable 등
- 함수형 인터페이스를 구현한 익명 클래스를 람다식으로 변경 가능
- 함수형 인터페이스는 호출한 쓰레드에서 실행된다
Type A
@Slf4j
public class A {
public static void main(String[] args) {
log.info("start main");
var result = getResult();
var nextValue = result + 1;
assert nextValue == 1;
LOGGER.info("Finish main");
}
public static int getResult(){
LOGGER.info("Start getResult");
try{
Thread.sleep(1000);
} catch (InterruptedException e){
throw new RuntimeException(e);
}
var result = 0;
try{
return result;
}finally {
LOGGER.info("Finish getResult");
}
}
- getResult를 호출하고 값을 ++ 시키고 1과 같은지 체크한다.
- 이때 1초를 sleep 후 반환하기 때문에 main함수는 최소 1초 이상의 시간이 걸리게 된다.
Type B
@Slf4j
public class B {
public static void main(String[] args) {
log.info("start main");
getResult(new Consumer<Integer>(){
@Override
public void accept(Integer integer){
var nextValue = integer + 1;
assert nextValue == 1;
}
});
log.info("Finish main");
}
public static void getResult(Consumer<Integer> cb){
log.info("Start getResult");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
throw new RuntimeException(e);
}
var result = 0;
cb.accept(result);
log.info("Finish getResult");
}
- Consumer라는 함수형 인터페이스를 인자로 넘긴다.
- result를 반환하지 않고 accept함수를 실행시킨다.
- A 에서는 main이 직접 getResult()를 호출하지만 B에서는 콜백을 통해 행위를 위임한다.
Type A
- main이 getResult의 결과에 관심이 있다.
- main은 결과를 이용해서 다음 코드를 실행한다.
Type B
- main은 getResult의 결과에 관심이 없다.
- getResult는 결과를 이용해서 함수형 인터페이스를 실행한다.
동기
- caller는 callee의 결과에 관심이 있다.
- caller는 결과를 이용해서 action을 수행한다.
비동기
- caller는 callee의 결과에 관심이 없다.
- callee는 결과를 이용해서 callback을 수행한다.
Blocking / Non-blocking
Type A
- main은 getResult()가 결과를 리턴하기 전까지 아무것도 할 수 없다.
- main은 getResult()가 완료될 때까지 대기한다.
Type B
- main은 getResult가 결과를 구하고 callback을 실행하기 전까지 아무것도 할 수 없다.
- main은 getResult가 완료될 때까지 대기한다.
Blocking
- callee를 호출한 후, callee가 완료되기 전까지 caller가 아무것도 할 수 없다.
- 제어권을 callee가 가지고 있다.
- caller와 다른 별도의 thread가 필요하지 않다.
Non-Blocking
- callee를 호출한 후, callee가 완료되지 않더라도 caller는 본인의 일을 할 수있다.
- 제어권을 caller가 가지고 있다.
- caller와 다른 별도의 thread가 필요하다.
| |
동기 |
비동기 |
| Blocking |
caller는 아무것도 할 수 없는 상태가 된다. 결과를 얻은 후 직접 처리한다. |
caller는 아무것도 할 수 없는 상태가 된다. 결과는 callee가 처리한다. |
| Non-blocking |
caller는 자기 할 일을 할 수 있다. 결과를 얻은 후 직접 처리한다. |
caller는 자기 할 일을 할 수 있다. 결과는 callee가 처리한다. |