자바/자바 입문 공부일지

자바 기초 공부 일지 49. 메소드 참조 (작성 수정중)

Tomitom 2022. 11. 7. 09:21
반응형

 

 

람다는 이전에 배운 것으로 그 자체로 다른 메소드 안에서 매개변수로 참조될 수도 있다는 것을 알았습니다. 

 

https://blue-dot.tistory.com/96

 

자바 기초 공부 일지 46. 람다lambda

람다에 대한 이해를 위해 기본형과 익명 클래스 사용과 람다의 사용을 작성해볼게요. 기본 클래스 익명 클래스 람다 interface Printable { void print(String s); } class Printer implements Printable { public void print(

blue-dot.tistory.com

일부 람다식을 메소드 참조로 대신하게 하거나

기본적으로 람다식보다 조금 더 코드를 단순하게 하기 위해서 메소드 참조를 사용합니다. 

메소드 참조method reference는 람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다 표현식에서 중복됨으로써 불필요한 매개변수를 생략하고 사용할 수 있게 해줍니다. 

 

메소드 참고의 유형은 다음과 같습니다. 

 

• static 메소드의 참조

참조변수를 통한 인스턴스 메소드 참조

클래스 이름을 통한 인스턴스 메소드 참조

생성자 참조

 

● 우선 static 메소드 참조를 살펴볼게요. 

Collections 클래스의 reverse 메소드 기반 예제를 보겠습니다. 

public static void reverse(List<?> list) // 저장 순서를 뒤집는다. (리버스한다.) 

 

class ArrangeList {

   public static void main(String[] args) {

      List<Integer> ls = Arrays.asList(1, 3, 5, 7, 9);

      ls = new ArrayList<>(ls);

     

      Consumer<List<Integer>> c = l -> Collections.reverse(l);   // reverse 메소드 호출 중심의 람다식

      c.accept(ls); // 순서 뒤집기 진행

      System.out.println(ls); // 출력

   }

}

 

붉은색 글자로 표기된 부분에서 l 이라고 하는 인자가 중복이 됨을 알 수 있습니다. 

여기에서 accept 메소드를 호출할 때 전달되는 인자가 reverse 메소드에서 호출하면서 

그대로 전달된다는 것에 근거하여 ( 같은 l 인자 ) 다음과 같이 수정이 가능합니다. 

 

수정 전 Consumer<List<Integer>> c = l -> Collections.reverse(l);
수정 후 Consumer<List<Integer>> c = Collections : : reverse;

 

즉 불필요하게 중복되는 매개변수를 제거하고 다음과 같이 ' :: ' 기호를 사용하여 표현합니다. 

클래스이름::메소드이름

또는

참조변수이름::메소드이름

 

다음은 두 개의 값을 전달받아 제곱 연산을 수행하는 Math 클래스의 클래스 메소드 pow() 메소드를 호출하는 람다식입니다. 보다 더 간결하게 표현이 가능합니다. 

 

수정 전 (base, exponent) -> Math.pow(base, exponent);
수정 후 Math::pow;

 

또한 인스턴스의 메소드를 참좋라 때에도 참조 변수의 이름을 통해 메소드를 참조할 수 있습니다.

 

MyClass obj = new MyClass;

Function<String, Boolean> func = (a) -> obj.equals(a); // 람다 표현식
Function<String, Boolean> func = obj::equals(a);       // 메소드 참조
 
 
●이하 내용 수정중  
반응형