JAVA
[JAVA] 람다식의 메서드 참조
정공자씨
2024. 5. 2. 23:23
람다식의 메서드 참조
메서드 참조란?
- 람다 표현식이 단 하나의 메서드만을 호출하는 경우에
- 매개변수, 화살표를 제거하고,
- 클래스가 메서드를 참조하는 . 기호를 :: 기호로 변환하여 사용 사용할 수 있도록 함
- 실행하려는 메서드를 참조하여 매개변수의 정보와 리턴 타입을 알아내
- 람다 표현식에서 불필요한 선언 부분(매개변수, 화살표 등)을 생략
- 이를 통해서 람다식을 더 간단히 만들 수 있음
문법
- 매개변수, 화살표를 제거하고, :: 기호를 사용하여 표현
클래스이름 :: 메서드이름
참조변수 :: 메서드 이름
메서드 참조 종류
- 어떠한 메서드를 참조하느냐에 따라, 종류가 나뉨
종류 | 람다 표현식 | 메서드 참조 |
인스턴스 메서드 참조 | (x) -> 참조변수.method(x) | 참조변수명 :: method |
정적 메서드 참조 | (x) -> 클래스명.method(x) | 클래스명 :: method |
매개변수의 메서드 참조 | (obj, x) -> obj.method(x) | 클래스명 :: method |
생성자 참조 | (x, y) -> new 클래스명(x, y) | 클래스명 :: new |
1. 인스턴스 메서드 참조
- 문자열 2개를 출력하는 Class 클래스 내의 인스턴스 메서드
- 클래스 인스턴스 생성하고
- 참조변수명 :: 메서드명으로 호출
class Class {
public void instanceMethod (String str1, String str2) {
System.out.println(str1 + str2);
}
}
public class Test {
public static void main(String[] args) {
// 클래스 인스턴스 생성
Class instance = new Class();
// instance 메서드 참조
biConsumer = (s1, s2) -> instance.instanceMethod(s1, s2); // 람다식
biConsumer = instance::instanceMethod; // 메서드 참조
biConsumer.accept("instance ", "method"); // 출력: 객체.accept(파라미터)
}
}
[ 참고 ] 함수적 인터페이스를 이용하여, 추상메서드를 정적 메서드와 인스턴스 메서드로 구현
인터페이스명 | 추상 메서드 | 설명 |
Consumer<T> | void accept(T t) | 객체 T를 받아서 소비(출력) |
BiConsumer<T, U> | void accept(T t, U u) | 객체 T, U를 받아서 소비(출력) |
2. 정적 메서드 참조
- 문자열 2개를 출력하는 Class 클래스 내의 정적 메서드
- 클래스 인스턴스 생성 없이 클래스명 :: 메서드명으로 호출
class Class {
public static void staticMethod (String str1, String str2) {
System.out.println(str1 + str2);
}
}
public class Test {
public static void main(String[] args) {
// 정적(static) 메서드 참조
BiConsumer <String, String> biConsumer;
biConsumer = (s1, s2) -> Class.staticMethod(s1,s2); // 람다식
biConsumer = Class::staticMethod; // 메서드 참조
biConsumer.accept("static ", "method"); // 출력: 객체.accept(파라미터)
}
}
3. 매개변수의 메서드 참조
- 매개변수의 메서드를 참조할 때, 메서드 참조 :: 기호 앞부분에 매개변수의 타입명을 기재함
// 람다식
(String s1) -> { s1.length(); }
string :: length
[ 예제 ]
public class Test {
public static void main(String[] args) {
Function<String, Integer> size;
// 람다식
size = (String s1) -> s1.length();
// 메서드 참조
size = String::length;
System.out.println( size.apply("Hello World") ); // 11
}
}
인터페이스명 | 추상메서드 | 설명 |
Function<T, R> | R apply(T t) | 객체 T를 객체 R로 타입 변환 |
4. 생성자 메서드 참조
// 람다식
(a, b) -> { return new 클래스명(a,b); }
클래스명 :: new
[ 예제 ]
class Student{
String name;
int age;
Student(String name, int age){
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
BiFunction <String, Integer, Student> constructor;
constructor = (name, age) -> new Student(name, age); // 람다식
constructor = Student::new; // 메소드 참조
constructor.apply("정공자", 55);
}
}
인터페이스명 | 추상 메서드 | 설명 |
BiFunction<T, U, R> | R apply(T t, U u) | 객체 T, U를 객체 R로 타입 변환 |
5. Stream에서 메서드 참조
- 람다식을 사용할 일이 많은 Stream에서 자주 볼 수 있음
public class Test {
public static void main(String[] args) {
List<String> list = Arrays.asList("A","AB","ABC","ABCD");
// 람다식 사용
list.stream()
.map(str -> str.length())
.forEach(str -> System.out.println(str)); //1,2,3,4
// 메소드 참조 사용
list.stream()
.map(String::length)
.forEach(System.out::println);
}
}
출처