[Java] 자바 andThen( ) / compose() / 를 function으로 알아보기.


2021-02-06


함수적 인터페이스인 Consumer, Function, Operator는 andThen과 compose라는 메서드를 가지고 있는데, 이 두 메서드는 1 번째의 처리결과를 가지고 2 번째에 전달하여 최종 결과를 얻어내는 메서드다. 오늘이 이 두 메서드의 사용법을 알아보로록 하자. (function 이 궁금하면 아래 링크를 확인하자)

 

seeminglyjs.tistory.com/210

 

[Java] 람다식 Function에 대하여 알아보자!

2020-12-28 Function 인터페이스는 apply 메서드를 가지고 있으면 매개 값과 리턴 값 모두를 가지고 있다. apply 메서드는 매개 값을 리턴 값으로 맵핑하는 역할을 하게 된다. 그러면 구체적인 사용법을

seeminglyjs.tistory.com


아래는 예제로 사용될 두개의 클래스이다. 

 

1. Info [필드 값  cm(키) ]

package andThen_Function;

public class Info {
	private int cm;
	
	public Info(int cm) {
		this.cm = cm;
	}// 생성자

	
	//// getter
	public int getCm() {
		return cm;
	}
}

2. People [필드 값  name / age / Info(클래스) ]

package andThen_Function;

public class People {
	private String name;
	private int age;
	private Info info; 
	// 클래스 Info를 필드 값으로 가진다.
	
	public People(String name, int age, Info info) {
		this.name = name;
		this.age = age;
		this.info = info;
	} // 생성자

	
	//// getter
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public Info getInfo() {
		return info;
	}
	

}

  • 실행 클래스 (andThen)

function1 : 매개값 People을 받아 Info로 리턴한다.

function2 : 매개값 Info을 받아 Integer로 리턴한다.

function3 : 매개값 People을 받아 Integer로 리턴한다.

package andThen_Function;

import java.util.function.Function;

public class main {

	public static void main(String[] args) {
		
		Function<People, Info> function1; //매개 People 리턴 Info
		Function<Info, Integer> function2; //매개 Info 리턴 Integer
		Function<People, Integer> function3; //매개 People 리턴 Integer



		function1 = (i) -> i.getInfo(); // info 클래스를 우선적으로 가져온다.
		function2 = (c) -> c.getCm(); // 이후 info 클래스의 키 정보인 cm을 가져 온다.

		function3 = function1.andThen(function2); 
		// function1의 람다식 실행후
		// function2의 람다식을 처리한다.
		int height = function3.apply(
				new People("abc", 25, new Info(200))		
				);
		System.out.println("andThen 처리결과 -> " + height);
	}

}

 

 

코드를 살펴보면, function1의 람다식은 매개 값으로 People을 전달받아 해당 People의 필드 값 Info의 정보를 리턴한다. 다음 function2의 람다식은 Info 클래스 정보를 전달받아 Info의 필드 값 인 cm(키)를 리턴한다. function2의 리턴 타입은 Integer이기 때문에 예외 없이 info의 cm을 리턴할 수 있다.

 

* 중요

자이제 여기서 function3을 눈여겨보자. 여기서 andThen이라는 메서드를 실행하게 된다. 메서드의 실행 순서는 다음과 같다.  먼저 function1을 실행하게 되고, 이후 function1의 리턴값을 function2가 전달받아 람다식으로 구현한 리턴 값을 마지막 function3에 전달하는 방식이다. 이후 int 변수 height에 function3의 apply 메서드를 통해 리턴 값을 넣어준다. (function3은 리턴값이 Integer이기 때문에 int 형 변수에 담는 것이다.) 실행 결과는 아래와 같다.

 

 

andThen 메소드를 요약하면 아래와 같을 것이다.

 

function1(매개 값, 리턴 값) -> function2(function1의 리턴 값, 리턴 값) -> function3(function2의 리턴값, 리턴 값)

 

-> int height(function3의 리턴 값)


  • 실행 클래스 (compose)

package andThen_Function;

import java.util.function.Function;

public class main {

	public static void main(String[] args) {
		
		Function<People, Info> function1; //매개 People 리턴 Info
		Function<Info, Integer> function2; //매개 Info 리턴 Integer
		Function<People, Integer> function3; //매개 People 리턴 Integer



		function1 = (i) -> i.getInfo(); // info 클래스를 우선적으로 가져온다.
		function2 = (c) -> c.getCm(); // 이후 info 클래스의 키 정보인 cm을 가져 온다.

		function3 = function2.compose(function1);
		// andThen하고 처리 순서만 다르다,
		// function1의 람다식 실행후
		// function2의 람다식을 처리한다.
		int height = function3.apply(
				new People("god", 30, new Info(100))
				);
		
		System.out.println("compose 처리결과 -> " + height);


	}

}

 

다음은 compose다 사실 andThen과 다른 점은 실행 순서만 다를 뿐 결과는 같다.

때문에 function3 = function1.andThen(function2);  에서 function1과 function2의 자리만 바꾸어 주면 된다.

function3 = function2.compose(function1); 그럼 이와 같은 코드가 된다. 실행결과는 아래와 같다.

(순서만 바꾸어주면 결과적을 실행 순서는 같다.)