ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 메서드 참조란?
    Java 2022. 1. 25. 00:01
    728x90

    메서드 참조란?

    메서드 참조는 람다 표현식이 단 하나의 메서드만을 호출하는 경우 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해줍니다.

     

    람다식으로 메서드를 간결하게 표현할 수 있는데 람다식을 더욱 간결하게 표현하는 방법

    (단, 람다식이 하나의 메서드만을 호출하는 경우)

     

    메서드 참조 예시

    아래의 wrapper메서드는 문자열을 정수로 반환하는 일을 합니다.

    Integer wrapper(String s) {
    	return Integer.parseInt(s);
    }

    이를 람다식으로 표현해 보겠습니다

    Function<String, Integer> f = (String s) -> Integer.parseInt(s);

     

    이를 메서드 참조로 표현해 보겠습니다

    Function<String, Integer> f = Integer::parseInt;

    메서드 참조에서 람다식의 일부가 생략되었지만, 컴파일러는 생략된 부분을 parseInt메서드의 선언부로부터, 또는 좌변의 Function 인터페이스에 지정된 지네릭 타입으로부터 쉽게 알아낼 수 있습니다.

     

     

    아래의 람다식은 BiFunction 인터페이스를 구현하여 s1, s2문자열을 비교하여 true/false를 반환하는 람다식입니다.

    BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);

     

     

    이를 메서드 참조로 표현해 보겠습니다.

    BiFunction<String, String, Boolean> f = String::equals;

    참조 변수 f의 타입인 BiFunction을 통하여 String 타입의 매개변수를 2개 받는 다른 것을 알 수 있습니다.

    따라서 람다식의 매개변수들은 없어도 됩니다.

    이때 equals라는 이름의 메서드는 다른 클래스에도 존재할 수 있기 때문에 앞에 클래스의 이름은 반드시 필요합니다.

     

    메서드 참조 사용법

    하나의 메서드만 호출하는 람다식은 '클래스 이름::메서드 이름'으로 바꿀 수 있습니다.

     

    생성자의 메서드 참조

    생성자를 호출하는 람다식도 메서드 참조로 변환할 수 있습니다.

    Supplier<MyClass> s = () -> new MyClass();	//람다식
    Supplier<MyClass> s = MyClass:new;		//메서드 참조
    
    MyClass mc = s.get();

    만약 매개변수가 있는 생성자라면, 매개변수의 개수에 따라 알맞은 함수형 인터페이스를 사용하면 됩니다.

    Function<Integer, MyClass> f = (i) -> new MyClass(i);	//람다식
    Function<Integer, MyClass> f2 = MyClass::new;		//메서드 참조
    
    BiFunction<Integer, String, MyClass> bf = (i,s) -> new MyClass(i,s);	//람다식
    BiFunction<Integer, String, MyClass> bf = MyClass::new;			//메서드 참조

     

     

    출처 

    자바의 정석 

     

    http://www.tcpschool.com/java/java_lambda_reference

     

    코딩교육 티씨피스쿨

    4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

    tcpschool.com

    https://www.youtube.com/watch?v=I55ALQndw50 

     

    댓글

Designed by Tistory.