티스토리 뷰
프로그래밍에서 1급 시민의 조건
1. 함수/메서드의 매개변수(parameter)로서 전달할 수 있는가
2. 함수/메서드의 반환값(return)이 될 수 있는가
3. 변수에 담을 수 있는가
● 도입
- Supplier, Consumer, BiConsumer, Predicate, Comparator를 배우며 매개변수(parameter)로서 전달되는 method에 대해 배워봤다.
- 이번에는 기존에 만들어놓은 Method를 지정할 때 사용하는 Method Reference에 대해 배워볼 것이다.
● 개념
Method Reference란?
- 기존에 이미 선언되어있는 Method를 지정하고 싶을 때
- :: 오퍼레이터 사용
- 생략이 많기 때문에 사용할 Method의 매개변수 타입과 리턴 타입을 미리 숙지해야 한다.
- 이번 글에서는 클래스의 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
링크
TAG
- Phaser3
- Advanced Stream
- OS
- SpringBoot
- 메모리
- SQL
- DART
- 빅데이터 분석기사
- MongoDB
- spring
- 알고리즘
- Phaser
- 코테
- 프로세스
- nosql
- 자료구조
- node.js
- 운영체제
- 빅데이터
- Stream
- Spring Boot
- Java8
- 프로그래머스
- API
- MySQL
- jpa
- 코딩테스트
- java
- git
- db
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함