티스토리 뷰

프로그래밍에서 1급 시민의 조건
1. 함수/메서드의 매개변수(parameter)로서 전달할 수 있는가
2. 함수/메서드의 반환값(return)이 될 수 있는가
3. 변수에 담을 수 있는가

● 도입

- Supplier, Consumer, BiConsumer, Predicate, Comparator를 배우며 매개변수(parameter)로서 전달되는 method에 대해 배워봤다.

- 이번에는 기존에 만들어놓은 Method를 지정할 때 사용하는 Method Reference에 대해 배워볼 것이다.

 

 

● 개념

Method Reference란?
- 기존에 이미 선언되어있는 Method를 지정하고 싶을 때
- :: 오퍼레이터 사용
- 생략이 많기 때문에 사용할 Method의 매개변수 타입과 리턴 타입을 미리 숙지해야 한다.

출처 - The Red: 25개 백엔드 개발 필수 현업 예제를 통해 마스터하는 JAVA STREAM(fastcampus)

- 이번 글에서는 클래스의 static method를 지정할 때와 선언 된 객체의 instance method를 지정할 때를 알아볼 것이다.

[ClassName::staticMethodName]
- 클래스의 static method(정적메서드)를 지정할 때

Function<String, Integer> str2int = Integer::parseInt;
int five = str2int.apply("5");

- ClassName::staticMethodName = Integer::parseInt
- parseInt method는 Integer class에서 static method로 선언되어 있다.
[objectName::instanceMethodName]
- 이미 선언되어 있는 객체의 instance method를 지정할 때

String str = "hello";
Predicate<String> equalsToHello = str::equals;
boolean helloEqualsWorld = equalsToHello.test("world");

- objectName::instanceMethodName = str::equals
- 변수 str이 String class의 객체(instance)인 것이다.

※ 주의

Method Reference를 사용할 때는 method 이름만 사용해야한다.

- 보통 parseInt method나 equals method를 사용하면 자연스럽게 parameter를 위해 (괄호)를 쓰게 된다.

- 하지만 Method Reference에서는 해당 method를 '호출'하는게 아니라 method 자체를 '지정'하는 것이기에 (괄호)를 쓰지 않아야한다.

 

 

● 실습

1.

package com.fastcampus.functionalprogramming.chapter5;

import java.util.function.Function;
import java.util.function.Predicate;

public class Chapter5Section1 {
	public static void main(String[] args) {
		// [ClassName::staticMethodName - 클래스의 static method(정적메서드)를 지정할 때]
		/*
		 * - parseInt method는 String input 1개를 받아 Integer로 변환해 반환하는 method이다.
		 * - 따라서 이러한 특징과 맞는 Function interface를 이용하자
		 * - 뜬금없이 (Predicate<String> str2int = Integer::parseInt;) --> 이렇게 하면 안 된다는 것이다.
		 */
		Function<String, Integer> str2int = Integer::parseInt; // str2int 안에 parseInt method가 담겨있는 것이다.
		System.out.println(str2int.apply("100"));
// ===================================================================================================
		// [objectName::instanceMethodName - 이미 선언되어 있는 객체의 instance method를 지정할 때]
		/*
		 * - String이 같은지 다른지 비교할 것이기에 이에 적절한 Predicate interface를 이용하자
		 */
		String str = "hello";
		Predicate<String> equalsToHello = str::equals;
		System.out.println(equalsToHello.test("hello"));
		System.out.println(equalsToHello.test("bye"));
	}
}

 

2.

package com.fastcampus.functionalprogramming.chapter5;

import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;

public class Chapter5Section1 {
	public int subtract(int x, int y) {
		return x - y;
	}
	
	public static int multiply(int x, int y) {
		return x * y;
	}
	
	public static int calculate(int x, int y, BiFunction<Integer, Integer, Integer> operator) {
		return operator.apply(x, y);
		// BiFunction<Integer, Integer, Integer>로 지정했기에 return 타입이 Integer 이다.
		// 따라서 calculate 함수의 return에 operator.apply(x, y)를 적을 수 있다.
	}
	
	public static void main(String[] args) {
		// 1.
		// BiFunction<Integer, Integer, Integer> intSum = (x, y) -> x + y;
		// 위와 같은 식으로 BiFunction을 따로 만들지 않고 아예 argument 자리에 생성과 동시에 보내버린다.
		System.out.println(calculate(8, 2, (x, y) -> x + y));
		
		// 2.
		// 이미 만들어져 있는 static method를 지정할 때
		System.out.println(calculate(8, 2, Chapter5Section1::multiply));
		// [(x, y) -> x * y;] ==> 이게 넘어간거라고 생각하면 된다.
		// multiply method가 int 2개를 받고 int를 return 하는 형태이기에 BiFunction 형태로 넘길 수 있는 것이다.
		
		// 3.
		// 이미 만들어져 있는 instance method를 지정할 때
		Chapter5Section1 instance = new Chapter5Section1();
		System.out.println(calculate(8, 2, instance::subtract));
	}
}

 

3. this

- instance method 안에서 Method Reference를 이용해 다른 method를 지정하고 싶을 때

package com.fastcampus.functionalprogramming.chapter5;

import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;

public class Chapter5Section1 {
	public int subtract(int x, int y) {
		return x - y;
	}
	
	public static int calculate(int x, int y, BiFunction<Integer, Integer, Integer> operator) {
		return operator.apply(x, y);
	}
	
	public void myMethod() {
		// myMethod 안에서 calculate method를 호출할 것이고 이때 인자(argument)로 subtract method를 지정하고 싶다.
		// class 안에서 class의 필드를 호출할 때 this를 이용하는 것과 동일
		System.out.println(calculate(10, 30, this::subtract));
	}
	
	public static void main(String[] args) {
		instance.myMethod();
	}
}

 

'Backend > Java8' 카테고리의 다른 글

#13 Method Reference - Constructor Reference  (0) 2022.10.02
#12 Method Reference2  (0) 2022.09.24
#10 Comparator : 비교를 위한 인터페이스  (1) 2022.09.22
#9 Predicate  (1) 2022.09.21
#8 BiConsumer  (1) 2022.09.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함