안녕하세요
이번 시간에는 메소드 레퍼런스에 대해서 알아 보도록 하겠습니다.
1. 메소드 레퍼런스란?
2. 람다식과 비교
3. 메소드 레퍼런스 구현해보기
메소드 레퍼런스란?
메소드 레퍼런스는 Java 8에서 제공하는 기능으로, 기존에 사용되던 람다식과 동일한 기능을 갖는 간결한 표현 방법을 제공한다.
기존에는 람다식을 사용하여 기능을 구현하였지만, 메소드 레퍼런스를 사용하면 간결하게 표현할 수 있다.
- Chat Gpt-
여기서 중요한 점은 기존에 사용되던 람다식과 동일한 기능을 갖는 간결한 표현 방법이며, 람다식으로을 좀 더 편하게 표현한다는 것이다.
메소드 레퍼런스 종류는 4가지가 있다.
Kind | Syntax | Examples |
정적 메소드 참조 | ContainingClass::staticMethodName | Person::compareByAge MethodReferencesExamples::appendStrings |
특정 개체 메소드 참조 | containingObject::instanceMethodName | myComparisonProvider::compareByName myApp::appendStrings2 |
임의 객체 메소드 참조 | ContainingType::methodName | String::compareToIgnoreCase String::concat |
생상자 참조 | ClassName::new | HashSet::new |
람다식과 메소드 레퍼런스 비교
먼저 Book이라는 클래스를 만들어 두고 진행해보려고 한다.
package com.kibong.MethodReference;
public class Book {
String bookName;
public Book() {
}
public Book(String bookName) {
this.bookName = bookName;
}
public String getBookName(){
return this.bookName;
}
public static String readBook(String bookName){
return "read a " + bookName;
}
public String writeBook(String bookName){
return "write a " + bookName;
}
}
@Test
public void read(){
Book book = new Book();
//람다
UnaryOperator<String> lambdaBook = s -> book.readBook(s);
//메소드 레퍼런스
UnaryOperator<String> methodReferenceBook = book::readBook;
System.out.println(lambdaBook.apply("nania"));
System.out.println(methodReferenceBook.apply("nania"));
}
함수형 인터페이스인 UnaryOperator를 사용하여 비교 해보려고하는데
확실히 메소드 레퍼런스 쪽이 람다에 비해서 간결해 보이고 가독성이 보이는건 확실하다.
메소드 레퍼런스 구현해보기
public class MethodReferenceTest {
@Test
public void read(){
Book book = new Book();
//스태틱한 메소드 참조하기
UnaryOperator<String> staticMethod = Book::readBook;
//특정 개체 메소드 참조
UnaryOperator<String> particularMethod = book::writeBook;
//임의 객체 메소드 참조
Supplier<Book> arbitraryMethod = Book::new;
//생성자 참조
Function<String, Book> constructorMethod = Book::new;
Book arbitraryBook = arbitraryMethod.get();
Book constructorBook = constructorMethod.apply("nania");
System.out.println(staticMethod.apply("nania"));
System.out.println(particularMethod.apply("nania"));
System.out.println(arbitraryBook.getBookName());
System.out.println(constructorBook.getBookName());
//메소드 레퍼런스로 배열 순서 변갱해보기
String[] exampleList = {"kibong", "java", "good"};
Arrays.sort(exampleList, String::compareToIgnoreCase);
for (String s : exampleList) {
System.out.println(s);
}
}
}
read a nania
write a nania
null
nania
good
java
kibong
이걸 공부하면서 가장 신기했던 점은
임의 객체 매소드 참조와 생성자 참조의 코드가 같아보이는게 신기했다.
하나는 인자가 없고 하나는 인자가 존재하는데,, 어떻게 저렇게 다르게 동작하지?가 가장 신기했다.
메소드 레퍼런스를 이용하기 전에는 이걸 많이 이용할까??라고 생각했었는데 생각보다 이용했던 부분이 많이 있었다.
확실히 간결하게 코드를 정리할 수 있는 점에서는 따따봉이라고 볼 수 있다.
감사합니다.
출처 : https://www.inflearn.com/course/the-java-java8/dashboard
더 자바, Java 8 - 인프런 | 강의
자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이
www.inflearn.com
'Java > 더 자바, Java 8' 카테고리의 다른 글
Optional (0) | 2023.03.07 |
---|---|
Stream 스트림 (0) | 2023.02.28 |
Interface Default Method, Static Method 인터페이스 디폴트 메소드, 정적 메소드 (0) | 2023.02.16 |
Lambda , 람다 표현식 (0) | 2023.02.08 |
함수형 인터페이스, Functional Interface (0) | 2023.02.02 |