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);
	}
}

 

 

 

 

 

 

 

 

출처

 

 

[Java/자바] 함수적 인터페이스 java.util.function

함수적 인터페이스 자바 8부터 java.util.function 표준 API로 함수적 인터페이스가 제공되기 시작했습니다. 2022.01.20 - [Language/Java] - [Java/자바] 람다식(Lambda Expression), 함수형 인터페이스 사용법 위 글

lasbe.tistory.com

 

[Java/자바] 메소드 참조(method reference), "::" 사용법

⚡️ 메소드 참조(method reference) 람다식을 사용할 때 ::(더블 콜론)을 이용해 메소드를 실행시는 경우가 있습니다. 이러한 문법을 메소드 참조라고 하며 람다식에서 불필요한 매개변수를 제거하

lasbe.tistory.com