⚡️ 메소드 참조(method reference)
람다식을 사용할 때 ::(더블 콜론)을 이용해 메소드를 실행시는 경우가 있습니다.
이러한 문법을 메소드 참조라고 하며 람다식에서 불필요한 매개변수를 제거하는 것이 목적입니다.
람다식에서 기존 메소드를 단순하게 호출만 하는 경우에
메소드 참조를 사용하면 불필요한 매개변수를 제거하고 '::' 기호를 사용하여 표현할 수 있습니다.
그럼 상황별로 메소드 참조 사용법을 알아보겠습니다.
📌 정적(static) 메소드와 instance 메소드 참조
우선 문자열 2개를 함께 출력하는 Chain 클래스 안에 정적 메소드와 인스턴스 메소드 2개를 선언하였습니다.
class Chain{
public static void staticChain(String s1, String s2) {
System.out.println(s1+", "+s2);
}
public void instanceChain(String s1, String s2) {
System.out.println(s1+", "+s2);
}
}
함수적 인터페이스인 Consumer를 이용해 추상 메소드를
정적 메소드와 인스턴스 메소드 각각 람다식과 메소드 참조로 구현했습니다.
// 정적(static) 메소드 참조
BiConsumer<String, String> consumer;
consumer= (s1,s2) -> Chain.staticChain(s1,s2); // 람다식
consumer = Chain::staticChain; // 메소드 참조
consumer.accept("static", "method");
Chain chain = new Chain();
// instance 메소드 참조
consumer = (s1,s2) -> chain.instanceChain(s1,s2); // 람다식
consumer = chain::instanceChain; //메소드 참조
consumer.accept("instance", "method");
함수적 인터페이스에 대한 자세한 내용은 아래를 참고해주세요.
📌 매개 변수의 메소드 참조
b를 매개 변수로 넣어 a의 인스턴스 메소드 사용하는 경우에도 메소드 참조가 가능합니다.
(a, b) -> {a.instanceMethod(b)}
a의 클래스::instanceMethod
이번에는 Bifunction을 사용해서 두 문자열이 동일한지 판별하는 예시입니다.
equals() 메소드의 클래스가 String이기 때문에 String::equals로 메소드 참조를 해주었습니다.
BiFunction<String, String, Boolean> function;
function = (s1, s2) -> s1.equals(s2); // 람다식
function = String::equals; // 메소드 참조
Boolean equal = function.apply("서울", "뉴욕"); // false
📌 생성자 참조
메소드 뿐만 아니라 생성자 또한 메소드 참조 방식으로 아래와 같이 사용이 가능합니다.
(a, b) -> {return new 클래스(a,b);}
클래스::new
이름과 전공을 멤버 변수로 갖는 학생 클래스를 선언해 주겠습니다.
생성자를 통해 학생의 이름과 전공이 매개 변수로 입력됩니다.
class Student{
String name, major;
Student(String name, String major){
this.name = name; this.major = major;
}
}
만약 여러개의 생성자가 오버로딩되어 있다면,
컴파일러가 알아서 추상 메소드 매개변수 타입과 개수가 같은 생성자를 찾아 실행시켜줍니다.
BiFunction<String, String, Student> constructor;
constructor = (name, major) -> new Student(name, major); // 람다식
constructor = Student::new; // 메소드 참조
constructor.apply("장성우", "컴공");
📌 Stream에서의 메소드 참조
사실 메소드 참조는 람다식을 사용할 일이 많은 stream에서 많이 찾아볼 수 있습니다.
그럼 스트림에서 메소드 참조가 어떻게 쓰이는지 간단하게 알아보고 글을 마치겠습니다.
List<String> list = List.of("A","AB","ABC","ABCD");
// 람다식 사용
list.stream()
.map(str -> str.length())
.forEach(str -> System.out.println(str));
// 메소드 참조 사용
list.stream()
.map(String::length)
.forEach(System.out::println);
자바 람다식, :: 사용법, 메소드 참조 사용법, 람다식 :: , stream 메소드 참조, stream ::, 스트림 :: 사용법
'Java, JSP' 카테고리의 다른 글
[JSP] 쿠키(Cookie)의 개념과 사용법 (0) | 2022.02.13 |
---|---|
[JSP] 세션(session)의 개념과 사용법 (0) | 2022.02.12 |
[Java/자바] 스트림(Stream) 사용법 (0) | 2022.01.25 |
[Java/자바] 함수적 인터페이스 java.util.function (0) | 2022.01.20 |
[Java/자바] 람다식(Lambda Expression), 함수형 인터페이스 사용법 (0) | 2022.01.20 |
댓글