-
[Java8] Method Reference (메서드 참조) - 생성 방법Java/기본 2019. 12. 28. 17:56728x90반응형
Method Reference를 이해하려면 Lambda를 먼저 이해해야한다. 여기서는 Lambda식을 Method Reference로 변경하는 방법을 다룬다.
Lambda식을 사용하다보면 IDE에서 친절하게 노란색으로 Method Reference로 바꾸지 않겠니? 하고 알려준다. 그래서 Lambda로 일단 만들고 IDE의 힘을 빌어 Method Reference로 바꾸곤 한다. 그래서 Method Reference 작성하는 원리를 정확히 모르고 사용하곤 한다.
모던 자바 인 액션 3장에 Method Reference에 대한 내용이 나오는데 내용이 좋아 정리해보았다.
Method Reference를 만드는 유형에는 다음 3가지가 있다. (p. 116)
- 정적 메서드 참조: Integer의 parseInt를 Integer::parseInt로 사용 가능
- 다양한 형식의 인스턴스 메서드 참조: String의 length 메서드를 String::length로 사용 가능
- 기존 객체의 인스턴스 메서드 참조: Transaction 객체를 할당받은 transaction 지역 변수가 있고, Transaction 객체에는 getValue 메서드가 있다면, transaction::getValue로 사용 가능
위 설명만으로는 아직 감이 잘 안온다. 예제를 좀 더 만들어서 살펴보자.
Lambda Method Reference 해당 유형 (String x) -> Integer.parseInt(x) Integer::parseInt
1 (SimpleMemberVO x) -> SimpleMemberVO.of(x) SimpleMemberVO::of 1 (Instant x) -> x.toEpochMilli() Instant::toEpochMilli 2 (Optional<BigDecimal> x) -> x.isPresent()
Optional::isPresent 2 (List<PartitionInfo> x) -> x.stream()
Collection::stream
2 (String x, String y) -> x.compareToIgnoreCase(y)
String::compareToIgnoreCase
2 (Long x) -> memberRepository.findById(x) memberRepository::findById 3 (String x) -> member.setCountry(x)
member::setCountry
3 예제를 바탕으로 다시 설명해보자면
1. 정적 메서드 참조
: 파라미터로 전달받은 변수의 메서드를 사용하지 않고, 정적 메서드의 인자로 사용됨. (String x) -> Integer.parseInt(x) 의 경우 파라미터 x를 parseInt의 인자로 사용되는 것을 볼 수 있음. x.length() 같은 행위는 하지 않음.
2. 다양한 형식의 인스턴스 메서드 참조
: 파라미터로 전달받은 변수의 메서드를 사용함. (Instant x) -> x.toEpochMilli() 의 경우 파라미터 x를 받아서 x 자신의 메서드 (toEpochMilli())를 수행함. (String x, String y) -> x.compareToIgnoreCase(y) 같이 파라미터가 2개인 경우도 가능하다.
3. 기존 객체의 인스턴스 메서드 참조
: 1번과 비슷한데 차이점이라면 정적 메서드의 인자가 아닌 기존에 이미 생성된 인스턴스의 인자로 사용 된다.
그리고 예제를 잘 보면 Lambda의 파라미터로 받은 x (혹은 x,y)들은 method reference식에서는 생략되서 나타나질 않는 것을 볼 수 있다.
세가지 유형을 Lambda에서 Method Reference로 바꾸는 방법이 그림으로 잘 나와 있어서 가져왔다(p.117). 어느정도 외우고 이해하면 IDE의 도움 없이도 정확한 규칙대로 Method Reference를 사용할 수 있을 것이다.
Constructor Reference(생성자 참조)도 Method Reference와 매우 비슷한데 간단하게만 보자면
- x -> new SmsCountryResultDTO(x)를 SmsCountryResultDTO::new와 같은 형태로 사용할 수 있다.
참고자료
반응형'Java > 기본' 카테고리의 다른 글
[Mac] 기본 JDK (JAVA_HOME) 설정하기 (0) 2021.03.25 [Java9] IO (0) 2018.05.14 [Java9] Variable Handles (1) 2018.05.02 [Java9] try-with-resources Improvement (0) 2018.04.28 Reflection 리플렉션 (0) 2018.01.21